IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

UnixBenchでベンチマーク

※インストール部分を更新しました(2017.2.17)

はじめまして!ソリューションアーキテクトの藤城(@tafujish)でございます。

今回はスポットで1本書かせていただきます。というのも、6月18日発売済みのSoftware Design 2013年7月号にサーバーベンチマークの入門記事を執筆させていただきました。誌面には書ききれなかったこともいくつかあり、今回はUnixBenchの詳細について書いています。

Software Design 「自分の定規(ものさし)を持っていますか?ボトルネックを探れ!「ベンチマーク」活用テクニック」 Part2 『ベンチマークテスト入門 [サーバー編]』

UnixBenchテスト項目の詳細

UnixBenchとは、LinuxをはじめUnix系OSでは昔からよく使われている定番のベンチマークツールです。システムのベンチマークという位置づけですが、主にCPUのベンチマークとして利用可能です。

例えば、サーバーをベンチマークしようとしたとき以下のようにダウンロードし実行します。

 # yum -y install perl perl-Time-HiRes make gcc git
 # git clone https://github.com/kdlucas/byte-unixbench
 # cd byte-unixbench/UnixBench
 # ./Run

※今回はCentOS6.4 x86_64にて動作を確認しています

※Google Codeの終了に伴い、GitHubに移行されています

よく見かける、次のような結果が得られます。

 Dhrystone 2 using register variables       46969116.7 lps   (10.0 s, 7 samples)
 Double-Precision Whetstone                     2568.7 MWIPS (15.2 s, 7 samples)
 Execl Throughput                               5831.0 lps   (30.0 s, 2 samples)
 File Copy 1024 bufsize 2000 maxblocks        821455.4 KBps  (30.0 s, 2 samples)
 File Copy 256 bufsize 500 maxblocks          219797.3 KBps  (30.0 s, 2 samples)
 File Copy 4096 bufsize 8000 maxblocks       2552012.7 KBps  (30.0 s, 2 samples)
 Pipe Throughput                             2650013.3 lps   (10.0 s, 7 samples)
 Pipe-based Context Switching                 509035.3 lps   (10.0 s, 7 samples)
 Process Creation                              17778.6 lps   (30.0 s, 2 samples)
 Shell Scripts (1 concurrent)                   6910.3 lpm   (60.0 s, 2 samples)
 Shell Scripts (8 concurrent)                    941.5 lpm   (60.1 s, 2 samples)
 System Call Overhead                        2711267.2 lps   (10.0 s, 7 samples)

 System Benchmarks Index Values               BASELINE       RESULT    INDEX
 Dhrystone 2 using register variables         116700.0   46969116.7   4024.8
 Double-Precision Whetstone                       55.0       2568.7    467.0
 Execl Throughput                                 43.0       5831.0   1356.1
 File Copy 1024 bufsize 2000 maxblocks          3960.0     821455.4   2074.4
 File Copy 256 bufsize 500 maxblocks            1655.0     219797.3   1328.1
 File Copy 4096 bufsize 8000 maxblocks          5800.0    2552012.7   4400.0
 Pipe Throughput                               12440.0    2650013.3   2130.2
 Pipe-based Context Switching                   4000.0     509035.3   1272.6
 Process Creation                                126.0      17778.6   1411.0
 Shell Scripts (1 concurrent)                     42.4       6910.3   1629.8
 Shell Scripts (8 concurrent)                      6.0        941.5   1569.1
 System Call Overhead                          15000.0    2711267.2   1807.5
                                                                            
System Benchmarks Index Score 1690.9

最終的な結果は、System Benchmarks Index Scoreの値で1690.9です。各テストのIndexの結果は、Sun SPARCstation 20 SM61という1995年頃のコンピューターでの値を10として基準にしたときの値です。つまり、値が大きければ大きいほど速いということになります。

では、各テスト項目がどんな処理をしているか見ていきましょう。

Dhrystone 2 using register variables
テスト名:dhry2reg
Dhrystoneは整数演算処理の伝統的なベンチマークツールです。一般的なCPUの処理性能を見る場合に使えます。結果は一連の処理が秒間何回処理できたかです。

