From 59fc2c537ef1867f6064596eccc29487a9bf27a7 Mon Sep 17 00:00:00 2001 From: Sahil Bondre Date: Sun, 4 Feb 2024 20:50:23 +0000 Subject: [PATCH] FFDB-012: Add benchmark and docs (#24) --- README.md | 134 ++++++++++++++ benchmarks/firefly/.gitignore | 35 ++++ benchmarks/firefly/Dockerfile | 7 + benchmarks/firefly/build_image.sh | 3 + benchmarks/firefly/delete_image.sh | 1 + benchmarks/firefly/docker-compose.yml | 9 + benchmarks/firefly/pom.xml | 46 +++++ .../sahilbondre/fireflydb/benchmark/Main.java | 168 ++++++++++++++++++ docs/read-test.png | Bin 0 -> 16219 bytes docs/rw-test.png | Bin 0 -> 25170 bytes docs/write-test.png | Bin 0 -> 19054 bytes 11 files changed, 403 insertions(+) create mode 100644 README.md create mode 100644 benchmarks/firefly/.gitignore create mode 100644 benchmarks/firefly/Dockerfile create mode 100755 benchmarks/firefly/build_image.sh create mode 100644 benchmarks/firefly/delete_image.sh create mode 100644 benchmarks/firefly/docker-compose.yml create mode 100644 benchmarks/firefly/pom.xml create mode 100644 benchmarks/firefly/src/main/java/com/sahilbondre/fireflydb/benchmark/Main.java create mode 100644 docs/read-test.png create mode 100644 docs/rw-test.png create mode 100644 docs/write-test.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0027a7 --- /dev/null +++ b/README.md @@ -0,0 +1,134 @@ +# FireflyDB + +FireflyDB is a fast, thread-safe, JVM-based key-value storage engine with microsecond latency. FireflyDB is 20x faster +for reads and 10x faster for writes than [Bitcask](https://github.com/basho/bitcask), which has a similar architecture. + +FireflyDB is hash-based and gives up range queries to achieve high throughput and low latency. As a result, it is about +100x faster at writes than [LevelDB](https://github.com/google/leveldb) (Google) +and [RocksDB](https://github.com/facebook/rocksdb) (Facebook). + +FireflyDB relies on sensible defaults and does not expose many configuration options. FireflyDB is designed with +educated tradeoffs to achieve high performance: + +1. All the keys must fit in memory. This is a tradeoff with all hash-based storage engines. Even with the largest key + size of 32KB, FireflyDB can store 32,000+ keys per 1GB of memory. +2. FireflyDB does not support range queries. +3. Maximum key size is 32768 bytes or 32KB. +4. Maximum value size is 2,147,483,647 bytes or 2.14 GB. + +## Installation + +### Maven + +```xml + + + com.sahilbondre + fireflydb + 0.1.0 + +``` + +### Gradle + +```gradle +implementation 'com.sahilbondre:fireflydb:0.1.0' +``` + +## API + +```java +FireflyDB fireflyDB=FireflyDB.getInstance("path/to/db"); + fireflyDB.start(); + +// Write + byte[]key="testKey".getBytes(); + byte[]value="testValue".getBytes(); + + fireflyDB.put(key,value); + +// Read + byte[]result=fireflyDB.get(key); + +// Compaction +// FireflyDB will compact automatically but can be triggered on demand. + fireflyDB.compact(); + + fireflyDB.stop(); +``` + +## Benchmarks + +``` +iterations: 100,000 +cpu: 1 +memory: 1GB +key-size: 8 bytes +value-size: 100 bytes +``` + +### Random Write Test + +Test: Generate a random key and value and write it to the database. + +![write-test](./docs/write-test.png) + +| Database | Avg Time (microseconds) | P90 Latency (microseconds) | +|-----------|-------------------------|----------------------------| +| In-Memory | 0.53 | 1 | +| LevelDB | 445.94 | 811 | +| Bitcask | 71.33 | 48 | +| RocksDB | 568.60 | 872 | +| FireflyDB | 7.10 | 5 | + +### Random Read Test + +Test: Pick a random key from the ones written in the previous test and read it from the database. + +![read-test](./docs/read-test.png) + +| Database | Avg Time (microseconds) | P90 Latency (microseconds) | +|-----------|-------------------------|----------------------------| +| In-Memory | 0.49 | 1 | +| LevelDB | 1.55 | 2 | +| Bitcask | 108.03 | 62 | +| RocksDB | 0.94 | 2 | +| FireflyDB | 4.97 | 4 | + +### Alternating Read-Write Test + +Test: Perform a read and write operation alternately. + +![alternating-read-write-test](./docs/rw-test.png) + +| Database | Avg Time (microseconds) | P90 Latency (microseconds) | +|-------------------|-------------------------|----------------------------| +| In-Memory (read) | 0.61 | 1 | +| In-Memory (write) | 0.57 | 1 | +| LevelDB (read) | 3.43 | 5 | +| LevelDB (write) | 441.38 | 814 | +| Bitcask (read) | 120.15 | 60 | +| Bitcask (write) | 66.78 | 57 | +| RocksDB (read) | 4.54 | 7 | +| RocksDB (write) | 567.14 | 971 | +| FireflyDB (read) | 3.89 | 4 | +| FireflyDB (write) | 3.91 | 4 | + +## Potential Improvements + +- [ ] Add an explicit delete operation. +- [ ] Expose compaction size as a configuration option. +- [ ] Expose compaction interval as a configuration option. +- [ ] Allow larger key size as a configuration option. +- [ ] Expose read only mode. + +## Contributing + +Pull requests are welcome. For major changes, please open an issue first +to discuss what you would like to change. + +Please make sure to update tests as appropriate. + +## License + +[Apache 2.0](https://raw.githubusercontent.com/godcrampy/fireflydb/master/LICENSE) diff --git a/benchmarks/firefly/.gitignore b/benchmarks/firefly/.gitignore new file mode 100644 index 0000000..b425f09 --- /dev/null +++ b/benchmarks/firefly/.gitignore @@ -0,0 +1,35 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/benchmarks/firefly/Dockerfile b/benchmarks/firefly/Dockerfile new file mode 100644 index 0000000..9bfa555 --- /dev/null +++ b/benchmarks/firefly/Dockerfile @@ -0,0 +1,7 @@ +FROM eclipse-temurin:17-jre-jammy + +WORKDIR /app/firefly + +COPY ./target/benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar /app/firefly/ + +CMD ["java", "-jar", "benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar"] diff --git a/benchmarks/firefly/build_image.sh b/benchmarks/firefly/build_image.sh new file mode 100755 index 0000000..2756d9a --- /dev/null +++ b/benchmarks/firefly/build_image.sh @@ -0,0 +1,3 @@ +mvn clean compile assembly:single + +docker build -t fireflydb-benchmark-firefly . diff --git a/benchmarks/firefly/delete_image.sh b/benchmarks/firefly/delete_image.sh new file mode 100644 index 0000000..df03b8d --- /dev/null +++ b/benchmarks/firefly/delete_image.sh @@ -0,0 +1 @@ +docker rmi fireflydb-benchmark-firefly diff --git a/benchmarks/firefly/docker-compose.yml b/benchmarks/firefly/docker-compose.yml new file mode 100644 index 0000000..eac7b1b --- /dev/null +++ b/benchmarks/firefly/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3' +services: + fireflydb-benchmark-bitcask: + image: fireflydb-benchmark-firefly + deploy: + resources: + limits: + cpus: '1' + memory: '1G' diff --git a/benchmarks/firefly/pom.xml b/benchmarks/firefly/pom.xml new file mode 100644 index 0000000..dac145e --- /dev/null +++ b/benchmarks/firefly/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.sahilbondre.fireflydb + benchmark + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + com.sahilbondre + fireflydb + 0.1.0 + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.6.0 + + + + com.sahilbondre.fireflydb.benchmark.Main + + + + jar-with-dependencies + + + + + + + \ No newline at end of file diff --git a/benchmarks/firefly/src/main/java/com/sahilbondre/fireflydb/benchmark/Main.java b/benchmarks/firefly/src/main/java/com/sahilbondre/fireflydb/benchmark/Main.java new file mode 100644 index 0000000..96d20f5 --- /dev/null +++ b/benchmarks/firefly/src/main/java/com/sahilbondre/fireflydb/benchmark/Main.java @@ -0,0 +1,168 @@ +package com.sahilbondre.fireflydb.benchmark; + +import com.sahilbondre.firefly.FireflyDB; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.logging.Logger; + +public class Main { + private static final String TEST_FOLDER = "src/test/resources/test_folder"; + private static final int ITERATIONS = 100000; + private static final int KEY_LENGTH = 8; + private static final int VALUE_LENGTH = 100; + private static final Logger logger = Logger.getLogger(Main.class.getName()); + + private static final FireflyDB fireflyDB = FireflyDB.getInstance(TEST_FOLDER); + + + + public static void main(String[] args) throws IOException { + Files.createDirectories(Paths.get(TEST_FOLDER)); + + fireflyDB.start(); + + logger.info("Starting benchmark..."); + logger.info("Iterations: " + ITERATIONS); + logger.info("Key length: " + KEY_LENGTH); + logger.info("Value length: " + VALUE_LENGTH); + + logger.info("Starting writes..."); + + long[] writeTimes = new long[ITERATIONS]; + + List availableKeys = new ArrayList<>(); + + long startTime = System.nanoTime(); + for (int i = 0; i < ITERATIONS; i++) { + byte[] key = getRandomBytes(KEY_LENGTH); + byte[] value = getRandomBytes(VALUE_LENGTH); + + long writeTime = saveKeyValuePairAndGetTime(key, value); + availableKeys.add(key); + writeTimes[i] = writeTime; + } + long totalTime = (System.nanoTime() - startTime) / 1000; // Convert nanoseconds to microseconds + logger.info("Total time for writes: " + totalTime + " mus"); + + double averageWriteTime = 0; + for (long writeTime : writeTimes) { + averageWriteTime += writeTime; + } + averageWriteTime /= ITERATIONS; + + logger.info("Average write latency: " + averageWriteTime + " mus"); + + // Calculate p90 write latency + // Sort write times + Arrays.sort(writeTimes); + long p90WriteTime = writeTimes[(int) (ITERATIONS * 0.9)]; + logger.info("p90 write latency: " + p90WriteTime + " mus"); + + // Benchmark reads + logger.info("\nStarting reads..."); + + long[] readTimes = new long[ITERATIONS]; + + startTime = System.nanoTime(); + for (int i = 0; i < ITERATIONS; i++) { + // Get a random key from the list of available keys + byte[] key = availableKeys.get(new Random().nextInt(availableKeys.size())); + + long readTime = getKeyValuePairAndGetTime(key); + readTimes[i] = readTime; + } + totalTime = (System.nanoTime() - startTime) / 1000; // Convert nanoseconds to microseconds + logger.info("Total time for reads: " + totalTime + " mus"); + + double averageReadTime = 0; + for (long readTime : readTimes) { + averageReadTime += readTime; + } + averageReadTime /= ITERATIONS; + + logger.info("Average read latency: " + averageReadTime + " mus"); + + // Calculate p90 read latency + // Sort read times + Arrays.sort(readTimes); + long p90ReadTime = readTimes[(int) (ITERATIONS * 0.9)]; + logger.info("p90 read latency: " + p90ReadTime + " mus"); + + + // Benchmark reads and writes + logger.info("\nStarting reads and writes..."); + + + startTime = System.nanoTime(); + for (int i = 0; i < ITERATIONS; i++) { + byte[] writeKey = getRandomBytes(KEY_LENGTH); + byte[] writeValue = getRandomBytes(VALUE_LENGTH); + + long writeTime = saveKeyValuePairAndGetTime(writeKey, writeValue); + + availableKeys.add(writeKey); + + byte[] readKey = availableKeys.get(new Random().nextInt(availableKeys.size())); + + long readTime = getKeyValuePairAndGetTime(readKey); + + writeTimes[i] = writeTime; + readTimes[i] = readTime; + } + totalTime = (System.nanoTime() - startTime) / 1000; // Convert nanoseconds to microseconds + logger.info("Total time for reads and writes: " + totalTime + " mus"); + + averageReadTime = 0; + for (long readTime : readTimes) { + averageReadTime += readTime; + } + averageReadTime /= ITERATIONS; + + averageWriteTime = 0; + for (long writeTime : writeTimes) { + averageWriteTime += writeTime; + } + averageWriteTime /= ITERATIONS; + + logger.info("Average read latency: " + averageReadTime + " mus"); + logger.info("Average write latency: " + averageWriteTime + " mus"); + + // Calculate p90 read latency + // Sort read times + Arrays.sort(readTimes); + + // Calculate p90 write latency + // Sort write times + Arrays.sort(writeTimes); + + p90ReadTime = readTimes[(int) (ITERATIONS * 0.9)]; + logger.info("p90 read latency: " + p90ReadTime + " mus"); + + p90WriteTime = writeTimes[(int) (ITERATIONS * 0.9)]; + logger.info("p90 write latency: " + p90WriteTime + " mus"); + } + + private static byte[] getRandomBytes(int length) { + byte[] bytes = new byte[length]; + new Random().nextBytes(bytes); + return bytes; + } + + private static long saveKeyValuePairAndGetTime(byte[] key, byte[] value) throws IOException { + long startTime = System.nanoTime(); + fireflyDB.set(key, value); + return (System.nanoTime() - startTime) / 1000; // Convert nanoseconds to microseconds + } + + private static long getKeyValuePairAndGetTime(byte[] key) throws IOException { + long startTime = System.nanoTime(); + fireflyDB.get(key); + return (System.nanoTime() - startTime) / 1000; // Convert nanoseconds to microseconds + } +} diff --git a/docs/read-test.png b/docs/read-test.png new file mode 100644 index 0000000000000000000000000000000000000000..71e420714a4b7a364d96dddb7c149ea903596e6f GIT binary patch literal 16219 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 literal 0 HcmV?d00001 diff --git a/docs/write-test.png b/docs/write-test.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9d9af1d548005f007586663ae23d463660430b GIT binary patch literal 19054 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