- we propose a B+-tree variant named μTree to achieve both high throughput and low tail latency. It incorporates a shadow list-based layer to the leaf nodes of a B+-tree to gain benefits from both list and tree data structures. The list layer in PM is exempt from the structural refinement operations since list nodes in the list layer own separate PM spaces, which are organized in an element-based way. Meanwhile, μTree still gains the locality benefit from the tree-based nodes. To alleviate the interference overhead, μTree coordinates the concurrency control between the tree and list layer, which moves the slow PM accesses out of the critical path.
- This repo consists of three parts:
- Single Thread Evaluation
- Multiple Thread Evaluation
- Key-Value Store Evaluation
- uTree use a
tail pointer
to allocate space in PM, while other indexes allocate space in PM with PMDK.
- gcc: 7.5.0
- CMake: 3.10.2
- pmdk-tools: 1.4.1
- ipmctl: 02.00.00.3545
- ndctl: 66
- automake: 1.15.1
- autoconf: 2.69
- bzip2: 1.0.6
- Set Optane DCPMM to
App-Direct
mode
$ ipmctl create -f -goal persistentmemorytype=appdirect
- Create namespace
$ ndctl create-namespace --mode=devdax -f
- If use PMDK, set mode of namespace to
fsdax
, assume step 2 created a namespace named "namespace1.0"
$ ndctl create-namespace -e namespace1.0 --mode=fsdax -f
- Format current AEP device and mount it to the corresponding location (i.e. ./mount/pmem0), assume step 3 create an AEP device /dev/pmem0
$ mkfs.ext4 /dev/pmem0
$ mount -o dax /dev/pmem0 ./mount/pmem0
- In single thread evaluation, we implemented wB+-Tree, NV-Tree, FAST&FAIR, FPTree and Skip List (a persistent version). Note that the single-thread version of FPTree and NV-Tree have also been implemented by Liu et al., you can also refer to their code accordingly.
- For uTree, wB+-Tree, FAST&FAIR and Skip List, after entering the related folder, compile with
build.sh
and run tests withrun.sh
,main.cpp
is the single-thread test program.
$ ./build.sh
$ ./run.sh
- Liu et al's implementation is placed under
RNTree/
, their single-thread test programs are placed underRNTree/test/
, execute the following commands. Remember to bind cpu properly to avoid cross-NUMA accessing.
$ mkdir build
$ cd build
$ cmake ..
$ make
$ ../run.sh
- In multiple thread evaluation, we compare μTree with FAST&FAIR and FPTree under different update ratio and skewness.
- skewness is set via
kZipfianConst
inzipfian.h
.main-gu-zipfian.c
is the test program. There are several important options:
-t: Number of threads
-i: Number of elements to insert before test
-d: Test duration in milliseconds
-u: Percentage of update transactions
- After entering the corresponding dirctory, compile with
build.sh
and run tests withrun.sh
.
$ ./build.sh
$ ./run.sh
- We use Redis, an in-memory key-value store to evaluate μTree in real-world environments. Redis is modified to support multi-thread execution, and we replace its storage engine with our index structures.
- Execute the following commands. Remember to modify
src/Makefile
beforemake
to add funcForC.o to compilation.
$ cd vire
$ autoreconf -fvi
$ ./configure --enable-debug=full
$ cd src/
$ ./build_funcForC.sh
$ cd ../
$ make
$ ./run.sh
- Youmin Chen: [email protected]
- Youyou Lu: [email protected]
- Kedong Fang: [email protected]
- Qing Wang: [email protected]
- Jiwu Shu: [email protected]
For more NVM-related research, please check out our publication list at Storage Research Group @Tsinghua University .
If you are using uTree for your work, please cite:
Youmin Chen, Youyou Lu, Kedong Fang, Qing Wang, Jiwu Shu. uTree: a Persistent B+-Tree with Low Tail Latency.
PVLDB, 13(11): 2634-2648, 2020. DOI: https://doi.org/10.14778/3407790.3407850