zwal

ZWAL : Rethinking Write-ahead Logs for ZNS SSDs (SIGOPS OSR'24 and CHEOPS'24)

https://github.com/stonet-research/zwal

Science Score: 26.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (12.1%) to scientific vocabulary

Keywords

lsm-tree wal zns
Last synced: 6 months ago · JSON representation

Repository

ZWAL : Rethinking Write-ahead Logs for ZNS SSDs (SIGOPS OSR'24 and CHEOPS'24)

Basic Info
Statistics
  • Stars: 11
  • Watchers: 3
  • Forks: 3
  • Open Issues: 1
  • Releases: 0
Topics
lsm-tree wal zns
Created about 2 years ago · Last pushed 10 months ago
Metadata Files
Readme License Citation

README.md

ZWAL : Rethinking Write-ahead Logs for ZNS SSDs

ZWAL is a new WAL design for ZNS that uses zone appends instead of writes. It leads to significantly higher write throughput and concurrency compared to writes without resorting to excessive buffering I/O on the host. The implementation is build on top of ZenFS.

This code is part of the ZWAL: Rethinking Write-ahead Logs for ZNS SSDs paper at the "4th Workshop on Challenges and Opportunities of Efficient and Performant Storage Systems".

Dependencies

ZWALs have the same requirements as ZenFS, but additionally requires the SimpleZNSDevice library (SZD) and Linux with support for io_uring with NVMe passthrough (> 6.0).

  • libzbd
  • SZD
  • RocksDB v6.19.3 or later
  • Linux 6.0 or later

Build and use ZWALs

Clone ZWAL with required submodules

First clone the source base with all submodules included:

bash git clone https://github.com/stonet-research/zwal.git --recursive

Install dependencies

Install libzbd (tested on 0ab157e):

sh pushd libzbd sh ./autogen.sh ./configure make sudo make install popd

Install SZD (use the io_uring branch):

```sh pushd SimpleZNSDevice

Setup SPDK and DPDK (we will not use them, but SZD needs them for dependencies)

cd dependencies/spdk ./scripts/pkgdep.sh ./configure make -j sudo make install cd ..

mkdir -p build && cd build rm -f CMakeCache.txt cmake .. make sudo make install ```

Configure and build ZWAL

ZWALs come with a number of configuration options that are defined in #define directives. These must be set before compilation (also see build.sh on examples). Apart from this the build is no different from ZenFS. ZWALs do require a specific change in RocksDB, hence we ship RocksDB along with ZWALs (see rocksdb-raw).

```bash rm -rf rocksdb-raw/plugin/zenfs cp -r zenfs-appends rocksdb-raw/plugin/zenfs

Set WAL buffersize

BUFFSIZE=4 sed -i "s/#define SPARSEBUFFERSIZEINKB.*/#define SPARSEBUFFERSIZEINKB ${BUFFSIZE}UL/g" rocksdb-raw/plugin/zenfs/fs/io_zenfs.h

set WAL max depth

MAXWALDEPTH=32 sed -i "s/NAMELESSWALDEPTH.*/NAMELESSWALDEPTH ${MAXWALDEPTH}/g" rocksdb-raw/plugin/zenfs/fs/zbd_zenfs.h

Set WAL barriersize

WALBARRIERSIZE=16384 sed -i "s/#define WALBARRIERSIZEINKB.*/#define WALBARRIERSIZEINKB ${WALBARRIERSIZE}UL/g" rocksdb-raw/plugin/zenfs/fs/io_zenfs.h

cd rocksdb-raw DEBUGLEVEL=0 ROCKSDBPLUGINS=zenfs make -j48 dbbench sudo DEBUGLEVEL=0 ROCKSDB_PLUGINS=zenfs make install

cd plugin/zenfs/util make

NOTE: if the install fails, please check if both SPDK and ZBD are installed correctly. To double-check try the install procedure with cp -r zenfs-default as well.

```

Formatting a ZenFS file system with ZWALs enabled

The formatting procedure is the same as for ZenFS. However, we only evaluated extensively under the default configuration of:

bash echo deadline | sudo tee /sys/class/block/<zoned block device>/queue/scheduler rocksdb-raw/plugin/zenfs/util/zenfs mkfs --zbd=<zoned block device> --aux_path=<path to store LOG and LOCK files>

We provide no guarantees for other ZenFS functionalities.

Artifact Evaluation

