![加密驱动器写入速度缓慢,而基准测试显示加密/原始磁盘写入速率要高得多](https://linux22.com/image/165810/%E5%8A%A0%E5%AF%86%E9%A9%B1%E5%8A%A8%E5%99%A8%E5%86%99%E5%85%A5%E9%80%9F%E5%BA%A6%E7%BC%93%E6%85%A2%EF%BC%8C%E8%80%8C%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95%E6%98%BE%E7%A4%BA%E5%8A%A0%E5%AF%86%2F%E5%8E%9F%E5%A7%8B%E7%A3%81%E7%9B%98%E5%86%99%E5%85%A5%E9%80%9F%E7%8E%87%E8%A6%81%E9%AB%98%E5%BE%97%E5%A4%9A.png)
我目前在设备上安装了 Ubuntu 18.04 的 NAS Netgear ReadyNAS 102
。该机器有一个 Armada Marvell 370/XP SoC,带有一个名为“CESA”的硬件加密加速器。 CESA 的内核驱动程序正在运行。我可以通过以下方式验证cat /proc/crypto
:
[...]
name : cbc(aes)
driver : mv-cbc-aes
module : marvell_cesa
priority : 300
refcnt : 1
selftest : passed
internal : no
type : skcipher
async : yes
blocksize : 16
min keysize : 16
max keysize : 32
ivsize : 16
chunksize : 16
walksize : 16
[... other marvel_cesa entries are available too...]
我已经通过 mdadm 将两个磁盘(带有旋转磁盘的普通 HDD)设置为 RAID1。我使用的最终 RAID 设备称为 /dev/md127。其写入速度约为 65 MB/s:
# dd if=/dev/zero of=/dev/md127 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 15.945 s, 65.8 MB/s
cryptsetup 的基准告诉我,使用“aes-xts”的加密应该达到大约 30 MB/s(cryptsetup 默认使用该值;因为“aes-cbc”不再安全)。
# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 72979 iterations per second for 256-bit key
PBKDF2-sha256 125547 iterations per second for 256-bit key
PBKDF2-sha512 49498 iterations per second for 256-bit key
PBKDF2-ripemd160 69497 iterations per second for 256-bit key
PBKDF2-whirlpool 18875 iterations per second for 256-bit key
argon2i 4 iterations, 25926 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id 4 iterations, 26234 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 55.8 MiB/s 56.6 MiB/s
serpent-cbc 128b 17.9 MiB/s 17.7 MiB/s
twofish-cbc 128b 22.3 MiB/s 25.2 MiB/s
aes-cbc 256b 53.0 MiB/s 53.4 MiB/s
serpent-cbc 256b 17.9 MiB/s 17.7 MiB/s
twofish-cbc 256b 23.0 MiB/s 25.3 MiB/s
aes-xts 256b 30.7 MiB/s 31.0 MiB/s
serpent-xts 256b 19.9 MiB/s 18.8 MiB/s
twofish-xts 256b 28.0 MiB/s 28.3 MiB/s
aes-xts 512b 29.8 MiB/s 30.1 MiB/s
serpent-xts 512b 20.6 MiB/s 18.8 MiB/s
twofish-xts 512b 28.0 MiB/s 28.2 MiB/s
现在,我用cryptsetup luksFormat /dev/md127
它来创建一个加密的块设备。
root@ReadyNAS102:~# cryptsetup luksFormat /dev/md127
WARNING!
========
This will overwrite data on /dev/md127 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/md127:
Verify passphrase:
然后我验证了cryptsetup luksDump
真正选择的密码。据我所知,它是“aes-xts-plain64”,具有 512 位密钥大小,用于数据加密,并使用 sha256 对密码进行哈希处理,它用于加密 AES 的对称 512 位密钥。
root@ReadyNAS102:~# cryptsetup luksDump /dev/md127
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 1f4917c4-ce8c-48d8-99f6-2c19ccb4ecc9
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2i
Time cost: 4
Memory: 26404
Threads: 1
Salt: 0a ef ca 34 29 9a 23 a1 78 30 8e d8 d7 15 29 21
67 84 02 31 f4 b4 66 11 20 c7 82 ab 98 11 cd 93
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 7953
Salt: 5d 2d de 4d c3 72 e1 ab 70 d2 ba 8a b3 7e 18 89
2e 3a 28 e3 51 c8 80 fe ba 73 ce 5e 53 db 72 99
Digest: 36 6e 0e b0 b7 8c df 28 8f ec 49 bf 97 15 25 68
25 b2 92 35 c6 5e 0d ce f4 44 05 8d 3f 5b 78 93
最后我打开luks设备,再次检查写入速度:
root@ReadyNAS102:~# cryptsetup luksOpen /dev/md127 md127-decrypt
Enter passphrase for /dev/md127:
root@ReadyNAS102:~# dd if=/dev/zero of=/dev/mapper/md127-decrypt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 120.121 s, 8.7 MB/s
正如您所看到的,仅达到了约 8.7 MB/s。不是应该大约 30 MB/s 或至少超过 20 MB/s 吗? (速度测试已重复多次,以确保磁盘/CPU 不只是繁忙)
为什么这么慢?我怎样才能加快速度?
编辑#1:从 top 和 iostat 请求统计信息
按照此处的要求,top
写入 /dev/mapper/md127-decrypt 时显示的内容:
top - 15:30:52 up 1 day, 11:07, 1 user, load average: 3.33, 1.09, 0.39
Tasks: 80 total, 2 running, 78 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.6 us, 98.4 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 492.5 total, 14.9 free, 58.0 used, 419.6 buff/cache
MiB Swap: 511.4 total, 510.2 free, 1.3 used. 422.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
245 root -51 0 0 0 0 S 40.5 0.0 3:20.16 irq/38-d0090000
10791 root 0 -20 0 0 0 I 34.1 0.0 2:24.71 kworker/u3:1-kcryptd
30143 root 20 0 0 0 0 S 7.9 0.0 0:15.33 dmcrypt_write
29939 root 20 0 0 0 0 R 7.1 0.0 0:15.21 kworker/u2:1+flush-253:0
28396 root 20 0 7064 2272 1236 D 6.3 0.5 0:05.60 dd
28 root 20 0 0 0 0 S 1.6 0.0 0:08.80 kswapd0
648 sdwarfs 20 0 10468 3560 2756 S 1.6 0.7 0:08.58 sshd
28398 root 20 0 9360 2632 2124 R 1.6 0.5 0:01.20 top
28397 root 20 0 0 0 0 I 0.8 0.0 0:00.12 kworker/u2:2-events_unbound
1 root 20 0 29916 4416 3172 S 0.0 0.9 0:07.86 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
这是iostat -kx 5
显示的内容:
avg-cpu: %user %nice %system %iowait %steal %idle
0.20 0.00 99.80 0.00 0.00 0.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.00 410.40 0.00 8494.10 0.00 1713.60 0.00 80.68 0.00 0.56 0.18 0.00 20.70 0.42 17.04
sdb 0.00 401.80 0.00 8494.10 0.00 1722.20 0.00 81.08 0.00 0.49 0.14 0.00 21.14 0.30 11.92
md127 0.00 2123.60 0.00 8494.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.00 0.00
md0 0.00 0.60 0.00 2.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.00 0.00
md1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 2123.60 0.00 8494.40 0.00 0.00 0.00 0.00 0.00 2.42 5.13 0.00 4.00 0.47 100.00
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 100.00 0.00 0.00 0.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.00 415.80 0.00 8436.30 0.00 1693.40 0.00 80.29 0.00 0.49 0.18 0.00 20.29 0.43 18.08
sdb 0.00 415.80 0.00 8436.30 0.00 1693.40 0.00 80.29 0.00 0.30 0.10 0.00 20.29 0.24 10.00
md127 0.00 2108.20 0.00 8432.80 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.00 0.00
md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
md1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 2107.80 0.00 8431.20 0.00 0.00 0.00 0.00 0.00 2.16 4.55 0.00 4.00 0.47 100.00
编辑 #2:尝试使用更大的扇区大小(4096 而不是 512)进行加密...
由于顶部显示 IRQ 处理程序使用了大部分 CPU 资源,因此我希望更大的加密块大小可以减少它。为了进行测试,我使用 重新格式化磁盘cryptsetup --sector-size=4096 luksFormat /dev/md127
。 cryptsetup 的 luksDump 命令确认它现在使用的加密扇区大小为 4096:
root@ReadyNAS102:~# cryptsetup luksDump /dev/md127
[...]
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 4096 [bytes]
[...]
然后我申请luksOpen
并进行了另一次测量:
root@ReadyNAS102:~# cryptsetup luksOpen /dev/md127 md127-decrypt
Enter passphrase for /dev/md127:
root@ReadyNAS102:~# dd if=/dev/zero of=/dev/mapper/md127-decrypt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 73.9352 s, 14.2 MB/s
看来 IRQ 的 CPU 负载下降了一点:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10791 root 0 -20 0 0 0 I 31.7 0.0 3:32.92 kworker/u3:1-kcryptd
245 root -51 0 0 0 0 S 22.9 0.0 4:38.98 irq/38-d0090000
29296 root 20 0 0 0 0 R 15.9 0.0 0:04.14 kworker/u2:0+flush-253:0
29356 root 20 0 0 0 0 R 15.9 0.0 0:04.09 dmcrypt_write
29538 root 20 0 7064 2280 1252 D 9.2 0.5 0:02.83 dd
这是 iostat -kx 5 显示的内容:
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.00 1030.00 0.00 14018.70 0.00 2474.80 0.00 70.61 0.00 0.56 0.54 0.00 13.61 0.44 45.44
sdb 0.00 1029.80 0.00 14018.70 0.00 2475.00 0.00 70.62 0.00 0.34 0.32 0.00 13.61 0.28 28.72
md127 0.00 3504.40 0.00 14017.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.00 0.00
md0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
md1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 3504.20 0.00 14016.80 0.00 0.00 0.00 0.00 0.00 2.91 10.18 0.00 4.00 0.28 99.44
看来更大的扇区大小有助于提高数据速率!我现在将针对不同的扇区大小尝试此操作。但是,我认为我不能仅仅增加扇区大小太多,而不会导致小文件的性能下降。由于我想在 md127-decrypt 之上使用 btrfs,因此扇区大小 4096 应该没有问题。 Btrfs 默认使用 16kB 节点大小,这可能是一个合理的上限。
编辑#3:数据速率与加密扇区大小
我编写了一个自动测试(bash 脚本),用于检查不同的扇区大小。但是,cryptsetup 不支持使用扇区大小 8192(消息:“cryptsetup:不支持的加密扇区大小。”)。因此,我将使用 4096 字节。
Sector Size Speed
512 bytes 8.7 MB/s
1024 bytes 11.8 MB/s
2048 bytes 13.8 MB/s
4096 bytes 14.4 MB/s