Double-Precision Whetstone
テスト名:whetstone-double
Whetstoneは浮動小数点数演算処理の伝統的なベンチマークツールです。HPCのような数値演算の処理性能を見る場合に使えます。結果はWhetstone独自のMWIPS(Million Whetstones Instructions Per Second)で出る、つまり秒間の処理命令数です。

Execl Throughput
テスト名:execl
execl()というプロセスイメージを置き換えるシステムコールを繰り返すテストです。OSとCPUの処理性能を見る場合に使えます。結果はこのシステムコール処理を何回繰り返せたかです。

File Copy 1024 bufsize 2000 maxblocks
テスト名:fstime
ファイルのコピー(ライト→リード)を繰り返すテストで、2MByteのファイルを1024Byteごとに処理します。昨今のコンピューターはこのサイズであれば、メモリやCPU上にキャッシュされるのでディスクの処理性能を測るには不適切で、ほぼCPUの処理性能に依存します(多少メモリの性能も影響します)。結果はKByte/秒です。

File Copy 256 bufsize 500 maxblocks
テスト名:fsbuffer
fstimeと同じテストで、500KByteのファイルを256Byteごとに処理します。

File Copy 4096 bufsize 8000 maxblocks
テスト名:fsdisk
fstimeと同じテストで、7.9MByteのファイルを4096Byteごとに処理します。

Pipe Throughput
テスト名:pipe
512Byteのデータをパイプ処理しこれを繰り返し実行することでスループットをテストします。昨今のコンピューターであれば512ByteはメモリまでいかずCPU内部で完結するので、OSとCPUの処理性能を見る場合に使えます。結果はこのパイプ処理を何回繰り返せたかです。

Pipe-based Context Switching
テスト名:pipe
2つのプロセス間を更新される値をパイプで受け渡すことで、プロセスのコンテキストスイッチ(切り替わり)を実行する。OSとCPUの処理性能を見る場合に使えます。結果はこのパイプ処理を何回繰り返せたかです。

Process Creation
テスト名:spawn
プロセスのフォークを繰り返すテストです。OSとCPUの処理性能を見る場合に使えます。結果はこのフォーク処理を何回繰り返せたかです。

System Call Overhead
テスト名:syscall
getpid()というプロセスIDを返す単純なシステムコールを繰り返し実行します。システムコールのオーバーヘッドが少ないほどたくさん実行されるのでOSとCPUの処理性能を見る場合に使えます。結果はこのシステムコールの実行を秒間何回繰り返せたかです。

Shell Scripts (1 concurrent)
テスト名:shell1
sort、od、grep、tee、wcコマンドやパイプやリダイレクトを使ったテキスト処理を繰り返します。主にCPUの処理性能に依存しますが、シェルにも依存する可能性があり、/bin/shを使います。

Shell Scripts (8 concurrent)
テスト名:shell8
shell1と同じ処理を8個並行に実行します。

以上のとおり、ほぼCPUの処理性能に依存していることがわかります。別のサーバーを比較するときは、OS、コンパイラ、シェルなど環境をできるだけ同じにするとよいでしょう。古いサーバーや今流行りのRaspberry piなどの組み込みボードをベンチマークするときは、CPU以外のメモリやディスクの性能も効いてくるでしょう。

上記のテスト項目は単体でも実行可能です。例えば、Dhyrstoneは以下の通り実行します。

 # ./Run dhry2reg
 ~略~
 Dhrystone 2 using register variables       47151899.8 lps   (10.0 s, 7 samples)

 System Benchmarks Partial Index              BASELINE       RESULT    INDEX
 Dhrystone 2 using register variables         116700.0   47151899.8   4040.4

 System Benchmarks Index Score (Partial Only)                         4040.4

./Run [テスト名1] [テスト名2] [テスト名3] ...
で指定し、複数のテストを実行することもできます。

Non-Indexテスト

上記のテストは、Indexテストと呼ばれ、SparcStationをベースにしたIndexのスコアが出てきます。実行時にはテスト名が省略されていますが、本来は以下のようになります。

 # ./Run index

上記のテスト以外にも次のようなテストがあり、これらはNon-Indexテストと呼ばれ、ベースになるスコアは出ませんが、テスト単体の結果は得られます。以下のようなテストがあります。