To reproduce the results of our paper, follow the instuctions in AE.md.

Structure of this repository

  • AE.md: Artifact Evaluation. Contains a description of how to reproduce all results from the paper.
  • zenfs-appends: ZenFS with ZWALs implemented.
  • zenfs-default: Standard ZenFS (included for easy experimentation). We added support for variable buffer sizes (change SPARSE_BUFFER_SIZE_IN_KB in fs/io_zenfs.h).
  • rocksdb-raw: RocksDB modified to delete WALs instantly instead of archiving them.
  • rocksdb-ycsb: The same as rocksdb-raw, but always forces RocksDB to use ZenFS, and forces some options (WAL_size). Necessary to use with YCSB.
  • ycsb: The YCSB benchmark, modified to support RocksDB with ZenFS
  • data: raw data from all our experiments
  • fio-with-appends: fio modified to support appends for io_uring with NVMe passthrough

Owner

  • Name: StoNet-research
  • Login: stonet-research
  • Kind: organization
  • Location: Netherlands

Storage and Network research - VU Amsterdam

GitHub Events

Total
  • Issues event: 7
  • Watch event: 6
  • Delete event: 2
  • Issue comment event: 13
  • Push event: 8
  • Pull request event: 3
  • Fork event: 1
  • Create event: 2
Last Year
  • Issues event: 7
  • Watch event: 6
  • Delete event: 2
  • Issue comment event: 13
  • Push event: 8
  • Pull request event: 3
  • Fork event: 1
  • Create event: 2

Dependencies

rocksdb-raw/build_tools/ubuntu20_image/Dockerfile docker
  • ubuntu 20.04 build
rocksdb-raw/tools/Dockerfile docker
  • buildpack-deps wheezy build
rocksdb-ycsb/tools/Dockerfile docker
  • buildpack-deps wheezy build
rocksdb-raw/java/jmh/pom.xml maven
  • org.openjdk.jmh:jmh-generator-annprocess 1.22 provided
  • org.openjdk.jmh:jmh-core 1.22
  • org.rocksdb:rocksdbjni 7.9.0-SNAPSHOT
rocksdb-ycsb/java/jmh/pom.xml maven
  • org.openjdk.jmh:jmh-generator-annprocess 1.22 provided
  • org.openjdk.jmh:jmh-core 1.22
  • org.rocksdb:rocksdbjni 6.27.0-SNAPSHOT
ycsb/accumulo1.9/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.apache.accumulo:accumulo-core ${accumulo.1.9.version}
  • org.apache.hadoop:hadoop-common 2.6.4
  • org.slf4j:slf4j-api 1.7.13
  • junit:junit 4.12 test
  • org.apache.accumulo:accumulo-minicluster ${accumulo.1.9.version} test
ycsb/aerospike/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.aerospike:aerospike-client ${aerospike.version}
ycsb/arangodb/pom.xml maven
  • org.slf4j:slf4j-api 1.7.13 compile
  • ch.qos.logback:logback-classic 1.1.3 provided
  • ch.qos.logback:logback-core 1.1.3 provided
  • site.ycsb:core ${project.version} provided
  • com.arangodb:arangodb-java-driver ${arangodb.version}
  • org.apache.httpcomponents:httpclient 4.5.1
  • junit:junit 4.12 test
ycsb/asynchbase/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • log4j:log4j 1.2.17
  • org.apache.zookeeper:zookeeper 3.4.5
  • org.hbase:asynchbase ${asynchbase.version}
  • org.slf4j:slf4j-log4j12 1.7.25
  • junit:junit 4.12 test
  • org.apache.hbase:hbase-shaded-client ${hbase1.version} test
  • org.apache.hbase:hbase-shaded-testing-util ${hbase1.version} test
ycsb/azurecosmos/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.azure:azure-cosmos ${azurecosmos.version}
  • log4j:log4j 1.2.17
  • org.slf4j:slf4j-api 1.7.5
  • org.slf4j:slf4j-log4j12 1.7.5
ycsb/azuretablestorage/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.microsoft.azure:azure-storage ${azurestorage.version}
ycsb/binding-parent/datastore-specific-descriptor/pom.xml maven
  • site.ycsb:core ${project.version}
