LinuxのDISK,CPUベンチマークを確認する


Linux環境でのベンチマークについて勉強する機会があったのでメモ。

## 環境

OS: CentOS 7.0 (on VirtualBox)

## DISK

### 代表的な指標

- IOPS(Input/Output Per Second): 1秒間のI/O数。
- bytes/sec: 1秒間当たりのデータ転送量。

### fioによるベンチマーク

fio - Flexible IO Testerを利用する。

ダウンロード元：http://git.kernel.dk/?p=fio.git;a=summary

#### 事前準備
fioのテストはデフォルトでは同期I/Oを計測する。
ここでは非同期I/Oでのベンチマークを見るためlibaioを予めインストール。

```
$ sudo yum -y install libaio-devel
$ wget http://brick.kernel.dk/snaps/fio-2.2.4.tar.gz
```

#### 解凍&ビルド

```
$ tar xzvf fio-2.2.4.tar.gz
$ cd fio-2.2.4
$ make
$ sudo make install
```

#### 設定ファイルの作成
読み込ませるjob fileとして次の通り設定。詳細は`man fio`。

```
$ vi myjob.fio
[Sequential-Read] # jobの名前
rw=read           # シーケンシャルでreadする
directory=/tmp/   # ベンチマークで使うディレクトリ
size=100m         # ベンチマークで使用するデータサイズ。キャッシュサイズを考慮して決める。
ioengine=libaio   # 非同期I/Oでテストする。指定しないとsync(同期I/O)になる。

[Sequential-Write]
rw=write          # シーケンシャルでwriteする
directory=/tmp/
size=100m
ioengine=libaio

[Random-Read]
rw=randread       # ランダムでreadする
directory=/tmp/
size=100m
ioengine=libaio

[Random-Write]
rw=randwrite      # ランダムでwriteする
directory=/tmp/
size=100m
ioengine=libaio
```

#### 留意点

- sizeの値に注意。キャッシュが働くため、測定結果は単純なディスク自体のI/Oではない。
 - 想定されるのがキャッシュに乗るサイズのI/Oならキャッシュより小さく。
 - 想定されるのがキャッシュに乗らないサイズの場合はキャッシュより大きく設定。
- シーケンシャルを重視するかランダムを重視するか予め決めておく。
 - 比較的大きめのファイル書き込みではシーケンシャルの結果を重視。
 - データベースのように細かい書き込みが多発する場合はランダムの結果を重視。

#### 結果例

上の設定ファイルで実行した結果のうち、Randam-Readを見てみる。
IOPSは2754。もちろん、この結果が良いか悪いかは要件による。

```
Random-Read: (groupid=0, jobs=1): err= 0: pid=8344: Sun Jan 11 15:17:41 2015
  read : io=102400KB, bw=11019KB/s, iops=2754, runt=  9293msec
    slat (usec): min=68, max=1330.5K, avg=358.89, stdev=8803.86
    clat (usec): min=0, max=33, avg= 0.87, stdev= 0.49
     lat (usec): min=68, max=1330.5K, avg=360.19, stdev=8803.89
    clat percentiles (usec):
     |  1.00th=[    0],  5.00th=[    0], 10.00th=[    0], 20.00th=[    1],
     | 30.00th=[    1], 40.00th=[    1], 50.00th=[    1], 60.00th=[    1],
     | 70.00th=[    1], 80.00th=[    1], 90.00th=[    1], 95.00th=[    1],
     | 99.00th=[    2], 99.50th=[    2], 99.90th=[    4], 99.95th=[    5],
     | 99.99th=[   12]
    bw (KB  /s): min=  325, max=15224, per=54.41%, avg=11989.81, stdev=4502.52
    lat (usec) : 2=98.27%, 4=1.62%, 10=0.10%, 20=0.02%, 50=0.01%
  cpu          : usr=0.13%, sys=35.64%, ctx=25630, majf=0, minf=28
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=25600/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1
```

## 演算処理（CPU）

### 代表的な指標

- FLOPS(Floating-point Operations Per Second): 1秒間に実行できる浮動小数点計算数。 
- MIPS(Million Istructions Per Second): 1秒間に実行できる命令数。

### 簡易的な確認方法 /proc/cpuinfo

```
$ cat /proc/cpuinfo
---
bogomips	: 5250.53
---
```

| 項目 | 意味 |
|:----|:----|
|bogomips | Bogo(簡易的な、という意味) Million Instructions Per Second（秒間処理命令数(単位:100万回)）<br>5250.53 なら 1秒間に52億5053万回命令を実行できる。 |

