CPU脆弱性Meltdownのパッチ適用でベンチマークスコアが25％低下した

いま話題のCPU脆弱性Meltdownですが、
各OSベンダーからカーネルのパッチが配布され始めました。

個人で利用しているEC2にパッチを適用して、ベンチマークをとったところ、
トータルスコアが25％低下という結果が出ましたのでまとめます。

※環境やCPUの種類やベンチマークの取り方で変わるので、
必ずしも全ての環境においてこの結果が正しいわけではありません。

# 環境とスペック
- EC2インスタンスタイプ：t2.midium
- OS：  3.10.0-693.11.6.el7.x86_64 (CentOS 7)
- CPU：  Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz (2コア)

# 結論

- **コンテキストスイッチの速度が低下する。**

Meltdown関連の記事にもあるように、
パッチ適用によってカーネルモードとユーザモードのアドレス空間を分離する措置が取られるため、
システムコールやハードウェア割り込み時のオーバーヘッドが大きくなることが分かりました。

- **基本的な演算処理能力には影響ない。**

ベンチマークツール上では計算処理の速度低下は見られませんでした。
脆弱性の詳細をあまり理解しておらず、その結果だけを見て速度低下は無さそうだと勘違いしてしまったので、
ベンチマークの計測を考えている方はテスト項目に注意してください。

# 使ったベンチマークツール
- LINPACK
- 姫野ベンチマーク
- UnixBench

# LINPACKと姫野ベンチマーク

LINPACKはIntel、姫野ベンチは理研のツールらしいです。
LINPACKはスパコンの性能比較で使われています。

どちらもインストールも簡単でシンプルで使いやすかったのですが、
これらは計算処理を元にベンチマークを出すタイプだったため、
Meltdownのパッチ適用前後では変化が見られず有益な結果が得られませんでした。

※そのためベンチ結果は割愛します。

# UnixBench

Unixと付いてますが、元々Unix向けに開発された後Linux用に移植されたらしいです。
40個ほどのテスト項目があり、デフォルトだと15項目をテストしてくれます。

実行時の引数-iは試行回数です。デフォルトだと10回実行するので30分ほどかかります。

```:インストールから実行までの手順
# sudo yum install perl-Time-HiRes
# cd /usr/local/src/
# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/byte-unixbench/UnixBench5.1.3.tgz
# tar xvzf UnixBench5.1.3.tgz
# cd UnixBench
# make
# ./Run -i 1 
```

1コアだけで計測した場合と、全コア使った場合の2通りを計測してくれますが、
全コア(2コア)使った場合のみ記載します。
BASELINEとは1995年頃のコンピュータ性能を意味しているそうで、固定値です。
その性能を1とした時の相対的な性能がINDEXです。

### パッチ適用前


```:パッチ適用前
------------------------------------------------------------------------
Benchmark Run: Fri Jan 05 2018 13:05:04 - 13:11:47
2 CPUs in system; running 2 parallel copies of tests

Dhrystone 2 using register variables       62784918.6 lps   (10.0 s, 1 samples)
Double-Precision Whetstone                     7849.1 MWIPS (9.9 s, 1 samples)
Execl Throughput                               5955.7 lps   (29.1 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks       1627842.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks          430865.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks       4064151.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                             3106533.0 lps   (10.0 s, 1 samples)
Pipe-based Context Switching                 560702.3 lps   (10.0 s, 1 samples)
Process Creation                              23914.5 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                  10148.7 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                   1399.0 lpm   (60.1 s, 1 samples)
System Call Overhead                        3570647.5 lps   (10.0 s, 1 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   62784918.6   5380.0
Double-Precision Whetstone                       55.0       7849.1   1427.1
Execl Throughput                                 43.0       5955.7   1385.0
File Copy 1024 bufsize 2000 maxblocks          3960.0    1627842.0   4110.7
File Copy 256 bufsize 500 maxblocks            1655.0     430865.0   2603.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    4064151.0   7007.2
Pipe Throughput                               12440.0    3106533.0   2497.2
Pipe-based Context Switching                   4000.0     560702.3   1401.8
Process Creation                                126.0      23914.5   1898.0
Shell Scripts (1 concurrent)                     42.4      10148.7   2393.6
Shell Scripts (8 concurrent)                      6.0       1399.0   2331.7
System Call Overhead                          15000.0    3570647.5   2380.4
                                                                   ========
System Benchmarks Index Score                                        2534.9
```