ycsb/binding-parent/pom.xml maven
ycsb/cassandra/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • com.datastax.cassandra:cassandra-driver-core ${cassandra.cql.version}
  • junit:junit 4.12 test
  • org.cassandraunit:cassandra-unit 3.0.0.1 test
  • org.hyperic:sigar-dist 1.6.4.129 test
  • org.slf4j:slf4j-simple 1.7.21 test
ycsb/cloudspanner/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.google.cloud:google-cloud-spanner ${cloudspanner.version}
  • io.perfmark:perfmark-api 0.23.0
  • io.perfmark:perfmark-traceviewer 0.23.0
ycsb/core/pom.xml maven
  • org.apache.htrace:htrace-core4 4.1.0-incubating
  • org.codehaus.jackson:jackson-core-asl 1.9.4
  • org.codehaus.jackson:jackson-mapper-asl 1.9.4
  • org.hdrhistogram:HdrHistogram 2.1.4
  • org.testng:testng 6.1.1 test
ycsb/couchbase/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.couchbase.client:couchbase-client ${couchbase.version}
  • com.fasterxml.jackson.core:jackson-databind 2.2.2
  • org.slf4j:slf4j-api
ycsb/couchbase2/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.couchbase.client:java-client ${couchbase2.version}
ycsb/crail/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • org.apache.crail:crail-client ${crail.version}
  • org.apache.crail:crail-rpc-darpc ${crail.version}
  • org.apache.crail:crail-rpc-narpc ${crail.version}
  • org.apache.crail:crail-storage-narpc ${crail.version}
  • org.apache.crail:crail-storage-rdma ${crail.version}
ycsb/distribution/pom.xml maven
  • site.ycsb:accumulo1.9-binding ${project.version}
  • site.ycsb:aerospike-binding ${project.version}
  • site.ycsb:arangodb-binding ${project.version}
  • site.ycsb:asynchbase-binding ${project.version}
  • site.ycsb:azurecosmos-binding ${project.version}
  • site.ycsb:azuretablestorage-binding ${project.version}
  • site.ycsb:cassandra-binding ${project.version}
  • site.ycsb:cloudspanner-binding ${project.version}
  • site.ycsb:core ${project.version}
  • site.ycsb:couchbase-binding ${project.version}
  • site.ycsb:couchbase2-binding ${project.version}
  • site.ycsb:crail-binding ${project.version}
  • site.ycsb:dynamodb-binding ${project.version}
  • site.ycsb:elasticsearch-binding ${project.version}
  • site.ycsb:elasticsearch5-binding ${project.version}
  • site.ycsb:foundationdb-binding ${project.version}
  • site.ycsb:geode-binding ${project.version}
  • site.ycsb:googlebigtable-binding ${project.version}
  • site.ycsb:googledatastore-binding ${project.version}
  • site.ycsb:griddb-binding ${project.version}
  • site.ycsb:hbase1-binding ${project.version}
  • site.ycsb:hbase2-binding ${project.version}
  • site.ycsb:ignite-binding ${project.version}
  • site.ycsb:infinispan-binding ${project.version}
  • site.ycsb:jdbc-binding ${project.version}
  • site.ycsb:kudu-binding ${project.version}
  • site.ycsb:maprdb-binding ${project.version}
  • site.ycsb:maprjsondb-binding ${project.version}
  • site.ycsb:memcached-binding ${project.version}
  • site.ycsb:mongodb-binding ${project.version}
  • site.ycsb:nosqldb-binding ${project.version}
  • site.ycsb:orientdb-binding ${project.version}
  • site.ycsb:postgrenosql-binding ${project.version}
  • site.ycsb:rados-binding ${project.version}
  • site.ycsb:redis-binding ${project.version}
  • site.ycsb:rest-binding ${project.version}
  • site.ycsb:riak-binding ${project.version}
  • site.ycsb:rocksdb-binding ${project.version}
  • site.ycsb:s3-binding ${project.version}
  • site.ycsb:scylla-binding ${project.version}
  • site.ycsb:seaweedfs-binding ${project.version}
  • site.ycsb:solr7-binding ${project.version}
  • site.ycsb:tablestore-binding ${project.version}
  • site.ycsb:tarantool-binding ${project.version}
  • site.ycsb:voltdb-binding ${project.version}
  • site.ycsb:zookeeper-binding ${project.version}
ycsb/dynamodb/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.amazonaws:aws-java-sdk 1.11.812
  • log4j:log4j 1.2.17
ycsb/elasticsearch/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • net.java.dev.jna:jna 4.1.0
  • org.elasticsearch:elasticsearch 2.4.0
  • junit:junit 4.12 test
