This repository contains the artifact for the paper "TierScape: Harnessing Multiple Compressed Tiers to Tame Server Memory TCO" published at EuroSys 2026.
TierScape can be evaluated in two configurations:
- Without kernel patches - Multiple byte-addressable tiers (default kernel)
- With kernel patches - Multiple byte-addressable tiers + compressible tiers
This artifact evaluation demonstrates both configurations, with kernel patches being required only if you want to enable compressible tiers. For basic functionality with multiple byte-addressable tiers, the default kernel is sufficient.
Result reproducibility: The system used in the paper has DRAM and Intel Optane memory tiers. To repdoduce the performance results, Optane memory is a must (as it is a much slower memory compared to DRAM).
The artifact default setting is designed for a system with atleast 2 NUMA nodes. It will use NUMA node 0 as the fast memory tier and NUMA node 1 as the slow memory tier. This can be changed (see TBD) Verify your system's NUMA topology:
@ numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 ...
node 0 size: 769637 MB
node 0 free: 754897 MB
node 1 cpus: 36 37 ...136 137 138
node 1 size: 771044 MB
node 1 free: 711993 MB
node distances:
node 0 1
0: 10 21
1: 21 10
There are few other configurations required. In '<root_dir>/skd_daemon/skd_config.sh' change the following variables as per your system:
# Change these============
FAST_NODE="0"
SLOW_NODE="1"
# path to perf binary as per the system
PERF_BIN="/data/sandeep/idxd/tools/perf/perf"
# ====================
For initial testing and basic functionality, you can use the default kernel:
TierScape includes comprehensive MASIM experiments to evaluate different tiering strategies. Follow these steps:
cd <root dir of repo>
make setup # Sets up the environment and dependencies
make build_masim # Builds the MASIM simulator
make test_masim # Tests MASIM with sample configuration
You can run specific tiering experiments:
# Baseline (no tiering)
make tier_masim_baseline
# HeMem tiering strategy
make tier_masim_hemem agg_mode=0 # 0 conservating 1 moderate 2 aggressive
# ILP-based tiering strategy
make tier_masim_ilp agg_mode=0 # 0 conservating 1 moderate 2 aggressive
# Waterfall tiering strategy
make tier_masim_waterfall agg_mode=0 # 0 conservating 1 moderate 2 aggressive
To run all experiments sequentially:
## This will execute all four tiering strategies (baseline, hemem, ilp, waterfall) in sequence.
make tier_masim_all agg_mode=0 # 0 conservating 1 moderate 2 aggressive
See Understanging the results section to interpret the results.
TierScape also supports memcached workloads using memtier_benchmark for realistic evaluation.
# Install memcached server
make install_memcached
# Install memtier_benchmark (if not already installed)
make install_memtier_benchmark
- The system needs sufficient memory for the 40GB dataset
- Make sure no other processes are using port 11211
- Start memcached and load data:
make start_memcached # Starts memcached server
make load_memcached # Loads 40GB dataset with 4K objects
- Run individual memcached tiering experiments:
# Baseline (no tiering)
make tier_memcached_memtier_baseline
# HeMem tiering strategy
make tier_memcached_memtier_hemem agg_mode=0 # 0 conservating 1 moderate 2 aggressive
# ILP-based tiering strategy
make tier_memcached_memtier_ilp agg_mode=0 # 0 conservating 1 moderate 2 aggressive
# Waterfall tiering strategy
make tier_memcached_memtier_waterfall agg_mode=0 # 0 conservating 1 moderate 2 aggressive
- Run all memcached experiments:
make tier_memcached_memtier_all agg_mode=0 # 0 conservating 1 moderate 2 aggressive
$ cd <root dir of repo>
$ git clone https://github.com/torvalds/linux.git --branch v5.17 --depth 1
$ cd linux
$ git am ../linux_patch/0001-tierscape-eurosys26.patch
Verify the patches are applied:
$ git log
commit 8d955619e152eabd14acefa19c4c819c053cf96a (HEAD -> tierscape)
Author: Sandeep Kumar <[email protected]>
Date: Tue Sep 2 04:48:30 2025 +0530
tierscape eurosys26
commit f443e374ae131c168a065ea1748feac6b2e76613 (grafted, tag: v5.17)
Author: Linus Torvalds <[email protected]>
Date: Sun Mar 20 13:14:17 2022 -0700
Linux 5.17
Signed-off-by: Linus Torvalds <[email protected]>
$ cp tierscape_config .config
$ make -j $(nproc)
## Select default values for any new options
$ sudo make modules_install -j $(nproc)
$ sudo make install -j $(nproc)
sudo reboot
After reboot, verify the new kernel is active:
$ uname -r
5.17.0-ntier-noiaa-v1+
$ cd <root dir of repo>
$ make ntier_setup
Using ZRAM
Removing zram
Setting up zram
FAST_NODE: 0
SLOW_NODE: 1
Disabling the prefetching
kernel.zswap_print_stat = 1
[ 3904.686103] zswap: Looking for a zpool zsmalloc zstd 0
[ 3904.686104] zswap: It looks like we already have a pool. zsmalloc zstd 0
[ 3904.686104] zswap: zswap: Adding zpool Type zsmalloc Compressor zstd BS 0
[ 3904.686105] zswap: Total pools now 4
[ 3904.686117] zswap: Looking for a zpool zsmalloc lzo 0
[ 3904.686118] zswap: using existing pool zsmalloc lzo 0
[ 3904.686125] zswap: ..
Request for a new pool: pool and compressor is zsmalloc lzo backing store value is 0
[ 3904.686125] zswap: Looking for a zpool zsmalloc lzo 0
[ 3904.686126] zswap: It looks like we already have a pool. zsmalloc lzo 0
[ 3904.686126] zswap: zswap: Adding zpool Type zsmalloc Compressor lzo BS 0
[ 3904.686126] zswap: Total pools now 4
[ 3904.686745]
------------
Total zswap pools 4
[ 3904.686747] zswap: Tier CData pool compressor backing Pages isCPUComp Faults
[ 3904.686749] zswap: 0 0 zsmalloc lzo 0 0 true 0
[ 3904.686751] zswap: 1 0 zsmalloc zstd 0 0 true 0
[ 3904.686752] zswap: 2 0 zsmalloc zstd 1 0 true 0
[ 3904.686753] zswap: 3 0 zbud zstd 0 0 true 0
Rebuild TierScape with kernel patches enabled:
$ cd <root dir of repo>
$ make setup ENABLE_NTIER=1
Run MASIM or memcached experiments as described in the Quick Start section.
The results will be saved in the dir witn suffix _EN1
indicating kernel patches are enabled.
After running experiments, results are stored in the following locations:
- Performance Data: Results are stored in
evaluation/
directories
The experiments generate data comparing different tiering strategies:
- Baseline (-1): No tiering, all data in single tier
- HeMem (0): HeMem-based tiering algorithm
- ILP (1): Integer Linear Programming-based optimal tiering
- Waterfall (2): Waterfall-based tiering strategy
Example: perflog-ILP-F10000-HT.9-R0-PT2-W5-20250909-200453
Breakdown of the dir name:
perflog
: Prefix indicating performance logsILP
: Tiering strategy used (Baseline, HeMem, ILP, Waterfall)F10000
: PEBS frequency (10000)HT.9
: Hotness threshold (0.9)R0
: Remote mode (0 disabled 1 enabled)PT2
: Number of push threads to move data aroundW5
: Profile window in seconds20250909-200453
: Timestamp of the experiment run
Exmplae: perflog-WATERFALL-F10000-HT25-PT2-W5-20250909-195830
Breakdown of the dir name:
perflog
: Prefix indicating performance logsWATERFALL
: Tiering strategy used (Baseline, HeMem, ILP, Waterfall)F10000
: PEBS frequency (10000)HT25
: Hotness threshold (25 percentile)PT2
: Number of push threads to move data aroundW5
: Profile window in seconds20250909-195830
: Timestamp of the experiment run
Similarly for hemem.
After runing each experiments, there will be plot directory created inside the experiment directory.
plot_numastat_numa_nodes.png
: NUMA distribution of memory usage over timeplot_psi.png
: Pressure Stall Information over timeplot_regions_curr_tier.png
: The current tier distribution of memory regions over time as seen by Tierscapeplot_regions_curr_tier_sorted.png
: The current tier distribution of memory regions over time as seen by Tierscape (sorted by hotness)plot_regions_dst_tier.png
: The destination tier distribution of memory regions over time as seen by Tierscapeplot_regions_dst_tier_sorted.png
: The destination tier distribution of memory regions over time as seen by Tierscape (sorted by hotness)plot_regions_hotness.png
: The hotness distribution of memory regions over time as seen reported by PEBSplot_stacked_tco_sep.png
: Stacked TCO breakdown over timeplot_stacked_zswap_usage.png
: Stacked zswap usage breakdown over timeplot_zswap_faults.png
: zswap faults over timeplot_zswap_nr_compressed_size.png
: zswap compressed size over timeplot_zswap_nr_pages.png
: zswap number of pages over timestatus_VmRSS.png
: Resident Set Size over timevmstat_pgmigrate_success.png
: Successful page migrations over time
TODO