データベースの性能を定量的に把握することは、システムの安定運用に欠かせません。本記事では、MySQLのベンチマークテストの基本概念と、SysBenchを用いた具体的な評価方法を詳しく解説します。
ベンチマークテストとストレステストの違い
- ベンチマークテスト:データベースの性能指標を定量的・再現可能・比較可能な形で測定するテストです。業務ロジックを考慮せず、ツールで生成した疑似データを用いて行います。
- ストレステスト:実際の業務シナリオ(例:カート処理)を想定し、実データに近い環境で負荷をかけます。
Webアプリケーションの多くはデータベースがボトルネックになりがちです。ネットワーク、ロードバランサー、アプリケーションサーバー、キャッシュなどは水平スケーリングで性能向上が容易ですが、MySQLではデータ整合性の制約から、単純にマシンを増やすだけでは書き込み性能を改善できません。ベンチマークテストにより、現在の設定(ハードウェア、OS、DB設定)での性能限界を把握し、必要に応じてチューニングを行います。
主な性能指標
| 指標 | 説明 |
|---|---|
| QPS(Queries Per Second) | 1秒あたりに実行されるSQL文の数(INSERT, SELECT, UPDATE, DELETEを含む) |
| TPS(Transactions Per Second) | 1秒あたりに処理されるトランザクション数 |
| 応答時間 | 平均、最小、最大、パーセンタイル(例:95パーセンタイル) |
| 同時実行数 | 同時に処理されるクエリ要求の数 |
SysBenchの概要
SysBenchはオープンソースのマルチスレッド性能テストツールで、CPU、メモリ、スレッド、I/O、データベース(MySQL/Oracle/PostgreSQL対応)の性能測定が可能です。
主なテストモード:
- CPU演算性能テスト
- ディスクI/O性能テスト
- スレッドスケジューリングテスト
- メモリアクセス速度テスト
- POSIXスレッド性能テスト
- データベースOLTPベンチマーク(
/usr/share/sysbench/配下のLuaスクリプトを利用) - カスタムLuaスクリプトによる任意テスト
インストール
# EPELリポジトリの有効化(CentOS/RHEL系)
sudo yum install -y epel-release
# SysBenchのインストール
sudo yum install -y sysbench
# バージョン確認
sysbench --version
SysBenchクライアントのカーネル最適化
全てのCPUコアをネットワークパケット処理に活用するため、以下の設定を行います(例:32コアの場合 ffffffff、8コアなら ff)。
sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ffffffff > $x/rps_cpus; done'
sudo sh -c "echo 32768 > /proc/sys/net/core/rps_sock_flow_entries"
sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt"
sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt"
基本的なコマンド書式とオプション
書式:sysbench [options]... [testname] [command]
コマンド:prepare(データ準備)、run(テスト実行)、cleanup(後片付け)、help(ヘルプ)
代表的な一般オプション:
| オプション | 説明 | デフォルト値 |
|---|---|---|
--threads=N | スレッド数 | 1 |
--events=N | 最大イベント数(0=無制限) | 0 |
--time=N | 最大実行時間(秒) | 10 |
--report-interval=N | 指定秒数ごとに中間統計を出力 | 0(出力なし) |
--rand-type=STRING | 乱数分布(uniform, gaussian, special, pareto) | special |
各テストの詳しい手順
ファイルI/Oテスト
パラメータ例
| パラメータ | 説明 | デフォルト |
|---|---|---|
--file-num=N | テストファイル数 | 128 |
--file-block-size=SIZE | ブロックサイズ | 16K |
--file-total-size=SIZE | ファイル合計サイズ | 2G |
--file-test-mode=STRING | テストモード(seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw) | (必須指定) |
--file-extra-flags=direct | ダイレクトI/Oを有効化 | (未指定) |
準備
sysbench fileio --file-num=2 --file-block-size=1024 --file-total-size=1G prepare
実行例(順次読み書き)
sysbench fileio \
--file-num=2 --file-block-size=1024 --file-total-size=1G \
--file-test-mode=seqrewr --time=30 --events=10000 \
--threads=4 --file-fsync-freq=200 --file-extra-flags=direct run
ランダム読み書き
sysbench fileio \
--file-num=2 --file-block-size=1024 --file-total-size=1G \
--file-test-mode=rndrw --time=30 --events=10000 \
--threads=4 --file-fsync-freq=200 --file-extra-flags=direct run
後処理
sysbench fileio --file-total-size=1G cleanup
出力例の見方
File operations:
reads/s: 1411.72
writes/s: 941.22
fsyncs/s: 25.19
Throughput:
read, MiB/s: 13.79
written, MiB/s: 9.19
General statistics:
total time: 4.2069s
total number of events: 10000
Latency (ms):
min: 0.04
avg: 1.68
max: 45.76
95th percentile: 3.96
Threads fairness:
events (avg/stddev): 2500.0000/26.24
CPUテスト
オプション
--cpu-max-prime=N | 素数生成上限 | 10000 |
実行例
sysbench cpu --cpu-max-prime=20000 --threads=2 run
出力例
CPU speed:
events per second: 1955.47
General statistics:
total time: 10.0006s
total number of events: 19559
Latency (ms):
min: 0.87
avg: 1.02
max: 1.71
95th percentile: 1.67
Threads fairness:
events (avg/stddev): 9779.5000/6.50
性能比較では、同一条件でevents数が多い方が高性能、同一events数なら時間が短い方が高性能です。
スレッド性能テスト
sysbench threads --threads=4 --thread-yields=12 --thread-locks=2 run
ミューテックス性能テスト
sysbench mutex --mutex-num=2048 --mutex-locks=5000 --mutex-loops=5000 run
メモリ性能テスト
# 読み取りテスト
sysbench memory --threads=2 --events=10000 --memory-total-size=1G \
--memory-block-size=8K --memory-oper=read run
# 書き込みテスト
sysbench memory --threads=2 --events=100000 --memory-total-size=50G \
--memory-block-size=8K --memory-oper=write run
データベースOLTPテスト
MySQL向けOLTPテストでは、/usr/share/sysbench/ にあるLuaスクリプトを使用します。
代表的なLuaスクリプト
| スクリプト | 内容 |
|---|---|
oltp_read_only.lua | 読み取り専用テスト |
oltp_read_write.lua | 読み書き混合テスト |
oltp_write_only.lua | 書き込み専用テスト |
oltp_insert.lua | 単純INSERTテスト |
oltp_point_select.lua | 等価SELECTテスト |
select_random_points.lua | ランダム等価SELECT |
select_random_ranges.lua | ランダム範囲SELECT |
主なスクリプトパラメータ
| パラメータ | 説明 | デフォルト |
|---|---|---|
--table_size=N | テーブルあたりの行数 | 10000 |
--tables=N | テーブル数 | 1 |
--point_selects=N | トランザクションあたりの等価SELECT数 | 10 |
--range_selects=on/off | 範囲SELECTの有効化 | on |
--index_updates=N | インデックスUPDATE数 | 1 |
--non_index_updates=N | 非インデックスUPDATE数 | 1 |
--delete_inserts=N | DELETE/INSERT組み合わせ数 | 1 |
--auto_inc=on/off | AUTO_INCREMENT列の使用 | on |
--skip_trx=on/off | 明示的トランザクションを省略 | off |
--mysql_storage_engine=STRING | ストレージエンジン | innodb |
テスト手順例
1. データ準備
sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=pass123 \
--mysql-db=test_db \
--table_size=25000 \
--tables=250 \
prepare
2. 読み取り専用テスト(等価SELECT)
sysbench oltp_read_only \
--db-driver=mysql \
--mysql-host=... \
--mysql-user=... \
--mysql-db=... \
--table_size=25000 \
--tables=250 \
--time=600 \
--threads=512 \
--percentile=95 \
--range_selects=0 \
--skip-trx=1 \
--report-interval=1 \
run
3. 書き込み専用テスト
sysbench oltp_write_only \
--db-driver=mysql \
--mysql-host=... \
--mysql-user=... \
--mysql-db=... \
--table_size=25000 \
--tables=250 \
--time=600 \
--threads=192 \
--percentile=95 \
--report-interval=1 \
run
4. 読み書き混合テスト(範囲SELECTなし)
sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=... \
--mysql-user=... \
--mysql-db=... \
--table_size=25000 \
--tables=250 \
--time=600 \
--threads=128 \
--percentile=95 \
--range_selects=0 \
--report-interval=1 \
run
5. テスト後クリーンアップ
sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=... \
--mysql-user=... \
--mysql-db=... \
cleanup
出力結果の解釈
典型的な出力では、以下の項目が表示されます。
- SQL statistics:各SQLタイプの実行回数と比率
- General statistics:総時間、総イベント数
- Latency:最小・平均・最大・95パーセンタイル応答時間
- Threads fairness:スレッド間のイベント数・実行時間のばらつき
これらの値を基に、システム構成のボトルネックを特定し、チューニングの効果を検証できます。