Shell Scripts (16 concurrent)
テスト名:shell16
shell1と同じ処理を16個並行に実行します。

File Write 1024 bufsize 2000 maxblocks
テスト名:fstime-w
File Read 1024 bufsize 2000 maxblocks
テスト名:fstime-r
File Write 256 bufsize 500 maxblocks
テスト名:fsbuffer-w
File Read 256 bufsize 500 maxblocks
テスト名:fsbuffer-r
File Write 4096 bufsize 8000 maxblocks
テスト名:fsdisk-w
File Read 4096 bufsize 8000 maxblocks
テスト名:fsdisk-r
fstimeの操作でリードのみやライトのみといった指定が可能です。

Exec System Call Overhead
テスト名:sysexec
execl()システムコールを繰り返し実行する。システムコールのオーバーヘッドが少ないほどたくさん実行されるのでOSとCPUの処理性能を見る場合に使えます。結果はこのシステムコールの実行を秒間何回繰り返せたかです。

C Compiler Throughput
テスト名:C
百数十行程度のCソースファイルのコンパイルを繰り返します。基本的にはCPUの性能に依存しますが、コンパイラの性能や挙動にも影響をうけます。

Dc: sqrt(2) to 99 decimal places
テスト名:dc
dcコマンドで平方根(ルート)の計算を繰り返します。CPUの処理性能に依存します。

Recursion Test -- Tower of Hanoi
テスト名:hanoi
ハノイの塔の計算を繰り返します。再帰的な処理を実行。CPUの処理性能に依存します。

