OCIのプロセッサはどれが良いか

# プロセッサを比較調査してみる事に
OCIではコンピュートを作成する際にプロセッサが選べますが、どれどの程度の性能なのかわかりずらいと思います。

今回は実際に複数のコンピュートを作成してみて処理時間を計測してみました。

# 計測の方法
OSは全てLinuxにし、負荷をかけるPERLスクリプトで時間を計測してみました。
[こちら](https://perlzemi.com/blog/20100509127696.html "Perlゼミ")を参考に以下のようなスクリプトを作成してみました。

```
#!/usr/bin/perl

my $file = "samplefile.txt";
# モジュールの読み込みと関数のインポート
use Benchmark qw(timethese cmpthese);

my $sub_cnt = 50000;
my $cnt = 10000;

my $r = timethese($cnt, 
	{
		sub1 => sub
		{
			my $i = 0;
			while ($i < $sub_cnt) {
			$i++;
   		}
		},
		sub2 => sub
		{
			my $i = 0;
			while ($i < $sub_cnt) {
			$x = sqrt($i);
			$i++;
    		}
		},
		sub3 => sub
		{
			my $i = 0;
			 open(IN,$file);
			 while(<IN>){
			 	$x = $_;
			 } 
			 close(IN);
		},					
	}
);

cmpthese $r;
```
●sub1では単純にループを5万回実行します。
●sub2では平方根の計算結果の変数代入を5万回実施します。
●sub3では100KBのファイルを読み込んで変数に代入します。
上記の3つのサブルーチンを1万回繰り返した時間を計測して出力するのがこのスクリプトです。

厳密に計測するとなるとプロセッサ用に最適化したコンパイラを用いてC++等で書かないといけないと思いますが、あくまで参考という事で。

# 計測結果
## 自宅PC
まず、自宅のPCでどれくらいの数字が出るのか計測してみました。
スペックは以下のような感じです。
| パーツ | スペック |
|:-----------|:------------|
| CPU       | Core i5-8400 2.8GHZ(Coffee Lake)|
| メモリ     | 32GB      |
| ストレージ       | SSD 2TB + HDD 5TB|

といった感じです。

```
Benchmark: timing 10000 iterations of sub1, sub2, sub3...
      sub1: 12 wallclock secs (12.03 usr +  0.01 sys = 12.05 CPU) @ 830.15/s (n=10000)
      sub2: 28 wallclock secs (28.31 usr +  0.00 sys = 28.31 CPU) @ 353.21/s (n=10000)
      sub3: 134 wallclock secs (131.94 usr +  1.19 sys = 133.13 CPU) @ 75.12/s (n=10000)
       Rate  sub3  sub2  sub1
sub3 75.1/s    --  -79%  -91%
sub2  353/s  370%    --  -57%
sub1  830/s 1005%  135%    --

```
ちょっとしたサーバとして使うには十分な性能だと思います。

:::note
使用したOS
自宅PCはWindows10 PersonalでOCIは全てOracle Linuxを使用して計測しました。
:::

## OCIの結果
なるべく基準を合わせるためにoCPU数は1つで計測しています。

### VM.Standard.E4.Flex
コンピュート作成する時にデフォルトで選択されているAMDプロセッサの**VM.Standard.E4.Flex**の結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/294b43ea-36f7-b241-71c5-12cb9adab4bc.png)
```
Benchmark: timing 10000 iterations of sub1, sub2, sub3...
      sub1: 34 wallclock secs (34.79 usr +  0.01 sys = 34.80 CPU) @ 287.36/s (n=10000)
      sub2: 90 wallclock secs (89.92 usr +  0.01 sys = 89.93 CPU) @ 111.20/s (n=10000)
      sub3: 30 wallclock secs (29.34 usr +  0.19 sys = 29.53 CPU) @ 338.64/s (n=10000)
      Rate sub2 sub1 sub3
sub2 111/s   -- -61% -67%
sub1 287/s 158%   -- -15%
sub3 339/s 205%  18%   --
```
何回か計測してみましたが、多少ブレがあって安定していないように感じます。

