Back to Yugabyte Db

Benchmark YSQL performance using YCSB

docs/content/stable/benchmark/ycsb-ysql.md

2026.1.0.0-b255.7 KB
Original Source
<ul class="nav nav-tabs-alt nav-tabs-yb"> <li > <a href="../ycsb-jdbc/" class="nav-link"> <i class="icon-postgres" aria-hidden="true"></i> JDBC Binding </a> </li> <li > <a href="../ycsb-ysql/" class="nav-link active"> <i class="icon-postgres" aria-hidden="true"></i> YSQL Binding </a> </li> <li > <a href="../ycsb-ycql/" class="nav-link"> <i class="icon-cassandra" aria-hidden="true"></i> YCQL Binding </a> </li> </ul>

This document describes how to use a YSQL-specific binding to test the YSQL API using the YCSB benchmark.

For additional information about YCSB, refer to the following:

Running the benchmark

To run the benchmark, ensure that you meet the prerequisites and complete steps such as starting YugabyteDB and configuring its properties.

Prerequisites

The binaries are compiled with Java 13 and it is recommended to run these binaries with that version.

Run the following commands to download the YCSB binaries:

sh
$ cd $HOME
$ wget https://github.com/yugabyte/YCSB/releases/download/1.0/ycsb.tar.gz
$ tar -zxvf ycsb.tar.gz
$ cd YCSB

Ensure that you have the YSQL shell ysqlsh and that its location is included in the PATH variable, as follows:

sh
$ export PATH=$PATH:/path/to/ysqlsh

Start YugabyteDB

Start your YugabyteDB cluster by following the procedure described in Manual deployment. Note the IP addresses of the nodes in the cluster, as these addresses are required when configuring the properties file.

Configure the properties file

Update the file db.properties in the YCSB directory with the following contents, replacing values for the IP addresses in the db.url field with the correct values for all the nodes that are part of the cluster:

sh
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://<ip1>:5433/ycsb;jdbc:postgresql://<ip2>:5433/ycsb;jdbc:postgresql://<ip3>:5433/ycsb;
db.user=yugabyte
db.passwd=

The other configuration parameters are described in Core Properties.

Run the benchmark

Use the following script run_ysql.sh to load and run all the workloads:

sh
$ ./run_ysql.sh --ip <ip>

The preceding command runs the workload on a table with a million rows. To run the benchmark on a table with a different row count, use the following command:

sh
$ ./run_ysql.sh --ip <ip> --recordcount <number of rows>

To get the maximum performance out of the system, you would have to tune the threadcount parameter in the script. As a reference, for a c5.4xlarge instance with 16 cores and 32GB RAM, you used a thread count of 32 for the loading phase and 256 for the execution phase.

Verify results

The run_ysql.sh script creates two result files per workload: one for the loading, and one for the execution phase with the details of throughput and latency.

For example, for a workload it creates, inspect the workloada-ysql-load.dat and workloada-ysql-transaction.dat files.

Run individual workloads (optional)

Optionally, you can run workloads individually using the following steps:

  1. Start the YSQL shell using the following command:

    sh
    $ ./bin/ysqlsh -h <ip>
    
  2. Create the ycsb database as follows:

    sql
    yugabyte=# CREATE DATABASE ycsb;
    
  3. Connect to the database as follows:

    sql
    yugabyte=# \c ycsb
    
  4. Create the table as follows:

    sql
    ycsb=# CREATE TABLE usertable (
               YCSB_KEY VARCHAR(255) PRIMARY KEY,
               FIELD0 TEXT, FIELD1 TEXT, FIELD2 TEXT, FIELD3 TEXT,
               FIELD4 TEXT, FIELD5 TEXT, FIELD6 TEXT, FIELD7 TEXT,
               FIELD8 TEXT, FIELD9 TEXT);
    
  5. Load the data before you start the yugabyteSQL workload:

    sh
    $ ./bin/ycsb load yugabyteSQL -s \
          -P db.properties           \
          -P workloads/workloada     \
          -p recordcount=1000000     \
          -p operationcount=10000000 \
          -p threadcount=32
    
  6. Run the workload as follows:

    {{< note title="Note" >}} The recordcount parameter in the following ycsb commands should match the number of rows in the table. {{< /note >}}

    sh
    $ ./bin/ycsb run yugabyteSQL -s  \
          -P db.properties           \
          -P workloads/workloada     \
          -p recordcount=1000000     \
          -p operationcount=10000000 \
          -p threadcount=256
    
  7. Run other workloads (for example, workloadb) by changing the corresponding argument in the preceding command, as follows:

    sh
    $ ./bin/ycsb run yugabyteSQL -s  \
          -P db.properties           \
          -P workloads/workloadb     \
          -p recordcount=1000000     \
          -p operationcount=10000000 \
          -p threadcount=256
    

Expected results

When run on a 3-node cluster with each node on a c5.4xlarge AWS instance (16 cores, 32 GB of RAM, and 2 EBS volumes), all belonging to the same availability zone with the client VM running in the same availability zone, you get the following results for 1 million rows:

WorkloadThroughput (ops/sec)Read LatencyWrite Latency
Workload A37,3771.5ms12 ms update
Workload B66,8754ms7.6ms update
Workload C77,0683.5ms readNot applicable
Workload D63,6764ms7ms insert
Workload E63,6863.8ms scanNot applicable
Workload F29,5002ms15ms read-modify-write