CPUやメモリなどのシステム性能を比較するベンチマークツール

データベースの性能測定にも対応する「SysBench」

続いて紹介するSysBenchも、CPUやメモリなど複数の項目についてのベンチマークテストを実行できる総合ベンチマークテストツールだ。CPUやメモリ、ストレージのテストだけでなく、データベースのトランザクション処理に関するベンチマークテスト機能も備えているのが特徴となる。

SysBenchのインストールと基本的なテストの実行

SysBenchはDebianやUbuntuではsysbenchパッケージとしてバイナリパッケージが提供されている。また、RHELやその互換環境では、EPELからsysbenchパッケージが提供されている。

SysBenchでは、表2の6種類のベンチマークテストが提供されている。

表2 SysBenchで提供されているベンチマークテスト
テスト名 説明
fileio ファイルI/O性能に関するテスト
cpu CPU性能に関するテスト
memory メモリ性能に関するテスト
threads スレッド関連の処理性能に関するテスト
mutex Mutex関連の処理に関するテスト
oltp データベースのトランザクション性能に関するテスト

たとえば、cpuテストを行うには次のように「--test=cpu run」オプション付きでsysbenchを実行する。

$ sysbench --test=cpu run
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
total time: 8.7669s
total number of events: 10000
total time taken by event execution: 8.7660
per-request statistics:
min: 0.87ms
avg: 0.88ms
max: 1.79ms
approx. 95 percentile: 0.88ms

Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 8.7660/0.00

SysBenchのcpuテストでは、指定した最大探索数(デフォルトでは10000)以下の素数を数えるという処理を行い、それにかかった時間を測定するという処理を行っている。この例の場合、8.7669秒かかっているという結果となっているが、この時間が短いほどCPUの処理能力が高いということになる。

なお、SysBenchでは素数を見つけるアルゴリズムとして以下のような非常に単純なものを採用している。

for(c=3; c < max_prime; c++)
{
t = sqrt(c);
for(l = 2; l <= t; l++)
if (c % l == 0)
break;
if (l > t )
n++;
}

ここで、max_prime変数は指定した最大探索数、nは発見した素数の数を格納する変数だ。ここから分かるとおり、このベンチマークテストでは平方根演算および剰余演算、整数演算とその比較演算の性能が結果に影響するものになっている。

また、メモリのベンチマークを行うには「--test=memory run」オプション付きでsysbenchを実行すれば良い。

$ sysbench --test=memory run
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (2268773.95 ops/sec)

102400.00 MB transferred (2215.60 MB/sec)

Test execution summary:
total time: 46.2177s
total number of events: 104857600
total time taken by event execution: 39.1137
per-request statistics:
min: 0.00ms
avg: 0.00ms
max: 0.10ms
approx. 95 percentile: 0.00ms

Threads fairness:
events (avg/stddev): 104857600.0000/0.00
execution time (avg/stddev): 39.1137/0.00

メモリのベンチマークテストでは、メモリに対する連続した書き込みおよび読み出しを行ってそれにかかった時間を測定している。この例の場合、合計100Gの書き込みが行われ、それにかかった時間は46.2177秒という結果となっている。なお、この例では書き込みテストを行っているが、「--memory-oper=read」オプションを付けて実行することで読み込みテストを行うことが可能だ。また、デフォルトでは1KBごとに書き込みを実行しているが、これは--memory-block-sizeオプションで変更できる。また、書き込み/読み出しを行う合計サイズは--memory-total-sizeオプションで変更可能だ。

「--test=fileio」オプションでは、ファイルの読み書きに関するベンチマークを行える。この場合、「--file=test-mode」オプションでテストモードを指定する(表3)。

表3 SysBenchのfileioテストで指定できるテストモード
モード 説明
seqwr シーケンシャル書き込み
seqrewr シーケンシャル読み書き
seqrd シーケンシャル読み出し
rndrd ランダム読み出し
rndwr ランダム書き込み
rndrw ランダム読み書き

