Bluemix Infrastructure（旧SoftLayer)におけるAES-NIベンチマーク

#1. AES-NIとは
Intel Advanced Encryption Standard (AES) New Instructions (AES-NI) の略です。Intelプロセッサーに、暗号化/暗号化解除をオフロードすることで、高速に処理することが可能になります。本記事では、AES-NIの有効化確認とベンチマークをBluemix Infrastructure（旧SoftLayer）で実施してみたいと思います。

#2. 環境確認とベンチマーク結果

```txt:バージョン確認
[root@osc01 ~]# uname -a
Linux osc01 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

[root@osc01 ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@osc01 ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

[root@osc01 ~]# grep model /proc/cpuinfo
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
```

 
```txt:AES-NIの有効化確認
[root@osc01 ~]# grep -m1 -o aes /proc/cpuinfo
aes
```

検出されたプロセッサーがサポート対象の場合、AES-NI エンジンは自動的に有効になるようです。まずは、プロセッサーにAES 指示セットがあることを確認します。aesというキーワードが出力されたので大丈夫のようです。

```txt:AES-NIなしのベンチマーク
# openssl speed aes-256-cbc
Doing aes-256 cbc for 3s on 16 size blocks: 11411571 aes-256 cbc's in 2.99s
Doing aes-256 cbc for 3s on 64 size blocks: 3070978 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 256 size blocks: 779696 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 456231 aes-256 cbc's in 2.99s
Doing aes-256 cbc for 3s on 8192 size blocks: 57457 aes-256 cbc's in 3.00s
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Mon Feb 20 14:38:48 UTC 2017
options:bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256 cbc      61065.26k    65514.20k    66534.06k   156247.67k   156895.91k
```

```txt:AES-NIありのベンチマーク
[root@osc01 ~]# openssl speed -evp aes-256-cbc
Doing aes-256-cbc for 3s on 16 size blocks: 58774831 aes-256-cbc's in 2.99s
Doing aes-256-cbc for 3s on 64 size blocks: 15487820 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 256 size blocks: 3924139 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 1024 size blocks: 975177 aes-256-cbc's in 2.97s
Doing aes-256-cbc for 3s on 8192 size blocks: 123174 aes-256-cbc's in 2.99s
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Mon Feb 20 14:38:48 UTC 2017
options:bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256-cbc     314514.15k   330406.83k   334859.86k   336222.64k   337472.04k

```

16byte/32byte/64byte/256byteでは約5倍近く高速になっています。
1024byte/8102byteでは約2倍程度高速になっています。