### パッチ適用後

```:パッチ適用後
------------------------------------------------------------------------
Benchmark Run: Fri Jan 05 2018 15:19:18 - 15:26:02
2 CPUs in system; running 2 parallel copies of tests

Dhrystone 2 using register variables       62876708.3 lps   (10.0 s, 1 samples)
Double-Precision Whetstone                     7840.0 MWIPS (9.9 s, 1 samples)
Execl Throughput                               5044.5 lps   (29.7 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks       1094523.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks          310239.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks       3346623.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                             1771787.9 lps   (10.0 s, 1 samples)
Pipe-based Context Switching                 324654.9 lps   (10.0 s, 1 samples)
Process Creation                              20214.7 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                   9043.8 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                   1247.2 lpm   (60.0 s, 1 samples)
System Call Overhead                        1438079.5 lps   (10.0 s, 1 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   62876708.3   5387.9
Double-Precision Whetstone                       55.0       7840.0   1425.5
Execl Throughput                                 43.0       5044.5   1173.1
File Copy 1024 bufsize 2000 maxblocks          3960.0    1094523.0   2763.9
File Copy 256 bufsize 500 maxblocks            1655.0     310239.0   1874.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    3346623.0   5770.0
Pipe Throughput                               12440.0    1771787.9   1424.3
Pipe-based Context Switching                   4000.0     324654.9    811.6
Process Creation                                126.0      20214.7   1604.3
Shell Scripts (1 concurrent)                     42.4       9043.8   2133.0
Shell Scripts (8 concurrent)                      6.0       1247.2   2078.7
System Call Overhead                          15000.0    1438079.5    958.7
                                                                   ========
System Benchmarks Index Score                                        1893.4
```

### パッチ適用前後の比較



|テスト項目|パッチ適用前|パッチ適用後|性能低下割合(%)|
|-----------------|------------------|------------------|-------------|
|   Dhrystone 2 using register variables   |   5380   |   5387.9   |   100.1   |
|   Double-Precision Whetstone   |   1427.1   |   1425.5   |   99.9   |
|   Execl Throughput   |   1385   |   1173.1   |   84.7   |
|   File Copy 1024 bufsize 2000 maxblocks   |   4110.7   |   2763.9   |   67.2   |
|   File Copy 256 bufsize 500 maxblocks   |   2603.4   |   1874.6   |   72.0   |
|   File Copy 4096 bufsize 8000 maxblocks   |   7007.2   |   5770   |   82.3   |
|   <font color="Red">Pipe Throughput</font>   |   <font color="Red">2497.2</font>   |   <font color="Red">1424.3</font>   |   <font color="Red">57.0</font>   |
|   <font color="Red">Pipe-based Context Switching</font>   |   <font color="Red">1401.8</font>   |   <font color="Red">811.6</font>   |   <font color="Red">57.9</font>   |
|   Process Creation   |   1898   |   1604.3   |   84.5   |
|   Shell Scripts (1 concurrent)   |   2393.6   |   2133   |   89.1   |
|   Shell Scripts (8 concurrent)   |   2331.7   |   2078.7   |   89.1   |
|   <font color="Red">System Call Overhead</font>   |   <font color="Red">2380.4</font>   |   <font color="Red">958.7</font>   |   <font color="Red">40.2</font>   |
|   **System Benchmarks Index Score**   |   **2534.9**   |   **1893.4**   |   **74.7**   |

著しく低下してる項目の意味は以下の通りです。

- Pipe Throughput……	小さいサイズのデータでパイプ処理を繰り返す。OSやCPU性能が見れる。
- Pipe-based Context Switching……	プロセス間のコンテキストスイッチの速度を測る。
- System Call Overhead……	単純なシステムコールを繰り返し実行する。

一番下の合計スコアから分かる通り、総合して25％低下という結果でした。
元々5~30%程度低下するとの情報があったため、予想通りという結果でした。
ですが、単純な演算速度テストである
Dhrystone 2 using register variables
Double-Precision Whetstone
に関しては性能低下は見られませんでした。

UnixBenchについてはこちらの記事が詳しいです。
http://blog.idcf.jp/entry/cloud/unixbench/