たとえば、シーケンシャル書き込みの性能を測定したいなら次のように「--test=fileio --file-test-mode=seqwr」オプションを指定する。

$ sysbench --test=fileio --file-test-mode=seqwr run
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential write (creation) test
Threads started!
Done.

Operations performed: 0 Read, 131072 Write, 128 Other = 131200 Total
Read 0b Written 2Gb Total transferred 2Gb (17.295Mb/sec)
1106.87 Requests/sec executed

Test execution summary:
total time: 118.4163s
total number of events: 131072
total time taken by event execution: 93.2939
per-request statistics:
min: 0.01ms
avg: 0.71ms
max: 5020.22ms
approx. 95 percentile: 0.02ms

Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 93.2939/0.00

この例の場合、16MBのファイルを128個、合計2GBの書き込みを行い、その処理時間は118.4163秒となっている(出力の単位は「b」となっているが、実際の処理単位はビットではなくバイトである点に注意)。また、各ファイルのサイズは「--file-total-size」オプションで、出力するファイル総数は「--file-num」オプションで変更可能だ。

なお、fileioテストの実行後にはベンチマークを実行したディレクトリ内に作業ファイルが残されるが、これらは「sysbench --test=fileio cleanup」コマンドを実行することで削除できる。

$ sysbench --test=fileio cleanup
sysbench 0.4.12: multi-threaded system evaluation benchmark

Removing test files...

SysBenchでmysqlのベンチマーク

sysbecnにはデータベースのトランザクション性能を測定する、oltpというテストも用意されている。このテストではMySQLおよびPostgreSQLを対象に、データベースへの読み書きを行ってその性能を測定できる。

oltpテストを行うには、あらかじめデータベースにベンチマーク用のユーザーとデータベースを作成しておく必要がある。使用するユーザー名やデータベース名はコマンドラインオプションで変更できるが、デフォルトではともに「sbtest」になっている。たとえばMySQLの場合、以下のようにこのユーザーとデータベースを作成しておけば良い。

$ mysql -u root -p


mysql> CREATE DATABASE sbtest;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE USER sbtest;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON sbtest.* TO 'sbtest'@'localhost' IDENTIFIED BY 'sbtest';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

SysBenchでoltpテストを実行する際には、「--db-driver=」オプションで対象のデータベースを指定する。たとえばMySQLを利用する場合、「--db-driver=mysql」を指定すればよい。また、接続に使用するパスワードはMySQLの場合「--mysql-password=」オプション、PostgreSQLの場合「--pgsql-password=」オプションで指定する。

また、ベンチマークテストの実行前には「sysbench prepare」コマンドを実行してテーブルなどの作成を行っておく必要がある。たとえばMySQLでsbtestユーザーのパスワードが「sbtest」の場合、次のようにする。

$ sysbench --test=oltp --db-driver=mysql --mysql-password=sbtest prepare

続いて、「sysbench run」コマンドを実行するとベンチマークテストが実行される。

$ sysbench --test=oltp --db-driver=mysql --mysql-password=sbtest run
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 10000
Threads started!
Done.

OLTP test statistics:
queries performed:
read: 140000
write: 50000
other: 20000
total: 210000
transactions: 10000 (25.72 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 190000 (488.63 per sec.)
other operations: 20000 (51.43 per sec.)

Test execution summary:
total time: 388.8436s
total number of events: 10000
total time taken by event execution: 388.7773
per-request statistics:
min: 28.61ms
avg: 38.88ms
max: 178.72ms
approx. 95 percentile: 44.83ms

Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 388.7773/0.00

ベンチマークテスト結果は、一定量のトランザクション処理をどれだけの時間で実行できたかという形で表示される。この例の場合、すべての処理が完了するまでには388.8436秒がかかっており、1リクエストの処理時間は平均38.88ミリ秒、また毎秒当たり25.72トランザクションが実行できたという結果となった。

>>次ページ:総合ベンチマークツール「Phoronix Test Suite」

おしらせ