2007年12月29日

FreeBSD6.3-RC1でpadlockを使う

PadLockとは

PadLockはVIAのCPU(C3やC7)に搭載された暗号化支援デバイスです。機能としては、AESやSHA256の高速処理や、精度の高い乱数生成が可能となります。IPsecや、sshなどopensslを使うアプリケーションでPadLockを使うことが可能で、C3やC7などの遅いCPUでも暗号を使ったアプリケーションだけならば高速なCPUのマシンにも引けを取らない性能を出すことが出来るようになります。

まず、PadLockによってどの程度 暗号化処理が高速化されるかを測定してみました。使用したマシンはVIA EPIA LN10000EGとFreeBSD6.3 RC1です。FreeBSD6.3 RC1に標準で入っているOpenSSL 0.9.7e-p1は既にPadLockに対応しているので、特に何もすることも無くPadLockの支援を受けることが出来ます。以下に、素の状態のopenssl speedと、暗号処理エンジンにPadLockを指定したときの結果を示します。

まずは、PadLock未使用。

% openssl speed -elapsed -evp aes-128-cbc
You have chosen to measure elapsed time instead of user CPU time.
To get the most accurate results, try to run this
program when this computer is idle.
Doing aes-128-cbc for 3s on 16 size blocks: 1523204 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 64 size blocks: 404154 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 256 size blocks: 101286 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 1024 size blocks: 25692 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 8192 size blocks: 3228 aes-128-cbc's in 3.00s
OpenSSL 0.9.7e-p1 25 Oct 2004
built on: Mon Nov 26 19:28:41 UTC 2007
options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used: gettimeofday
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-cbc       8123.64k     8620.50k     8641.31k     8767.81k     8811.53k

次に、PadLock使用。

% openssl speed -elapsed -evp aes-128-cbc -engine padlock
engine "padlock" set.
You have chosen to measure elapsed time instead of user CPU time.
To get the most accurate results, try to run this
program when this computer is idle.
Doing aes-128-cbc for 3s on 16 size blocks: 8898611 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 64 size blocks: 7551517 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 256 size blocks: 4447607 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 1024 size blocks: 1701517 aes-128-cbc's in 3.00s
Doing aes-128-cbc for 3s on 8192 size blocks: 250687 aes-128-cbc's in 3.00s
OpenSSL 0.9.7e-p1 25 Oct 2004
built on: Mon Nov 26 19:28:41 UTC 2007
options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used: gettimeofday
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-cbc      47456.14k   161073.63k   379453.62k   580677.82k   684414.65k

PadLockの有効化

PadLockを有効にするには、プログラムソースにデフォルトでOpenSSLの暗号化エンジンにPadLockを使うということを書いたパッチを当てるか、もしくはpadlockとcryptodevドライバを読み込むかの2通りの方法があります。パッチを当てる方はドライバを読み込むことなくOpenSSLがPadLockに対応さえしていれば使うことが出来ますが、はっきり言って面倒です。パッチはgoogleなどで、「openssl openssh padlock patch」等で検索すれば直ぐに見つかると思いますが、わざわざパッチをダウンロードしてコンパイルするメリットは殆どないと思われます。一方、ドライバを読み込む方法は、2行で済みます。

% kldload padlock
% kldload cryptodev

これでPadLockが有効になります。cryptodevはユーザーアプリケーションからPadLock等の暗号化支援ハードウェアを使う為に必要なものです。cryptodevを読み込むことにより、/dev/cryptoが生えてきます。

scpでのベンチマーク

scpで測定するのにあたって、LN10000EGのNIC(VT6103L)がどの程度の速度が出せるのかを測定しました。測定にはnetperfを使い、相手先はAthlon64X2 BE2350, CentOS5.1, NIC(VT6122)で、途中にハブ(PLANEX FXG-05IM)を経由しました。

% netperf -H 192.168.1.5
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.1.5 (192.168.1.5) port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

  8192  32768  32768    10.00      85.84

まず、PadLockが無効の状態でscpした結果を示します。測定はdd if=/dev/random of=./500M bs=1M count=500で作成したダミーファイルを用いました。

% scp -c aes128-cbc 500M test@192.168.1.5:~/ramdisk/
test@192.168.1.5's password:
500M                                          100%  500MB   5.2MB/s   01:37

次に、PadLockを有効にした結果を示します。

% su
Password:
# kldload padlock
# kldload cryptodev
# exit
% scp -c aes128-cbc 500M test@192.168.1.5:~/ramdisk/
test@192.168.1.5's password:
500M                                          100%  500MB  10.4MB/s   00:48

PadLockを使うことによって、転送速度が約2倍になりました。NICの転送速度が85.84Mbits/secで、PadLockを使った転送速度が10.4MB/sec * 8 = 83.2Mbits/secとなり、ほぼNICの転送速度の限界近くまで速度が出ていることになります。CPU負荷も抑えられており、まず満足すべき結果となりました。