ycsb/elasticsearch5/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.apache.logging.log4j:log4j-api 2.8.2
  • org.apache.logging.log4j:log4j-core 2.8.2
  • org.elasticsearch.client:rest ${elasticsearch5-version}
  • org.elasticsearch.client:transport ${elasticsearch5-version}
  • org.elasticsearch:jna 4.4.0
  • junit:junit 4.12 test
ycsb/foundationdb/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.foundationdb:fdb-java ${foundationdb.version}
  • org.slf4j:slf4j-log4j12 1.7.10
  • junit:junit 4.12 test
ycsb/geode/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • org.apache.geode:geode-core ${geode.version}
ycsb/googlebigtable/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.google.cloud.bigtable:bigtable-hbase-1.x ${googlebigtable.version}
ycsb/googledatastore/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.google.cloud.datastore:datastore-v1-proto-client 1.1.0
  • log4j:log4j 1.2.17
ycsb/griddb/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.github.griddb:gridstore ${griddb.version}
  • junit:junit 4.12 test
ycsb/hbase1/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.apache.hbase:hbase-shaded-client ${hbase1.version}
  • junit:junit 4.12 test
  • org.apache.hbase:hbase-shaded-testing-util ${hbase1.version} test
ycsb/hbase2/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.apache.hbase:hbase-shaded-client ${hbase2.version}
  • org.slf4j:slf4j-log4j12 1.7.25
  • junit:junit 4.12 test
  • org.apache.hbase:hbase-shaded-testing-util ${hbase2.version} test
ycsb/ignite/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.apache.ignite:ignite-core ${ignite.version}
  • org.apache.ignite:ignite-indexing ${ignite.version}
  • org.apache.ignite:ignite-log4j2 ${ignite.version}
  • org.apache.logging.log4j:log4j-api 2.11.0
  • org.apache.logging.log4j:log4j-core 2.11.0
  • org.hamcrest:hamcrest-library 1.3
  • junit:junit 4.12 test
  • org.slf4j:slf4j-simple 1.7.21 test
ycsb/infinispan/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • org.infinispan:infinispan-client-hotrod ${infinispan.version}
  • org.infinispan:infinispan-core ${infinispan.version}
ycsb/jdbc/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • org.apache.openjpa:openjpa-jdbc ${openjpa.jdbc.version}
  • junit:junit 4.12 test
  • org.hsqldb:hsqldb 2.3.3 test
ycsb/kudu/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • org.apache.kudu:kudu-client ${kudu.version}
  • org.slf4j:slf4j-api 1.7.21
  • org.slf4j:slf4j-log4j12 1.7.21
ycsb/maprdb/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.apache.hbase:hbase-client ${maprhbase.version}
  • org.slf4j:slf4j-log4j12 1.7.10
  • site.ycsb:hbase1-binding 0.18.0-SNAPSHOT
  • junit:junit 4.12 test
ycsb/maprjsondb/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • org.ojai:ojai 2.0-mapr-1710
  • org.slf4j:slf4j-log4j12 1.7.10
  • junit:junit 4.12 test
ycsb/memcached/pom.xml maven
  • log4j:log4j 1.2.17
  • net.spy:spymemcached 2.11.4
  • org.codehaus.jackson:jackson-mapper-asl 1.9.13
  • site.ycsb:core ${project.version}
ycsb/mongodb/pom.xml maven
  • org.xerial.snappy:snappy-java 1.1.7.1 compile
  • site.ycsb:core ${project.version} provided
  • ch.qos.logback:logback-classic 1.1.2
  • com.allanbank:mongodb-async-driver ${mongodb.async.version}
  • org.mongodb:mongo-java-driver ${mongodb.version}
  • junit:junit 4.12 test
ycsb/nosqldb/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.oracle.kv:oracle-nosql-client 3.0.5
ycsb/orientdb/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • com.orientechnologies:orientdb-client ${orientdb.version}
  • org.slf4j:slf4j-log4j12 1.7.10
  • junit:junit 4.12 test
ycsb/pom.xml maven
ycsb/postgrenosql/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.googlecode.json-simple:json-simple 1.1.1
  • org.postgresql:postgresql 9.4.1212.jre7
  • org.slf4j:slf4j-api 1.7.13
  • org.slf4j:slf4j-simple 1.7.13
  • junit:junit 4.12 test
