CPUやメモリなどのシステム性能を比較するベンチマークツール 2ページ
データベースの性能測定にも対応する「SysBench」
続いて紹介するSysBenchも、CPUやメモリなど複数の項目についてのベンチマークテストを実行できる総合ベンチマークテストツールだ。CPUやメモリ、ストレージのテストだけでなく、データベースのトランザクション処理に関するベンチマークテスト機能も備えているのが特徴となる。
SysBenchのインストールと基本的なテストの実行
SysBenchはDebianやUbuntuではsysbenchパッケージとしてバイナリパッケージが提供されている。また、RHELやその互換環境では、EPELからsysbenchパッケージが提供されている。
SysBenchでは、表2の6種類のベンチマークテストが提供されている。
テスト名 | 説明 |
---|---|
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)。
モード | 説明 |
---|---|
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トランザクションが実行できたという結果となった。