qrnである程度知見がたまったのでmysqlslapのGo版みたいなものを書いた。
単純なワークロードのタイプを指定できて、実行するクエリを自動生成できるやつ。 生成するクエリはmysqlslapと大体おなじような感じで、以下のような違いがある。
- レートリミットがかけられる。逆に「何回クエリを実行」というオプションはない
- 自動生成するクエリは実行時に生成してメモリにロードしない
- qpsが100万とか1000万とかになったら問題になるかも
- 結果レポートがJSON
--auto-generate-sql-load-type
のread
はフルスキャンでユースケースが少なそうだったので実装しない
Usage
$ qlap -dsn root:@/ -nagents 3 -rate 100 -time 10 \ -auto-generate-sql -auto-generate-sql-load-type mixed \ -number-int-cols 3 -number-char-cols 3
のような感じでコマンドを実行すると
- 並列数: 3
- qpsの上限: 100
- テスト時間は10秒
- SQLは自動生成
- ワークロードはselect(key)とinsertを1:1
- intのカラム数: 3
- varcharのカラム数: 3
という感じでDBとテーブル作って負荷テストを実行する。
こういうクエリが流れる。
2021-04-05T11:57:18.491610Z 56 Query CREATE DATABASE `qlap` 2021-04-05T11:57:18.492202Z 56 Query USE `qlap` 2021-04-05T11:57:18.492378Z 56 Query CREATE TABLE t1 (id SERIAL, intcol1 INT(32), intcol2 INT(32), intcol3 INT(32), charcol1 VARCHAR(128), charcol2 VARCHAR(128), charcol3 VARCHAR(128)) 2021-04-05T11:57:18.519544Z 56 Query INSERT INTO t1 VALUES (NULL,953375677,1345621682,2029700311,'JHmVynWl3FRBBtwlDo xiXUEYEQUSG5YMXbXR23Rns191q0sNlLVxfc9luZ7OLtxROpkYozAZv6A8ZqOWdRrUhzwyqbegL1Fq9Zi7eEbckVbsp8g0pyhkzfbfOwUXHBsX','nBDEKISedaPGFi JCJj7kbb9J3LhPScGbzXaXDnettwnNBYrfxYyLyUluhawZND12s6PwOwwVWrYlLpeo413y6oMk3mfCyxyF4XZwcGvxjMHMt81vSrVXePUJuXv6OaMP','7YVykjuPnG ltArdBpy7SS16aJeaxRCzEqeqrkZRPymJTDjkPRzJkJYm6WRLtT0CNTuBW8HNODJmD7W2jz386cg6TcZDbR88pQNXSRXN4HjgNh16wyVRXMu12YxRJM8rU') 2021-04-05T11:57:18.520344Z 56 Query INSERT INTO t1 VALUES (NULL,411811214,1348318636,684257996,'Tys207WxUhcK1v8jXAs ... 2021-04-05T11:57:18.543225Z 61 Query SELECT 'agent(0) start: token=bf9716b4-c9c8-4539-9295-701cc46daa21' 2021-04-05T11:57:18.543263Z 62 Query SELECT 'agent(1) start: token=bf9716b4-c9c8-4539-9295-701cc46daa21' 2021-04-05T11:57:18.543301Z 60 Query SELECT intcol1,intcol2,intcol3,charcol1,charcol2,charcol3 FROM t1 WHERE id = 60 2021-04-05T11:57:18.543337Z 61 Query SELECT intcol1,intcol2,intcol3,charcol1,charcol2,charcol3 FROM t1 WHERE id = 77 2021-04-05T11:57:18.543359Z 62 Query SELECT intcol1,intcol2,intcol3,charcol1,charcol2,charcol3 FROM t1 WHERE id = 8 2021-04-05T11:57:18.553569Z 61 Query INSERT INTO t1 VALUES (NULL,440504017,1314478656,374979147,'BwukJykBzxQ7GazScoB
結果レポートは以下のような感じ。
{ "StartedAt": "2021-04-05T20:47:48.122543+09:00", "FinishedAt": "2021-04-05T20:47:58.140224+09:00", "ElapsedTime": 10, "NAgents": 3, "Rate": 100, "AutoGenerateSql": true, "NumberPrePopulatedData": 100, "DropExistingDatabase": false, "Engine": "", "LoadType": "mixed", "NumberSecondaryIndexes": 0, "CommitRate": 0, "NumberIntCols": 3, "IntColsIndex": false, "NumberCharCols": 3, "CharColsIndex": false, "Query": "", "PreQueries": null, "Token": "bf9716b4-c9c8-4539-9295-701cc46daa21", "Queries": 2930, "QPS": 292.4863396144265, "MaxQPS": 305, "MinQPS": 202, "MedianQPS": 303, "ExpectedQPS": 300, "Response": { "Time": { "Cumulative": "1.70378355s", "HMean": "499.554µs", "Avg": "581.496µs", "P50": "535.414µs", "P75": "703.491µs", "P95": "951.235µs", "P99": "1.224525ms", "P999": "3.198177ms", "Long5p": "1.242647ms", "Short5p": "249.39µs", "Max": "7.235566ms", "Min": "145.575µs", "Range": "7.089991ms", "StdDev": "274.566µs" }, "Rate": { "Second": 1719.7020126177413 }, "Samples": 2930, "Count": 2930, "Histogram": [ { "145µs - 854µs": 2610 }, { "854µs - 1.563ms": 312 }, { "1.563ms - 2.272ms": 1 }, { "2.272ms - 2.981ms": 1 }, { "2.981ms - 3.69ms": 5 }, { "3.69ms - 4.399ms": 1 }, { "4.399ms - 5.108ms": 0 }, { "5.108ms - 5.817ms": 0 }, { "5.817ms - 6.526ms": 0 } ] } }
mysqlslapを使っているなら、同じ感覚で使えると思う。