川崎と申します。よろしくお願いします。
# FreeBSD というよりも openssl の話題なのかもしれませんが、どこで尋ね
# るのがよいかよくわからないのでこちらで。
# 不適切ならば指摘・誘導よろしくお願いします。
短く言うと、
AES-NI 入りの CPU を使っているのだけれど、openssl speed で測ると効
果が出ていないように思う。どうすればよいでしょうか?
という質問です。
以下、長くなりますがお許し下さい。
しばらく前から CPU に AES-NI 機能が入っている場合があって、AES 関連の
計算をハードウェアに任せてスピードアップができるようになりました。
手元の環境は、HP DL360G7 (Xeon E5606) に XenServer 5.6SP2 を入れて、
guest として FreeBSD 9.1-RELEASE amd64 (XENHVM) を動かしています。
FreeBSD の場合は、dmesg で見て CPU Fearture に AESNI があれば CPU が
AES-NI をサポートしていることがわかりますが、以下のようにこれは見えて
います。
FreeBSD 9.1-RELEASE #2: Sat Jan 5 17:45:00 JST 2013
[email protected]:/usr/obj/usr/src/sys/OKAXENHVM amd64
CPU: Intel(R) Xeon(R) CPU E5606 @ 2.13GHz (2133.48-MHz K8-class
CPU)
Origin = "GenuineIntel" Id = 0x206c2 Family = 6 Model = 2c Stepping =
2
Features=0x781fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CM
OV,PAT,MMX,FXSR,SSE,SSE2>
Features2=0x82982201<SSE3,SSSE3,CX16,SSE4.1,SSE4.2,POPCNT,AESNI,HV>
AMD Features=0x20000800<SYSCALL,LM> ↑ここ
AMD Features2=0x1<LAHF>
real memory = 532676608 (508 MB)
avail memory = 494837760 (471 MB)
:
kernel 設定 (XENHVM 派生) に以下を追記することで、
device crypto
device cryptodev
device aesni
aesni0 デバイスが生えますので、これで kernel は AES-NI を認識している
と思っています。
$ dmesg | grep aesni
aesni0: <AES-CBC,AES-XTS> on motherboard
ついでながら、man aesni(4) に device cryptodev への言及がないのですが、
このデバイスは最近追加されたんでしょうか。
ここで、openssl から AES-NI がどのように見えるかですが、OS 同梱の
openssl と ports から入れたものでは少し動きが異なります。
まず、OS 同梱の openssl では、ceyptodev の先に AES-128-CBC が見えます。
$ /usr/bin/openssl version
OpenSSL 0.9.8x 10 May 2012
$ /usr/bin/openssl engine -c -t
(cryptodev) BSD cryptodev engine
[RSA, DSA, DH, AES-128-CBC]
[ available ]
(dynamic) Dynamic engine loading support
[ unavailable ]
ports (security/openssl) 由来のものでは、cryptodev の先に AES-{128,
192,256}-CBC が見えるようになります。
$ /usr/local/bin/openssl version
OpenSSL 1.0.1c 10 May 2012
$ /usr/local/bin/openssl engine -c -t
(cryptodev) BSD cryptodev engine
[RSA, DSA, DH, AES-128-CBC, AES-192-CBC, AES-256-CBC]
[ available ]
(rsax) RSAX engine support
[RSA]
[ available ]
(dynamic) Dynamic engine loading support
[ unavailable ]
openssl speed で測ってみると、以下のようになります。(rc4 はおまけです)
[OS 同梱版・エンジン指定なし]
$ /usr/bin/openssl speed rc4 aes-128-cbc aes-256-cbc
(snip)
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
rc4 282949.07k 302508.50k 311531.06k 318883.16k 321583.23k
aes-128 cbc 107224.70k 111720.63k 112391.61k 113100.76k 113218.06k
aes-256 cbc 84375.26k 87150.40k 88121.16k 88252.18k 88418.67k
[OS 同梱版・エンジン指定あり]
$ /usr/bin/openssl speed -engine cryptodev rc4 aes-128-cbc aes-256-cbc
engine "cryptodev" set.
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
rc4 283840.98k 304521.07k 313117.93k 320178.30k 322188.00k
aes-128 cbc 107998.38k 111429.63k 112933.16k 113206.31k 113262.48k
aes-256 cbc 84902.19k 86670.40k 88272.19k 88480.89k 88477.45k
[ports 版・エンジン指定なし]
$ /usr/local/bin/openssl speed rc4 aes-256-cbc
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
rc4 185130.15k 347134.81k 443680.08k 483377.54k 499326.44k
aes-256 cbc 45177.52k 47553.47k 48481.83k 100685.08k 101643.78k
[ports 版・エンジン指定あり]
$ /usr/local/bin/openssl speed -engine cryptodev rc4 aes-256-cbc
engine "cryptodev" set.
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
rc4 184666.22k 344115.15k 444006.31k 483542.31k 497616.04k
aes-256 cbc 45205.07k 47608.24k 48409.88k 100731.73k 101916.14k
結局のところ、aes-256-cbcではおよそ100MByte/sec程度で、cryptodevを明示
的に指定しても大差がないようです。
(OS 同梱版では若干落ちますが、これは engine に -256- がないためか。)
こういうものならそれはそれで納得するしかないのですが、以前、ports 版が
まだ 1.0.0 になる前 (0.9.8 当時) に AES-NI パッチを当てて計測した時に
は、AES-NI engine 指定なしでおよそ 100MByte/sec 程度、指定すればおよそ
500 MByte/sec 出ていたように記憶しますので、AES-NI ハードウェアを使え
ていないのではないかと思っています。
そういえば、0.9.8 当時は cryptodev 経由ではなくて、openssl から見て直
接に aesni エンジンが生えていたのも気になります。(openssl 1.0.0 になっ
て AES-NI をサポートするようになった時に実装が変わったということですよ
ね)
すみませんが、何かヒントがあればよろしくお願いします。
--
moto kawasaki <[email protected]>