mysqlslapでInnoDBに並列300クライアントの負荷テストをかけてみた

  • MySQL
  • Load Test
  • InnoDB

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何をやったか

MySQLに標準で入っている mysqlslap を使って、InnoDBテーブルに対する負荷テストをやってみた。別途ベンチマークツールを用意しなくても、MySQLクライアントが入っていればすぐ使える。

使ったコマンドはこれ。

mysqlslap -u <username> -p -h <hostname> \
--engine=innodb \
--concurrency=300 \
--iterations=30 \
--auto-generate-sql \
--auto-generate-sql-load-type=mixed \
--number-char-cols=30 \
--number-int-cols=20 \
--auto-generate-sql-write-number=100000

--auto-generate-sql を付けると、テーブル定義もINSERT文もSELECT文もmysqlslap側で自動生成してくれる。CREATE TABLEやクエリを手書きしなくていいのが楽。

オプションの内容

オプション 意味
-u <username> 接続に使うMySQLユーザー名
-p パスワード入力を求める(値を直接書かない)
-h <hostname> 接続先ホスト
--engine=innodb テーブル作成に使うストレージエンジン
--concurrency=300 同時に動かすクライアント数(並列数)
--iterations=30 テストを繰り返す回数
--auto-generate-sql CREATE/INSERT/SELECTを自動生成する
--auto-generate-sql-load-type=mixed 負荷の種類。read(SELECTのみ)、write(INSERTのみ)、key(PK検索)、update(PK更新)、mixed(INSERTとSELECTを半々)から選べる。デフォルトもmixedなので明示しなくても同じ挙動
--number-char-cols=30 自動生成テーブルのVARCHAR列数
--number-int-cols=20 自動生成テーブルのINT列数
--auto-generate-sql-write-number=100000 各スレッドが実行するINSERT行数

気づいたこと

  • mixed はデフォルト値なので、--auto-generate-sql-load-type=mixed は書かなくても同じ結果になる。明示しておくと後で読んだときに意図が分かりやすいのでそのままにした。
  • --auto-generate-sql-write-number は mixed / write のときのINSERT側に効くオプションで、read / key だけのテストでは使われない。
  • --concurrency=300 はそれなりに重い負荷になるので、本番相当の環境で叩く前にDB側の max_connections や接続元のリソースを確認しておいたほうがいい。

テスト後の後片付け

--auto-generate-sql でテーブルを自動作成した場合、テスト終了時にmysqlslapが自動でスキーマをDROPする。残しておきたい場合は --no-drop を付ける必要がある。

mysqlslap -u <username> -p -h <hostname> \
--engine=innodb \
--concurrency=300 \
--iterations=30 \
--auto-generate-sql \
--no-drop