Skip to content

qube is a DB load testing tool.

License

Notifications You must be signed in to change notification settings

winebarrel/qube

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

qube

build Go Report Card

qube is a DB load testing tool.

Installation

brew install winebarrel/qube/qube

Usage

Usage: qube --data-files=DATA-FILES,... --dsn=STRING [flags]

Flags:
  -h, --help                Show help.
      --[no-]force          Do not abort test on error. (default: disabled)
  -f, --data-files=DATA-FILES,...
                            JSON Lines file list of queries to execute.
      --key="q"             Key name of the query field in the test data. e.g.
                            {"q":"SELECT ..."}
      --[no-]loop           Return to the beginning after reading the test data.
                            (default: enabled)
      --[no-]random         Randomize the starting position of the test data.
                            (default: disabled)
      --commit-rate=UINT    Number of queries to execute "COMMIT".
  -d, --dsn=STRING          DSN to connect to.
                              - MySQL:
                                https://pkg.go.dev/github.com/go-sql-driver/mysql#readme-dsn-data-source-name
                              - PostgreSQL:
                                https://pkg.go.dev/github.com/jackc/pgx/v5/stdlib#pkg-overview
      --[no-]noop           No-op mode. No actual query execution. (default:
                            disabled)
  -n, --nagents=1           Number of agents.
  -r, --rate=FLOAT-64       Rate limit (qps). "0" means unlimited.
  -t, --time=DURATION       Maximum execution time of the test. "0" means
                            unlimited.
      --[no-]progress       Show progress report.
  -C, --[no-]color          Color report JSON.
      --version
$ echo '{"q":"select 1"}' > data.jsonl
$ echo '{"q":"select 2"}' >> data.jsonl
$ echo '{"q":"select 3"}' >> data.jsonl

$ qube -d 'root@tcp(127.0.0.1:13306)/' -f data.jsonl -n 5 -t 10s
00:05 | 5 agents / exec 95788 queries, 0 errors (23637 qps)
...
{
  "ID": "b1e23c00-1601-46eb-ad2b-fdf01154243d",
  "StartedAt": "2023-11-12T12:08:29.296154+09:00",
  "FinishedAt": "2023-11-12T12:08:39.297268+09:00",
  "ElapsedTime": "10.001173875s",
  "Options": {
    "Force": false,
    "DataFile": [
      "data.jsonl"
    ],
    "Key": "q",
    "Loop": true,
    "Random": false,
    "CommitRate": 0,
    "DSN": "root@tcp(127.0.0.1:13306)/",
    "Driver": "mysql",
    "Noop": false,
    "Nagents": 5,
    "Rate": 0,
    "Time": "10s"
  },
  "GOMAXPROCS": 10,
  "QueryCount": 238001,
  "ErrorQueryCount": 0,
  "AvgQPS": 23797,
  "MaxQPS": 24977,
  "MinQPS": 21623,
  "MedianQPS": 24051.5,
  "Duration": {
    "Time": {
      "Cumulative": "49.569869935s",
      "HMean": "200.366µs",
      "Avg": "208.275µs",
      "P50": "199.75µs",
      "P75": "222.042µs",
      "P95": "288.875µs",
      "P99": "363.375µs",
      "P999": "594.208µs",
      "Long5p": "349.679µs",
      "Short5p": "142.483µs",
      "Max": "2.796209ms",
      "Min": "98.709µs",
      "Range": "2.6975ms",
      "StdDev": "54.681µs"
    },
    "Rate": {
      "Second": 4801.323875008872
    },
    "Samples": 238001,
    "Count": 238001,
    "Histogram": [
      {
        "98µs - 368µs": 235807
      },
      {
        "368µs - 638µs": 2008
      },
      {
        "638µs - 907µs": 117
      },
      {
        "907µs - 1.177ms": 19
      },
      {
        "1.177ms - 1.447ms": 9
      },
      {
        "1.447ms - 1.717ms": 4
      },
      {
        "1.717ms - 1.986ms": 2
      },
      {
        "1.986ms - 2.256ms": 3
      },
      {
        "2.256ms - 2.526ms": 12
      },
      {
        "2.526ms - 2.796ms": 20
      }
    ]
  }
}

Comment out in the data file

Lines starting with // are ignored as comments.

{"q":"select 1"}
//comment
//{"q":"select 2"}
{"q":"select 3"}

Test

docker compose up -d
make testacc

Tools to convert logs to JSON Lines