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

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

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

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

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

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

表2 SysBenchで提供されているベンチマークテスト
テスト名説明
fileioファイルI/O性能に関するテスト
cpuCPU性能に関するテスト
memoryメモリ性能に関するテスト
threadsスレッド関連の処理性能に関するテスト
mutexMutex関連の処理に関するテスト
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トランザクションが実行できたという結果となった。