在 Linux(Fedora 28)中,我的主目录 LUKS 加密了,当使用 Gnome Disk(屏幕截图)时,我可以分别对底层 LUKS 分区(上方蓝色矩形)和解密的主分区(下方白色矩形)进行基准测试。
LUKS 分区的访问时间为 500MB/s,但解密后的访问时间为 350MB/s。需要说明的是,这与 500GB SSD 的分区相同。
是否可以公平地得出这样的结论:加密数据访问速度是否会降低 30% ( = 150/500)?
这种数字有记录吗,还是我做错了什么。这比我预期的要慢得多。
编辑:这是我的输出
$ cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 384375 iterations per second for 256-bit key
PBKDF2-sha256 494611 iterations per second for 256-bit key
PBKDF2-sha512 323634 iterations per second for 256-bit key
PBKDF2-ripemd160 293225 iterations per second for 256-bit key
PBKDF2-whirlpool 185917 iterations per second for 256-bit key
argon2i 4 iterations, 748334 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id 4 iterations, 745443 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 195.0 MiB/s 664.0 MiB/s
serpent-cbc 128b 28.8 MiB/s 94.7 MiB/s
twofish-cbc 128b 58.8 MiB/s 111.6 MiB/s
aes-cbc 256b 146.5 MiB/s 507.3 MiB/s
serpent-cbc 256b 33.3 MiB/s 110.2 MiB/s
twofish-cbc 256b 59.3 MiB/s 123.6 MiB/s
aes-xts 256b 433.7 MiB/s 416.8 MiB/s
serpent-xts 256b 101.0 MiB/s 94.7 MiB/s
twofish-xts 256b 111.8 MiB/s 110.3 MiB/s
aes-xts 512b 349.5 MiB/s 356.6 MiB/s
serpent-xts 512b 101.6 MiB/s 96.0 MiB/s
twofish-xts 512b 111.2 MiB/s 108.1 MiB/s
$ lscpu | grep aes
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall
nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est
tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer
aes xsave avx f16c rdrand lahf_lm cpuid_fault epb pti ssbd ibrs ibpb stibp
tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm
ida arat pln pts flush_l1d
编辑2020:我换了电脑,结果在加密基准测试中完全不同,远远超出了更快处理器所能解释的范围。所以,我认为我的旧硬件没有专用的加密芯片:
$ cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 1756408 iterations per second for 256-bit key
PBKDF2-sha256 2264742 iterations per second for 256-bit key
PBKDF2-sha512 1653905 iterations per second for 256-bit key
PBKDF2-ripemd160 949797 iterations per second for 256-bit key
PBKDF2-whirlpool 711381 iterations per second for 256-bit key
argon2i 8 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id 8 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 1256.4 MiB/s 3669.2 MiB/s
serpent-cbc 128b 101.6 MiB/s 771.8 MiB/s
twofish-cbc 128b 230.0 MiB/s 418.4 MiB/s
aes-cbc 256b 947.9 MiB/s 2961.6 MiB/s
serpent-cbc 256b 105.1 MiB/s 785.0 MiB/s
twofish-cbc 256b 235.7 MiB/s 424.5 MiB/s
aes-xts 256b 2209.9 MiB/s 2218.9 MiB/s
serpent-xts 256b 762.0 MiB/s 776.6 MiB/s
twofish-xts 256b 415.7 MiB/s 384.0 MiB/s
aes-xts 512b 1701.8 MiB/s 1677.2 MiB/s
serpent-xts 512b 713.7 MiB/s 769.6 MiB/s
twofish-xts 512b 407.9 MiB/s 414.2 MiB/s
答案1
加密会增加额外的 CPU 负载,因为每个磁盘块在访问时都需要由操作系统解密。您的测试结果(解密速度约为 600 MB/s)对于 i7 上的通用 AES 处理来说相当平均。
为了避免此问题,现代 CPU 通常都内置了基于硬件的 AES 支持。英特尔将此功能称为“AES-NI”(显示为lscpu
“aes”),它允许在相同的 AES 解密中达到 2-3 GB/s 的速率。
首先运行lscpu
并检查功能标记中是否提到了“aes”。英特尔 ARK显示它存在于您的 CPU 型号中,但它可能被固件 (BIOS) 设置禁用。(ARK 有一个脚注:“某些产品可以通过处理器配置更新支持 AES 新指令...请联系 OEM 获取包含最新处理器配置更新的 BIOS。”)
Linux 使用“aesni_intel”模块来启用硬件加速。通过运行 检查内核中是否已启用该模块zgrep AES_NI_INTEL /proc/config.gz
。如果显示“ =y
”,则该模块是主内核映像的一部分,应该可用。
如果输出显示“ =m
”,则表明它已被编译为模块 – 尝试通过运行 手动加载模块sudo modprobe -v aesni_intel
。如果命令无法找到模块,则可能需要重新启动。(重新启动后,确保uname -r
显示的内核版本与 中相同ls /lib/modules
。)