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”这个模块。
1 2 3 4 5 6 7 8 9 |
[root@jay-linux ~]# lsmod | grep aes aes_x86_64 7316 0 aes_generic 25994 1 aes_x86_64 [root@jay-linux ~]# modprobe aesni_intel [root@jay-linux ~]# lsmod | grep aes aesni_intel 39274 0 cryptd 6667 1 aesni_intel aes_x86_64 7316 1 aesni_intel aes_generic 25994 2 aesni_intel,aes_x86_64 |
这个过程,可能遇到如下的错误:
1 2 3 4 5 6 |
[root@jay-linux ~]# modprobe aesni_intel FATAL: Error inserting aesni_intel (/lib/modules/3.5.0/kernel/arch/x86/crypto/aesni-intel.ko): No such device (这种情况是硬件不支持AES-NI或者在BIOS中被disable了)。 [root@jay-linux ~]# modprobe aesni_intel FATAL: Module aesni_intel not found. (这种情况是module没有编译) |
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
博主,你好。我在实践方面比较差,可以详细介绍一下AES-NI的使用方法吗?谢谢。