Grep a large file (system's grep)
テスト名:grep
692KByteのファイルから特定の文字列をgrepコマンドでの処理を繰り返します。今となっては、特別大きなファイルというわけではないので、主にCPUの処理性能に依存します。

Arithoh
テスト名:arithoh
何も処理をせずループを回す処理を繰り返しますが、コンパイラや最適化オプションによってはこの処理が省略されるため計測できずエラーとなる場合があります。そのためこのテストは利用できません。

Arithmetic Test (short)
テスト名:short
Arithmetic Test (int)
テスト名:int
Arithmetic Test (long)
テスト名:long
Arithmetic Test (float)
テスト名:float
Arithmetic Test (double)
テスト名:double
四則演算をそれぞれの型の変数を使いこの処理を繰り返します。CPUの処理性能に依存します。

これらのテストをまとめたグループもあり、ファイル操作系の「fs」、シェル並行実行の「shell」、数値計算の「arithmetic」、他のものは「misc」にまとめられています。

arithmeticだとこのように実行されますが、Index ScoreはWhetstoneのみの値ですので注意してください。

 # ./Run arithmetic
 ~略~
 Arithmetic Test (double)                    1945163.5 lps   (10.0 s, 2 samples)
 Arithmetic Test (float)                     3037799.3 lps   (10.0 s, 2 samples)
 Arithmetic Test (int)                       3034368.9 lps   (10.0 s, 2 samples)
 Arithmetic Test (long)                      1380724.6 lps   (10.0 s, 2 samples)
 Arithmetic Test (short)                     3155324.8 lps   (10.0 s, 2 samples)
 Arithoh                                      175944.3 lps   (10.0 s, 2 samples)
 Double-Precision Whetstone                     2572.6 MWIPS (15.2 s, 7 samples)

 System Benchmarks Partial Index              BASELINE       RESULT    INDEX
 Double-Precision Whetstone                       55.0       2572.6    467.7

 System Benchmarks Index Score (Partial Only)                          467.7

グラフィックステスト

UnixBenchのVersion5.1からは、グラフィックスのベンチマークが追加されています。サーバーではGUI環境は使わないことが多いので普段利用する機会がないかもしれませんが、以下のように使えます。

 # yum -y install perl perl-Time-HiRes make gcc
 # yum -y install libX11-devel mesa-libGL-devel
 # curl http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz | tar zx
 # cd UnixBench
 # vi Makefile
 ~略~
  42 # GRAPHICS TESTS: Uncomment the definition of "GRAPHIC_TESTS" to enable
  43 # the building of the graphics benchmarks.  This will require the
  44 # X11 libraries on your system.
  45 #
  46 # Comment the line out to disable these tests.
  47 GRAPHIC_TESTS = defined
 ~略~
 # make
 # ./Run graphics

ポイントは、必要なパッケージを追加インストールすることと、Makefileにて「GRAPHIC_TESTS = defined」をアンコメントしたあとに、makeする必要があります。実行時は、graphicsと指定します。これで2Dと3Dのベンチマークが実施されます。結果はこのように出ます。

 2D graphics: aa polygons                       4673.9 score (45.4 s, 2 samples)
 2D graphics: ellipses                          2253.5 score (51.8 s, 2 samples)
 2D graphics: images and blits                149813.1 score (46.9 s, 2 samples)
 2D graphics: rectangles                        3267.4 score (49.4 s, 2 samples)
 2D graphics: text                            142569.6 score (40.4 s, 2 samples)
 2D graphics: windows                           1779.9 score (53.6 s, 2 samples)
 3D graphics: gears                              527.7 fps   (20.0 s, 2 samples)

 2D Graphics Benchmarks Index Values          BASELINE       RESULT    INDEX
 2D graphics: aa polygons                         15.0       4673.9   3116.0
 2D graphics: ellipses                            15.0       2253.5   1502.4
 2D graphics: images and blits                    15.0     149813.1  99875.4
 2D graphics: rectangles                          15.0       3267.4   2178.3
 2D graphics: text                                15.0     142569.6  95046.4
 2D graphics: windows                             15.0       1779.9   1186.6

 2D Graphics Benchmarks Index Score                                   6972.1

 3D Graphics Benchmarks Index Values          BASELINE       RESULT    INDEX
 3D graphics: gears                               33.4        527.7    158.0

 3D Graphics Benchmarks Index Score                                    158.0

2D
テスト名:2d-rects、2d-lines、2d-circle、2d-ellipse、2d-shapes、2d-aashapes、2d-polys、2d-text、2d-blit、2d-window
10種類のテストを実施します。実際にはx11perfコマンドを実行しています。

3D
テスト名:ubgears
OpenGLを使ったテストを実施します。glxgearsコマンドをUnixBenchにポートしたものを実行しています。

いずれのテストも基本的なグラフィックス処理となります。ちゃんと確認していないですが、3Dの方は動きが怪しいので参考程度にするのがよろしいかと。

並列(マルチCPU)テスト

UnixBenchのVersion5.1からは、マルチCPUつまり並列実行によるベンチマークに対応しています。並列テストでは、各テストの同じものを実行します。そのため、ほとんどは独立性が高いテストとなるので、CPUコア分の性能向上が見込めます。

一方で、性能が向上しないテストもあります。一つが、ファイル操作のテストです。これは複数のテストで同じファイルを操作するために、並列性が活かせません。もう一つが、シェルのテストです。shell8の場合、元々8個同時に実行しているため、2並列で実行すると16個の処理が走ることになりコア数に応じて性能が向上するわけではありません。

UnixBenchをデフォルトで実行すると、最初に1並列、次に論理コア数分の並列数で実行します。この並列数は-cオプションで指定可能で、例えば4並列の場合は以下のようになります。

 # ./Run -c 4

-c NUMBER
並列実行する数を指定します。

その他オプション

-i NUMBER
各テストを何回繰り返すか指定します。
デフォルトだと、実行時間が短いテストは10回、長いテストは3回繰り返し実行します。
なお、複数回実行したときは、実行回数に応じて悪い結果から順に切り捨てられます。

-v
各テストの実行結果など詳細を表示します。

-q
各テストの実行結果など詳細を表示します。

まとめ

UnixBenchには大きく分けて3つのテストがあります。Index、Non-Index、Graphicsです。一般的なサーバーにてベンチマークする場合は、デフォルトのIndexのみで十分でしょう。また、各テストのほとんどがCPUの処理性能に依存します。古いサーバーなど環境によってはCPU以外にメモリやディスクの処理性能に影響をうける場合もありますので注意しましょう。

もし今回の評判がよければいくつかの環境で実行した結果を比較考察してみたいと思います。つづく・・・

<連載記事>

Copyright © IDC Frontier Inc.