Key-value workload

Benchmark YCQL performance with key-value workloads

This page documents the preview version (v2.23). Preview includes features under active development and is for development and testing only. For production, use the stable version (v2024.1). To learn more, see Versioning.

Use this benchmark to test the performance of YugabyteDB using a key-value workload.

Cluster configuration

For this benchmark, you will set up a three-node YugabyteDB cluster with a replication factor of 3.

Machine configuration

  • Amazon Web Services (AWS)

    • Instance type: i3.4xlarge
    • Storage: 2 x 1.9 TB NVMe SSD (comes preconfigured with the instance)
  • Google Cloud Platform (GCP)

    • Instance type: n1-standard-16
    • Storage: 2 x 375 GB SSD
  • on-premises data center

    • Instance: 16 CPU cores
    • Storage: 1 x 200 GB SSD (minimum)
    • RAM size: 30 GB (minimum)

Benchmark tool

We will use the YugabyteDB Workload Generator to perform this benchmark.

Download the YugabyteDB workload generator JAR file (yb-sample-apps.jar) as follows:

wget https://github.com/yugabyte/yb-sample-apps/releases/download/v1.4.1/yb-sample-apps.jar -O yb-sample-apps.jar

To run the workload generator tool, you must have:

  • Java runtime or JDK installed.
  • Set the environment variable $ENDPOINTS to the IP addresses (including hosts and ports) for the nodes of the cluster.
ENDPOINTS="X.X.X.X:9042,X.X.X.X:9042,X.X.X.X:9042"

Run the write-heavy key-value workload

Run the key-value workload with higher number of write threads (representing write-heavy workload).

Load 1B keys of 256 bytes each across 256 writer threads

$ java -jar ./yb-sample-apps.jar  \
      --workload CassandraKeyValue   \
      --nodes $ENDPOINTS             \
      --nouuid                       \
      --value_size 256               \
      --num_threads_read 0           \
      --num_threads_write  256       \
      --num_unique_keys 1000000000

Expected results

Name Observation
Write Ops/sec ~90k
Write Latency ~2.5-3.0 ms/op
CPU (User + Sys) 60%

Run the read-heavy key-value workload

Run the key-value workload with higher number of read threads (representing read-heavy workload).

Load 1M keys of 256 bytes and access them with 256 reader threads.

$ java -jar ./yb-sample-apps.jar  \
      --workload CassandraKeyValue   \
      --nodes $ENDPOINTS             \
      --nouuid                       \
      --value_size 256               \
      --num_threads_read 256         \
      --num_threads_write 0          \
      --num_unique_keys 1000000

Expected results

Name Observation
(Read) Ops/sec ~150k
(Read) Latency ~1.66 ms/op
CPU (User + Sys) 60%

Batch write-heavy KV workload

Run the key-value workload in batch mode and higher number of write threads (representing batched, write-heavy workload).

Load 1B keys of 256 bytes each across 64 writer threads in batches of 25 each.

$ java -jar ./yb-sample-apps.jar      \
      --workload CassandraBatchKeyValue  \
      --nodes $ENDPOINTS                 \
      --nouuid                           \
      --batch_size 25                    \
      --value_size 256                   \
      --num_threads_read 0               \
      --num_threads_write 64             \
      --num_unique_keys 1000000000

Expected results

Name Observation
(Batch Write) Ops/sec ~140k
(Batch Write) Latency ~9.0 ms/op
CPU (User + Sys) 80%