## UnixBenchによる総合ベンチマーク

UnixBenchは最初のバージョンが1983年に作られた歴史あるベンチマークソフト。
ダウンロード元：http://code.google.com/p/byte-unixbench/

- マルチコアの場合は1CPUで実行したあとに全CPUで実行し両方の結果が表示される。
- CPUそのもののベンチマークではなくOSやライブラリ、コンパイラに依存する。
- ベンチマークの結果として生の数値以外に比較対象となるマシン（＊）のデータ、総合評価の値が提供される。<br>（＊）Sun SPARCstation 20 SM 61 (1995年)

実行されるテストの概要

|テスト | 説明 |
|:-----|:-----|
| Dhrystone | 文字列操作のパフォーマンス計測。浮動小数点演算は含まない。 |
| Whetstone | 浮動小数点計算のパフォーマンス計測。 |
| Execl Throughput | 1秒間に何回[execl](http://unixhelp.ed.ac.uk/CGI/man-cgi?execl+3)（プロセスの置き換え）を呼び出せるかを計測。|
| File Copy | 様々なバッファサイズで単位時間(デフォルト10秒)に可能なread,write,copyを計測。|
| Pipe Throughput | 1秒間に何回512bytesのデータをpipeに送り応答をreadできるか計測。|
| Pipe-based Context Switching | 2つのプロセスがpipeを通して整数値をやりとりする際のスループットを計測。 |
| Process Creation | 直ちに終了する子プロセスを何回もforkするテスト。<br>OSのプロセス生成に関する実装の比較に用いられる。|
| Shell Scripts | データ変換処理をするシェルスクリプトを並列起動し(1,2,4,8並列)、1分間に開始/停止を何回繰り返せるか計測。 |
| System Call Overhead | システムコールにかかるコストの見積もりテスト。<br>(内部ではgetpidをコールしている) |
| Graphical Tests | 2D, 3Dグラフィック描画の簡易テスト。 |

#### 事前準備

```
$ sudo yum -y install perl perl-Time-HiRes gcc
$ wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
```

#### 解凍 & ビルドと実行(Run)

```
$ tar xzvf UnixBench5.1.3.tgz
$ cd UnixBench && ./Run
```

#### 結果例

| 項目 | 説明 |
|:----|:----|
| BASELINE | SPARCstation20 SM 61 の処理性能を表している固定値。 |
| RESULT | ベンチマークを実行したマシンの結果。|
| INDEX  | BASELINEとRESULTから導き出されたスコア。|

```
========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: localhost.localdomain: GNU/Linux
   OS: GNU/Linux -- 3.10.0-123.el7.x86_64 -- #1 SMP Mon Jun 30 12:09:22 UTC 2014
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i5-4288U CPU @ 2.60GHz (5250.5 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   13:02:00 up 1 day, 15:53,  1 user,  load average: 0.71, 0.23, 0.11; runlevel 3

------------------------------------------------------------------------
Benchmark Run: 日  1月 11 2015 13:02:00 - 13:30:05
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       32221732.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     4232.1 MWIPS (9.8 s, 7 samples)
Execl Throughput                               3295.3 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        916073.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          272967.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2171906.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1697464.4 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 295175.0 lps   (10.0 s, 7 samples)
Process Creation                              11459.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4231.7 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    551.2 lpm   (60.1 s, 2 samples)
System Call Overhead                        2793989.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   32221732.5   2761.1
Double-Precision Whetstone                       55.0       4232.1    769.5
Execl Throughput                                 43.0       3295.3    766.3
File Copy 1024 bufsize 2000 maxblocks          3960.0     916073.0   2313.3
File Copy 256 bufsize 500 maxblocks            1655.0     272967.4   1649.3
File Copy 4096 bufsize 8000 maxblocks          5800.0    2171906.8   3744.7
Pipe Throughput                               12440.0    1697464.4   1364.5
Pipe-based Context Switching                   4000.0     295175.0    737.9
Process Creation                                126.0      11459.6    909.5
Shell Scripts (1 concurrent)                     42.4       4231.7    998.0
Shell Scripts (8 concurrent)                      6.0        551.2    918.7
System Call Overhead                          15000.0    2793989.1   1862.7
                                                                   ========
System Benchmarks Index Score                                        1349.2
```


## リンク

ベンチマークソフトについては下記記事も参照のこと。

- http://sourceforge.jp/magazine/14/05/22/085000/1