Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory. This artifact provides the source code of CHIME and scripts to reproduce all the experiment results in our paper. CHIME, a Cache-efficient and High-performance Hybrid Index on disaggregated MEmory, combines the B+ tree with hopscotch hashing, to break the trade-off between cache consumption and read amplifications for existing DM range indexes.

Supported Platform

We strongly recommend you to run CHIME using the r650 instances on CloudLab as the code has been thoroughly tested there. We haven't done any test in other hardware environment.

If you want to reproduce the results in the paper, 10 r650 machines are needed; otherwise, fewer machines (i.e., 3) is OK. Each r650 machine has two 36-core Intel Xeon CPUs, 256 GB of DRAM, and one 100 Gbps Mellanox ConnectX-6 RNIC. Each RNIC is connected to a 100 Gbps Ethernet switch.

Create Cluster

Follow the steps below to create an experimental cluster with 10 r650 nodes on CloudLab:

  1. Log into your own account.

  2. Click Experiments|-->Create Experiment Profile. Upload ./script/cloudlab.profile provided in this repo. Input a file name (e.g., CHIME) and click Create to generate the experiment profile for CHIME.

  3. Click Instantiate to create a 10-node cluster using the profile (This takes about 7 minutes).

  4. Try logging into and check each node using the SSH commands provided in the List View on CloudLab. If you find some nodes have broken shells, you can reload them via List View|-->Reload Selected.

Source Code (Artifacts Available)

Now you can log into all the CloudLab nodes. Using the following command to clone this github repo in the home directory (e.g., /users/TempUser) of all nodes:

git clone https://github.com/dmemsys/CHIME.git

Environment Setup

You have to install the necessary dependencies in order to build CHIME. Note that you should run the following steps on all nodes you have created.

  1. Set bash as the default shell. And enter the CHIME directory.

    sudo su
    chsh -s /bin/bash
    cd CHIME
  2. Install Mellanox OFED.

    # It doesn't matter to see "Failed to update Firmware"# This takes about 8 minutes
    sh ./script/installMLNX.sh
  3. Resize disk partition.

    Since the r650 nodes remain a large unallocated disk partition by default, you should resize the disk partition using the following command:

    # It doesn't matter to see "Failed to remove partition" or "Failed to update system information"
    sh ./script/resizePartition.sh
    # This takes about 6 minutes
    reboot
    # After rebooting, log into all nodes again and execute:
    sudo su
    resize2fs /dev/sda1
  4. Enter the directory. Install the required libraries.

    cd CHIME
    # This takes about 3 minutes
    sh ./script/installLibs.sh

YCSB Workloads

You should run the following steps on all nodes.

  1. Download YCSB source code.

    sudo su
    cd CHIME/ycsb
    curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.11.0/ycsb-0.11.0.tar.gz
    tar xfvz ycsb-0.11.0.tar.gz
    mv ycsb-0.11.0 YCSB
  2. We first generate a small set of YCSB workloads here for a quick start (i.e, kick-the-tires).

    # This takes about 20 seconds
    sh generate_small_workloads.sh

Getting Started (Artifacts Functional)

  • Hugepages setting on all nodes (This step should be re-execute every time you reboot the nodes).

    sudo su
    echo 36864 > /proc/sys/vm/nr_hugepages
    ulimit -l unlimited
  • Return to the root directory of CHIME and execute the following commands on all nodes to compile CHIME:

    mkdir build;cd build; cmake ..; make -j
  • Execute the following command on one node to initialize the memcached:

    /bin/bash ../script/restartMemc.sh
  • Execute the following command on all nodes to split the workloads:

    python3 ../ycsb/split_workload.py <workload_name><key_type><CN_num><client_num_per_CN>
    • workload_name: the name of the workload to test (e.g., a / b / c / d / e).
    • key_type: the type of key to test (i.e., randint).
    • CN_num: the number of CNs.
    • client_num_per_CN: the number of clients on each CN.

    Example:

    python3 ../ycsb/split_workload.py a randint 10 24
  • Execute the following command on all nodes to conduct a YCSB evaluation:

    ./ycsb_test <CN_num><client_num_per_CN><coro_num_per_client><key_type><workload_name>
    • coro_num_per_client: the number of coroutine in each client (2 is recommended).

    Example:

    ./ycsb_test 10 24 2 randint a
  • Results:

    • Throughput: the throughput of CHIME of the whole cluster will be shown in the terminal of the first node (with 10 epoches by default).

    • Latency: execute the following command on one node to calculate the latency results of the whole cluster:

      python3 ../us_lat/cluster_latency.py <CN_num><epoch_start><epoch_num>

      Example:

      python3 ../us_lat/cluster_latency.py 10 1 10

Reproduce All Experiment Results (Results Reproduced)

We provide code and scripts in ./exp folder for reproducing our experiments. For more details, see ./exp/README.md.

Paper

If you use CHIME in your research, please cite our paper:

@inproceedings{chime2024,
author = {Xuchuan Luo and Jiacheng Shen and Pengfei Zuo and Xin Wang and Michael R. Lyu and Yangfan Zhou},
title = {{CHIME}: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory},
booktitle = {Proceedings of the 30th Symposium on Operating Systems Principles ({SOSP} 2024)},
year = {2024},
address = {Austin, TX},
pages = {110--126},
url = {https://doi.org/10.1145/3694715.3695959},
publisher = {{ACM}},
month = nov,
}

Acknowledgments

This repository adopts Sherman's codebase and SMART's RDWC technique. We really appreciate it.

About

This is the implementation repository of our SOSP'24 paper: CHIME: A Cache-Efficient and High-Performance Hybrid Index on Disaggregated Memory.

Topics

Resources

Stars

27 stars

Watchers

2 watching

Forks

Contributors

Languages