川崎と申します。よろしくお願いします。

# 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
        r...@nfsstore3.oka.lac.jp:/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 <m...@kawasaki3.org>

メールによる返信