zwal
ZWAL : Rethinking Write-ahead Logs for ZNS SSDs (SIGOPS OSR'24 and CHEOPS'24)
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
Repository
ZWAL : Rethinking Write-ahead Logs for ZNS SSDs (SIGOPS OSR'24 and CHEOPS'24)
Basic Info
- Host: GitHub
- Owner: stonet-research
- License: mit
- Language: C++
- Default Branch: main
- Homepage: https://atlarge-research.com/pdfs/2024-zns-wal.pdf
- Size: 17.7 MB
Statistics
- Stars: 11
- Watchers: 3
- Forks: 3
- Open Issues: 1
- Releases: 0
Topics
Metadata Files
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).
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 (changeSPARSE_BUFFER_SIZE_IN_KBinfs/io_zenfs.h).rocksdb-raw: RocksDB modified to delete WALs instantly instead of archiving them.rocksdb-ycsb: The same asrocksdb-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 ZenFSdata: raw data from all our experimentsfio-with-appends: fio modified to support appends for io_uring with NVMe passthrough
Owner
- Name: StoNet-research
- Login: stonet-research
- Kind: organization
- Location: Netherlands
- Website: https://stonet-research.github.io/
- Repositories: 1
- Profile: https://github.com/stonet-research
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
- ubuntu 20.04 build
- buildpack-deps wheezy build
- buildpack-deps wheezy build
- org.openjdk.jmh:jmh-generator-annprocess 1.22 provided
- org.openjdk.jmh:jmh-core 1.22
- org.rocksdb:rocksdbjni 7.9.0-SNAPSHOT
- org.openjdk.jmh:jmh-generator-annprocess 1.22 provided
- org.openjdk.jmh:jmh-core 1.22
- org.rocksdb:rocksdbjni 6.27.0-SNAPSHOT
- 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
- site.ycsb:core ${project.version} provided
- com.aerospike:aerospike-client ${aerospike.version}
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- com.microsoft.azure:azure-storage ${azurestorage.version}
- site.ycsb:core ${project.version}
- 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
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- com.couchbase.client:java-client ${couchbase2.version}
- 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}
- 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}
- site.ycsb:core ${project.version} provided
- com.amazonaws:aws-java-sdk 1.11.812
- log4j:log4j 1.2.17
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- org.apache.geode:geode-core ${geode.version}
- site.ycsb:core ${project.version} provided
- com.google.cloud.bigtable:bigtable-hbase-1.x ${googlebigtable.version}
- site.ycsb:core ${project.version} provided
- com.google.cloud.datastore:datastore-v1-proto-client 1.1.0
- log4j:log4j 1.2.17
- site.ycsb:core ${project.version} provided
- com.github.griddb:gridstore ${griddb.version}
- junit:junit 4.12 test
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- org.infinispan:infinispan-client-hotrod ${infinispan.version}
- org.infinispan:infinispan-core ${infinispan.version}
- 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
- 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
- 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
- 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
- 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}
- 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
- site.ycsb:core ${project.version} provided
- com.oracle.kv:oracle-nosql-client 3.0.5
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- redis.clients:jedis ${redis.version}
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- com.amazonaws:aws-java-sdk-s3 ${s3.version}
- 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
- 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
- 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
- site.ycsb:core ${project.version} provided
- com.aliyun.openservices:tablestore ${tablestore.version}
- log4j:log4j 1.2.17
- site.ycsb:core ${project.version} provided
- org.tarantool:connector ${tarantool.version}
- 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
- 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
- github-pages ~> 227
- webrick ~> 1.7
- github-pages ~> 225
- webrick ~> 1.7
- 103 dependencies