Published October 2, 2023 | Version v2
Software Open

libpuddles

Creators

Description

Artifact for Eurosys 2024

----

Puddles: Application-Independent Recovery and Location-Independent Data for Persistent Memory

Puddles is a new persistent memory programming abstraction that provides support for PM data that is easily mappable into a process address space, shareable across processes, shippable between machines, consistent after a crash, and accessible to legacy code with fast, efficient pointers as first-class abstractions.

Requirements

  1. Ubuntu 20.04 with no existing PMDK installation[^1]
  2. g++ and gcc version 10
  3. clang and clang++ version 10
  4. libboost-system-dev
  5. libarchive-dev
  6. cmake
  7. make
  8. Intel Optane DC-PMM mounted at /mnt/pmem0/
  9. Root access

Evaluation

Using Docker Containers

The artifact can be run inside a docker container but needs access to host's /mnt/pmem0 and /dev/shm.

# Build the docker image and the artifact
docker build -t libpuddles .

# Start the docker container
docker run --privileged  -v /mnt/pmem0/:/mnt/pmem0 --ipc=host -it libpuddles:latest

# Run evaluation from inside the docker container
./setup-and-run.sh --skip-deps

Access to an Optane DC-PMM Docker Container

If needed, we can provide an empty docker container with access to Intel Optane DC-PMM. Please contact the authors for the login information. Instructions for running in an empty docker container are the same as evaluating the artifact on a bare metal machine (see next section).

Using a Bare Metal Machine

To set up dependencies and run the benchmark, execute the following script:

./setup-and-run.sh

NOTE: To skip dependency installation, the setup-and-run.sh script can be passed an optional --skip-deps argument:

./setup-and-run.sh --skip-deps  # Run evaluation only

Although libpuddles is automatically compiled by this script, to manually compile it, checkout artifact-root/libpuddles/README.md.

Major Claims

The artifact provided reproduces the following claims from the paper:

  1. Figure 9. Puddles’ performance against PMDK and Romulus for singly linked list.
  2. Figure 10. Performance of Puddles, PMDK, and Romulus’s implementation of an order 8 Btree.
  3. Figure 11. KV Store implementation using different PM programming libraries, evaluated using YCSB workloads.

Artifact Directory Structure

artifact
├── libpuddles
│   ├── src                # Libpuddles src and Implementation
│   └── eval
│       ├── go             # GoPMEM Implementation
│       ├── atlas          # Atlas KVStore Implementation
│       └── romulus        # Romulus's KVStore Implementation
├── libpuddles-scripts
│   └── run                # Evaluation scripts
├── OneFile-romulus        # Romulus LinkedList and Tree Implementations
│   └── ...
├── setup-and-run.sh       # Main script
├── requirements.txt       # Requirements file for python dependencies
├── plot-fig-10.py         # Plot Figure 10, called from setup-and-run.sh
├── plot-fig-9.py          # Plot Figure 9, called from setup-and-run.sh
└── plot-fig-11.py         # Plot Figure 11, called from setup-and-run.sh

Notes on libpuddles-scripts/run/*.sh Scripts

Each of these scripts automatically starts an instance of the puddle daemon (puddled), cleans up any persistent files, and runs a specific workload.

These scripts, however, rely on certain environment variables:

  1. LIBPUDDLES_PUDDLED_PORT: Port to use for the puddled daemon
  2. LIBPUDDLES_DIR: Directory with libpuddles' source (artifact-root/libpuddles for this artifact)
  3. ROMULUS_DIR: Directory with Romulus's source (artifact-root/OneFile-romulus for this artifact)

Execution Flow (setup-and-run.sh)

The setup-and-run.sh script automatically runs the following steps:

  1. Setup the environment variables:
    1. LIBPUDDLES_PUDDLED_PORT
    2. LIBPUDDLES_DIR
    3. ROMULUS_DIR
  2. Install all dependencies.
  3. Compile all sources.
  4. Enable userfaultfd:
    echo 1 | sudo tee /proc/sys/vm/unprivileged_userfaultfd
    
  5. Run libpuddles-scripts/run/linkedlist.sh and write results to libpuddles-scripts/data/linkedlist.csv.
  6. Plot Figure 9 using linkedlist data and write to plots/ae/fig9.pdf and plots/ae/fig9.pdf
  7. Run libpuddles-scripts/run/btree.sh and write results to libpuddles-scripts/data/btree.csv.
  8. Plot Figure 10 using btree data and write to plots/ae/fig10.pdf and plots/ae/fig10.pdf
  9. Run libpuddles-scripts/run/simplekv.sh and write results to libpuddles-scripts/data/simplekv.csv.
  10. Plot Figure 11 using simplekv data and write to plots/ae/fig10.pdf and plots/ae/fig11.pdf

[^1]: To uninstall existing PMDK installation, please remove the apt-get version (if installed) using sudo apt-get purge 'libpmem*' and source compiled version cd pmdk-directory; sudo make uninstall.

Files

Files (552.0 MB)

Name Size Download all
md5:8146c9d75560f4c63883210ce220d29c
552.0 MB Download