MySQL性能評価ツールSysBenchの実践ガイド

データベースの性能を定量的に把握することは、システムの安定運用に欠かせません。本記事では、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=NDELETE/INSERT組み合わせ数1
--auto_inc=on/offAUTO_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:スレッド間のイベント数・実行時間のばらつき

これらの値を基に、システム構成のボトルネックを特定し、チューニングの効果を検証できます。

タグ: sysbench MySQL ベンチマーク パフォーマンステスト OLTP

7月31日 00:12 投稿