### VM.Standard3.Flex
Intelプロセッサの**VM.Standard3.Flex**の結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/2ab9ea7e-b4f1-aaa7-f7ad-2d2eb08d3213.png)
```
Benchmark: timing 10000 iterations of sub1, sub2, sub3...
      sub1: 14 wallclock secs (14.04 usr +  0.00 sys = 14.04 CPU) @ 712.25/s (n=10000)
      sub2: 30 wallclock secs (30.61 usr +  0.00 sys = 30.61 CPU) @ 326.69/s (n=10000)
      sub3: 10 wallclock secs ( 9.52 usr +  0.08 sys =  9.60 CPU) @ 1041.67/s (n=10000)
       Rate sub2 sub1 sub3
sub2  327/s   -- -54% -69%
sub1  712/s 118%   -- -32%
sub3 1042/s 219%  46%   --
```
複数回試しても比較的安定した数値を出しました。

### VM.Standard.A1.Flex
Armアーキテクチャの**VM.Standard.A1.Flex**の結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/f1fb9ec2-0333-9309-9fa8-82d1ec7dcfc8.png)
```
Benchmark: timing 10000 iterations of sub1, sub2, sub3...
      sub1: 18 wallclock secs (17.89 usr +  0.01 sys = 17.90 CPU) @ 558.66/s (n=10000)
      sub2: 43 wallclock secs (41.95 usr +  0.00 sys = 41.95 CPU) @ 238.38/s (n=10000)
      sub3: 13 wallclock secs (12.74 usr +  0.07 sys = 12.81 CPU) @ 780.64/s (n=10000)
      Rate sub2 sub1 sub3
sub2 238/s   -- -57% -69%
sub1 559/s 134%   -- -28%
sub3 781/s 227%  40%   --
```
こちらは極めて安定していてwallclockは毎回同じ数値になりました。
このスペックはAlways Freeでも使えます。

ただAMPERE-OracleLinuxで一つ気になった事があります。
それはSSHキーを自分で作成したものだとキーエラーになってアクセスできないという点です。
やり方を間違えたかと思って3回くらいインスタンスを作成してしまいましたがダメで、結局インスタンス作成時にOCIで生成されるキーをダウンロードして使ったところアクセスできました。

### VM.Standard.E2.Micro
最後にAlways Free環境でデフォルトで選択されているAMDの旧プロセッサの**VM.Standard.E2.Micro**の結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/5ca1b402-9b16-27ac-5bef-cf04b7303a9c.png)
```
Benchmark: timing 10000 iterations of sub1, sub2, sub3...
      sub1: 55 wallclock secs (25.47 usr +  0.00 sys = 25.47 CPU) @ 392.62/s (n=10000)
      sub2: 110 wallclock secs (51.92 usr +  0.00 sys = 51.92 CPU) @ 192.60/s (n=10000)
      sub3: 47 wallclock secs (21.32 usr +  0.28 sys = 21.60 CPU) @ 462.96/s (n=10000)
      Rate sub2 sub1 sub3
sub2 193/s   -- -51% -58%
sub1 393/s 104%   -- -15%
sub3 463/s 140%  18%   --
```
一番遅く感じました。

# まとめ
計測結果を一覧でまとめてみました。
時間はwallclockの値を載せています。
これは処理にかかった時間なので数値が小さいほど性能が良いという事になります。
![comp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/94f0f49f-643a-1524-9501-b8b9790b9f3d.jpeg)
Sub1に関しては何気に自宅PCが一番良かったのですが、自宅PCはSub3のI/Oを伴う処理は一番遅かったです。
これはマザーボードの制限でSSDに差しているBusの速度が遅いためだと思われます。
AMDプロセッサは全体的に遅い気がします。
IntelはOCIの同じようなスペックで比較した場合は一番性能が良いです。
AmpereもIntelに迫る性能があり、これが安価に利用できるというのは素晴らしいですし、安定性は一番高かったです。

アーキテクチャの違いからAmpereだと難しい場合もありますが、Webアプリ等でプロセッサのアーキテクチャに依存しないで動くプログラムの場合、費用対効果が一番高いのはAmpereプロセッサだと思います。
Webサーバとして十分動くと考えられます。

x86系のバイナリを動かす必要がある場合、性能ならIntel、価格ならAMDになると思います。

以上、プロセッサに関する調査結果でした。