Pulse is a hierarchical hashing index designed for disaggregated memory (DM); it leverages one-sided RDMA verbs to achieve efficient indexing operations. Pulse introduces three core techniques to overcome traffic amplification and high insertion latency in DM:
-
Multi-level index structure for fine-grained directory synchronization, reducing traffic during concurrent insertions.
-
Predictor-assisted resizing that maintains partial hashed keys in memory pools to guide item relocation without extra RTTs.
-
RTT-optimized batching using doorbell batching with selective signaling to accelerate insertions and updates.
For more details, please refer to our paper:
[HPCA'26] Pulse: Fine-Grained Hierarchical Hashing Index for Disaggregated Memory. Guangyang Deng, Zixiang Yu, Zhirong Shen, Qiangsheng Su, Zhinan Cheng and Jiwu Shu.
Pulse follows a disaggregated memory architecture with clear separation between storage and computation:
pulse/
├── memory_pool/ # Memory Pool
│
├── compute_pool/ # Compute Pool
│
├── core/ # Core Implementation
│ └── pulse/ # Pulse hierarchical hashing index
│
├── workload/ # Workload Implementations
│ ├── pulse/ # Pulse workload definition
│ └── config/ # Shared workload configuration types
│
├── scripts/ # Management Scripts
│
└── config/ # Configuration Files
- A cluster environment with RDMA-capable network interfaces
- Memory node: The node that hosts the memory pool server
- Compute nodes: The nodes that execute workload operations
Clone the Pulse repository and navigate to the project directory:
git clone https://github.com/syslucas/pulse
cd pulseDownload and extract YCSB (Yahoo! Cloud Serving Benchmark) for workload generation:
curl -O --location https://github.com/brianfrankcooper/YCSB/releases/download/0.17.0/ycsb-0.17.0.tar.gz
tar xfvz ycsb-0.17.0.tar.gzThis will create the ycsb-0.17.0/ directory in the project root.
Edit scripts/settings.sh to configure your cluster environment. All script operations should be performed on the memory node.
-
YCSB Data Path (
DATA_PATH_BASE):- Automatically set to
${BASE_DIR_PREFIX}/ycsb_output - This is where generated workload data files will be stored
- You can modify the base path if needed
- Automatically set to
-
Log Directory (
LOG_DIR):- Automatically set to
${BASE_DIR_PREFIX}/logs - Execution logs from compute nodes will be collected here
- Automatically set to
-
Compute Nodes (
COMPUTE_NODES):- Configure the list of compute nodes in the format
username@ip_address - Example:
COMPUTE_NODES=("user@192.168.1.2" "user@192.168.1.3")
- Configure the list of compute nodes in the format
-
Memory Node (
MEMORY_NODE_IP,MEMORY_NODE_PORT,MEMORY_NODE_META_PORT):- Set the memory node IP address
- Configure RDMA port and metadata port numbers
-
SSH Port (
SSH_PORT):- Configure the SSH port for remote operations (default: 2222)
Important Note: All scripts in the scripts/ directory are designed to run on the memory node only. The scripts handle cross-machine communication and remote execution automatically, so you don't need to manually run anything on compute nodes.
All following steps should be executed on the memory node. Replace $MACHINE_NUM with the actual number of compute nodes you want to use (e.g., 1, 2, or 4).
Generate YCSB workload data files and perform preprocessing:
./scripts/generate_ycsb_workloads.shThis script will:
- Generate workload files for different request distributions (zipfian, uniform)
- Create load and run workloads with various operation counts
- Post-process and format the generated data files
- Split data for multi-node configurations (2-node, 4-node)
- Output files will be stored in
${DATA_PATH_BASE}/1-node/<distribution>/and split into${DATA_PATH_BASE}/<n>-node/<distribution>/directories (where<n>is the number of nodes)
Note: This step can be time-consuming depending on the workload size. Ensure you have sufficient disk space before running.
Distribute the generated YCSB workload data to compute nodes:
./scripts/cluster_communication.sh ycsb_broadcast $MACHINE_NUMOr specify a specific dataset path:
./scripts/cluster_communication.sh ycsb_broadcast $MACHINE_NUM 4-node/zipfianThis will copy the YCSB data directory to all compute nodes specified in settings.sh. The data will be placed in the same path on each compute node as configured in DATA_PATH_BASE.
Distribute the source code to compute nodes and build the project on each node:
./scripts/cluster_communication.sh source_broadcast $MACHINE_NUMThis script will:
- Copy the entire project directory to each compute node
- Build the project using
./scripts/debug.shon each compute node - Ensure all compute nodes have the latest code compiled and ready
Execute the Pulse experiments:
./scripts/ex.sh pulseThis will:
- Start the memory pool server on the memory node
- Launch compute nodes to execute the Pulse workload
- Wait for all compute nodes to finish execution
The experiment configuration (thread numbers, coroutine counts, etc.) can be modified in scripts/ex.sh before running.
Note: Make sure huge pages are enabled on the memory node before running experiments. You can use ./scripts/hugepage.sh if needed.
After experiments complete, collect logs from all compute nodes:
./scripts/cluster_communication.sh log_gather $MACHINE_NUM /path/to/your/logs_collectReplace /path/to/your/logs_collect with your desired local target directory. This will:
- Collect logs from each compute node's
LOG_DIR(configured insettings.sh) - Store logs in separate subdirectories for each node in the target directory
- Organize logs by node for easy analysis
The log directory structure will be:
/path/to/your/logs_collect
├── user@192.168.6.2/
│ └── [log files]
├── user@192.168.6.3/
│ └── [log files]
└── ...
This project builds on the RDMA framework from FORD [FAST'22], and we thank the authors for open-sourcing it.