我正在研究一个问题,其中对块设备进行加密在写入时会带来巨大的性能损失。数小时的互联网阅读和实验并没有为我提供适当的了解,更不用说解决方案了。
简而言之,问题是:为什么在将btrfs放在块设备上时,我能获得非常快的写入速度(〜170MB / s),而在两者之间放置dm-crypt / LUKS时,写入速度却急剧下降(〜20MB / s)。文件系统和块设备,尽管该系统还能够维持足够高的加密吞吐量?
情境
/home/schlimmchen/random
是一个4.0GB的文件,其中填充了/dev/urandom
以前的数据。
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
读起来超级快:
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 6.58036 s, 648 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 0.786102 s, 5.4 GB/s
(第二次,显然是从缓存中读取了文件)。
未加密的btrfs
该设备直接使用btrfs格式化(块设备上没有分区表)。
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
写入速度高达〜170MB / s:
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 27.1564 s, 157 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test2 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 25.1882 s, 169 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test3 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 29.8419 s, 143 MB/s
读取速度远高于200MB / s。
$ dd if=/mnt/dd-test1 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.8265 s, 215 MB/s
$ dd if=/mnt/dd-test2 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.9821 s, 213 MB/s
$ dd if=/mnt/dd-test3 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 19.8561 s, 215 MB/s
块设备上的加密btrfs
该设备用LUKS格式化,结果设备用btrfs格式化:
$ sudo cryptsetup luksFormat /dev/sdf
$ sudo cryptsetup luksOpen /dev/sdf crypt
$ sudo mkfs.btrfs /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt /mnt
$ sudo chmod 777 /mnt
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 210.42 s, 20.3 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test2 bs=1M
4265841146 bytes (4.3 GB) copied, 207.402 s, 20.6 MB/s
读取速度仅受到轻微影响(为什么会这样?):
$ dd if=/mnt/dd-test1 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 22.2002 s, 192 MB/s
$ dd if=/mnt/dd-test2 of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 22.0794 s, 193 MB/s
luksDump:http://pastebin.com/i9VYRR0p
块设备上btrfs上文件中的加密btrfs
写入加密文件时,写入速度“飙升”到150MB / s以上。我将一个btrfs放到块设备上,分配了一个16GB的文件,lukfsFormat
并进行了安装。
$ sudo mkfs.btrfs /dev/sdf -f
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
$ dd if=/dev/zero of=/mnt/crypted-file bs=1M count=16384 conv=fsync
17179869184 bytes (17 GB) copied, 100.534 s, 171 MB/s
$ sudo cryptsetup luksFormat /mnt/crypted-file
$ sudo cryptsetup luksOpen /mnt/crypted-file crypt
$ sudo mkfs.btrfs /dev/mapper/crypt
$ sudo mount /dev/mapper/crypt /tmp/nested/
$ dd if=/home/schlimmchen/Documents/random of=/tmp/nested/dd-test1 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 26.4524 s, 161 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/tmp/nested/dd-test2 bs=1M conv=fsync
4265841146 bytes (4.3 GB) copied, 27.5601 s, 155 MB/s
为什么写性能会这样提高?文件系统和块设备的这种特殊嵌套可实现什么以帮助提高写入速度?
设定
在运行相同发行版和内核的两个系统上,该问题可重现。但是,我还观察到System2上内核3.19.0的写入速度较低。
- 设备:SanDisk Extreme 64GB USB3.0 USB记忆棒
- 系统1:Intel NUC 5i5RYH,i5-5250U(Broadwell),8GB RAM,三星840 EVO 250GB SSD
- 系统2:联想T440p,i5-4300M(Haswell),16GB RAM,三星850 PRO 256GB SSD
- 发行版/内核:Debian Jessie,3.16.7
- 加密设置:1.6.6
/proc/crypto
对于System1:http://pastebin.com/QUSGMfiScryptsetup benchmark
对于System1:http : //pastebin.com/4RxzPFeT- btrfs(-tools)是版本3.17
lsblk -t /dev/sdf
:http://pastebin.com/nv49tYWc
思想
- 据我所知,对齐并不是原因。即使记忆棒的页面大小为16KiB,cryptsetup有效载荷起始也始终与2MiB对齐。
--allow-discards
(对于cryptsetup的luksOpen)没有帮助,正如我所期望的那样。- 在进行更少的实验时,我观察到通过USB3.0适配器连接的外部硬盘驱动器的行为非常相似。
- 在我看来,该系统正在写入64KiB块。我尝试过的systemtrap脚本至少表明了这一点。
/sys/block/sdf/stat
由于大量写入被合并,因此支持了该假设。所以我的猜测是,写得太小不是原因。 - 不能将块设备队列调度程序更改为NOOP。
- 将加密放入LVM卷中无济于事。