c语言crypt加密多线程,糟糕的通用dm-crypt(LUKS)写入性能

我正在研究一个问题,其中对块设备进行加密在写入时会带来巨大的性能损失。数小时的互联网阅读和实验并没有为我提供适当的了解,更不用说解决方案了。

简而言之,问题是:为什么在将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

cryptsetup benchmark对于System1:http : //pastebin.com/4RxzPFeT

btrfs(-tools)是版本3.17

思想

据我所知,对齐并不是原因。即使记忆棒的页面大小为16KiB,cryptsetup有效载荷起始也始终与2MiB对齐。

--allow-discards (对于cryptsetup的luksOpen)没有帮助,正如我所期望的那样。

在进行更少的实验时,我观察到通过USB3.0适配器连接的外部硬盘驱动器的行为非常相似。

在我看来,该系统正在写入64KiB块。我尝试过的systemtrap脚本至少表明了这一点。/sys/block/sdf/stat由于大量写入被合并,因此支持了该假设。所以我的猜测是,写得太小不是原因。

不能将块设备队列调度程序更改为NOOP。

将加密放入LVM卷中无济于事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值