AES-NI新指令在KVM中的使用及性能测试数据

AES NI(Advanced Encryption Standard new instructions)是Intel在2008年3月提出的在x86处理器上的指令集扩展,它包含了7条新指令,其中6条是硬件对AES的支持,另1条是对进位乘法的优化,从而在执行 AES 算法的某些复杂的、计算密集型子步骤时更好地利用底层硬件,减少计算的CPU cycles,提升AES加解密的性能。(2012.9.27 update)Intel从Westmere平台开始就支持AES-NI,目前Westmere、SandyBridge、IvyBridge、Haswell等平台都支持AES-NI的。

我在KVM的客户机中对AES-NI进行了测试,对比使用AES-NI新指令和不是用AES-NI的情况,对磁盘进行加解密的速度。

使用的是一些测试脚本,其中主要是调用“cryptsetup”这个命令行工具。
1. 在进行测试之前,检查硬件平台是否支持AES-NI,在一些BIOS中的CPU configuration下有一个“AES-NI Intel”这样的选项,需要enable起来。当然有的BIOS中没有这个设置,就需要在系统启动后加载aesni-intel相关的module来看看是否支持AES-NI了。(在设置BIOS时要注意,比如在一台Romley-EP上BIOS中有“Advanced” -> “Processor Configuration” -> "AES-NI Defeature” 是"Defeature"而不是“feature”哦,所以这个“Defeature”应该设置为“disabled”,其默认值也是“disabled”,其使用AES-NI功能。)
2. 需要保证kernel中将AES-NI相关的config编译为module或者built-in,我的配置如下:
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_AES_X86_64=m
CONFIG_CRYPTO_AES_NI_INTEL=m
3. 加载“aseni_intel”这个模块。

这个过程,可能遇到如下的错误:


4. 启动KVM guest,默认qemu启动客户机时,没有expose这个AES-NI的feature的,可以用"-cpu host"或者“-cpu qemu64,+aes”选项来expose AES-NI给客户机使用。(2012.9.27 update)也可用“-cpu Westmere”、“-cpu SandyBridge”这样的qemu-kvm参数。
qemu-system-x86_64 -smp 4 -m 4096 rhel6.2.img -cpu host

5. 之后guest中运行测试程序,得出对比结果即可。

我本次测试的平台是一个IvyBridge Desktop平台,host的kernel是Linux3.5.0,qemu-kvm是1.1.1,guest使用的是RHEL6.2。
(加与不加"-cpu host"即可对比)

本次测试结果如下,可以看出AES-NI的情况下,加解密测试性能高出几倍的,效果不错的。

AES-Mode AES-NI-Read(MB/s) Soft-AES-Read(MB/s) AES-NI-Write(MB/s) Soft-AES-Write(MB/s)
aes-ecb-plain

664.1

151.7

290

175

aes-cbc-plain

718.5

139.8

268

209.65

aes-ctr-plain

269.8

135.2

229

195.5

aes-lrw-plain

314.3

167.5

270

208.5

aes-pcbc-plain

219.6

99

193

175

aes-xts-plain

304

161.2

273.5

230

Average

415.05

142.4

253.9166667

198.9416667

参考资料如下:
http://en.wikipedia.org/wiki/AES_instruction_set
http://en.wikipedia.org/wiki/Dm-crypt

master

Stay hungry, stay foolish.

One Comment

  1. 博主,你好。我在实践方面比较差,可以详细介绍一下AES-NI的使用方法吗?谢谢。

发表评论

邮箱地址不会被公开。 必填项已用*标注

*