ycsb/rados/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • com.ceph:rados 0.2.0
  • net.java.dev.jna:jna 4.2.2
  • org.json:json 20160212
  • junit:junit 4.12 test
ycsb/redis/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • redis.clients:jedis ${redis.version}
ycsb/rest/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • com.github.stefanbirkner:system-rules 1.16.0
  • org.apache.httpcomponents:httpclient 4.5.1
  • org.apache.httpcomponents:httpcore 4.4.4
  • org.apache.tomcat.embed:tomcat-embed-core 8.0.28
  • org.apache.tomcat.embed:tomcat-embed-jasper 8.0.28
  • org.apache.tomcat.embed:tomcat-embed-logging-juli 8.0.28
  • org.apache.tomcat.embed:tomcat-embed-logging-log4j 8.0.28
  • org.apache.tomcat.embed:tomcat-embed-websocket 8.0.28
  • org.apache.tomcat:tomcat-dbcp 8.0.28
  • org.glassfish.jersey.containers:jersey-container-servlet-core 2.6
  • org.glassfish.jersey.core:jersey-client 2.6
  • org.glassfish.jersey.core:jersey-server 2.6
  • junit:junit 4.12 test
ycsb/riak/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.basho.riak:riak-client 2.0.5
  • com.google.collections:google-collections 1.0
  • junit:junit 4.12 test
ycsb/rocksdb/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • net.jcip:jcip-annotations 1.0
  • org.slf4j:slf4j-api 1.7.25
  • org.slf4j:slf4j-simple 1.7.25
  • org.rocksdb:librocksdbjni linux64 system
  • org.rocksdb:libzbd linux64 system
  • org.rocksdb:rocksdbjni 7.4.3-linux64 system
  • junit:junit 4.12 test
ycsb/s3/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.amazonaws:aws-java-sdk-s3 ${s3.version}
ycsb/scylla/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • com.scylladb:scylla-driver-core ${scylla.cql.version}
  • org.slf4j:slf4j-api 1.7.25
  • org.slf4j:slf4j-simple 1.7.25
  • junit:junit 4.12 test
  • org.cassandraunit:cassandra-unit 3.0.0.1 test
ycsb/seaweedfs/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.github.chrislusf:seaweedfs-client ${seaweed.client.version}
  • org.slf4j:slf4j-api 1.7.25
  • org.slf4j:slf4j-simple 1.7.25
ycsb/solr7/pom.xml maven
  • site.ycsb:core 0.18.0-SNAPSHOT provided
  • commons-codec:commons-codec 1.14
  • org.apache.solr:solr-solrj ${solr7.version}
  • org.slf4j:slf4j-log4j12 1.7.30
  • org.apache.solr:solr-test-framework ${solr7.version} test
ycsb/tablestore/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • com.aliyun.openservices:tablestore ${tablestore.version}
  • log4j:log4j 1.2.17
ycsb/tarantool/pom.xml maven
  • site.ycsb:core ${project.version} provided
  • org.tarantool:connector ${tarantool.version}
ycsb/voltdb/pom.xml maven
  • org.voltdb:voltdb ${voltdb.version} provided
  • site.ycsb:core ${project.version} provided
  • org.apache.logging.log4j:log4j-api 2.7
  • org.apache.logging.log4j:log4j-core 2.7
  • org.apache.logging.log4j:log4j-slf4j-impl 2.7
  • org.slf4j:slf4j-api 1.7.28
  • org.voltdb:voltdbclient ${voltdb.version}
  • junit:junit 4.12 test
ycsb/zookeeper/pom.xml maven
  • com.googlecode.json-simple:json-simple 1.1.1 compile
  • site.ycsb:core ${project.version} provided
  • log4j:log4j 1.2.17
  • org.apache.zookeeper:zookeeper ${zookeeper.version}
  • org.slf4j:slf4j-api 1.7.21
  • org.slf4j:slf4j-log4j12 1.7.25
  • junit:junit 4.12 test
  • org.apache.curator:curator-test 4.2.0 test
rocksdb-raw/docs/Gemfile rubygems
  • github-pages ~> 227
  • webrick ~> 1.7
rocksdb-ycsb/docs/Gemfile rubygems
  • github-pages ~> 225
  • webrick ~> 1.7
rocksdb-ycsb/docs/Gemfile.lock rubygems
  • 103 dependencies