使用 dm-integrity 进行 Cryptsetup - 奇怪的基准测试结果

使用 dm-integrity 进行 Cryptsetup - 奇怪的基准测试结果

我正在对各种cryptsetup卷进行基准测试,并且在 Debian 上得到了意想不到的结果。

我使用的数字来自这次演讲作为粗略的参考。其中一张幻灯片显示了各种配置的基准测试结果:

显示 cryptsetup 各种配置基准的幻灯片,日志在所有配置中将 R/W 吞吐量减少了约 40%。

我的设置并不相同,并且我在虚拟机中运行所有测试,因此我不希望结果完全相同,但我认为它们应该大致反映幻灯片上的内容。特别是,我预计经过身份验证的完整性模式的性能会下降约 35(AES-XTS、HMAC-SHA256)与未经认证的对应方相比(AES-XTS),然后是日记完整性与非日记完整性的 35%。

但以下是我的结果,与 Ubuntu Server 20.04 和 Debian 10.4 类似:

LUKS2 container:
    Capacity    1056964608 B
    Read        26.5MB/s
    Write       8855kB/s

LUKS2 with hmac-sha256, no journal:
    Capacity    1040322560 B
    Read        19.0MB/s
    Write       6352kB/s

LUKS2 with hmac-sha256, journaled:
    Capacity    1040322560 B
    Read        18.9MB/s
    Write       6311kB/s

启用完整性后,性能会下降约 30%,这是预期的。但日记式完整性和非日记式完整性之间的差异是微乎其微的。我的意思是,这比原始基准要好得多,所以我应该感到高兴,但我怎么知道该期刊实际上正在发挥作用,如果是的话,我如何选择退出?

这是我的cryptsetup格式命令:

cryptsetup luksFormat --type luks2 /dev/sdb --sector-size 4096
cryptsetup luksFormat --type luks2 /dev/sdb --sector-size 4096 --integrity hmac-sha256
cryptsetup luksFormat --type luks2 /dev/sdb --sector-size 4096 --integrity hmac-sha256 --integrity-no-journal

基准测试命令:

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=/dev/mapper/sdb --bs=4k --iodepth=64 --readwrite=randrw --rwmixread=75

VM 在 VirtualBox 6.1 上配置,分别使用 Debian 或 Ubuntu 的默认设置。磁盘是 1 GB VDI,固定大小并预先填充零,禁用主机缓冲。底层 SSD 使用 4k 扇区,因此--sector-size 4096.

有趣的是,基本--integrity变体和--integrity-no-journal变体都创建sdb_dif带有日志的中间映射设备,并且两个sdb设备具有相同的大小:

$ sudo integritysetup status /dev/mapper/sdb_dif
/dev/mapper/sdb_dif is active and is in use.
  type:    INTEGRITY
  tag size: 32
  integrity: (none)
  device:  /dev/sdb
  sector size:  4096 bytes
  interleave sectors: 32768
  size:    2031880 sectors
  mode:    read/write
  failures: 0
  journal size: 8380416 bytes
  journal watermark: 50%
  journal commit time: 10000 ms

$ sudo blockdev --getsize64 /dev/mapper/sdb
1040322560

答案1

回答摘要:

cryptsetup format 忽略旗帜--integrity-no-journal

相反,您的选择是:

  • 每次open,总是提供--integrity-no-journal
  • 首次打开时(即使用文件系统格式化内部设备或将内部设备添加到 MD RAID 时),请提供--persistent --integrity-no-journal保留--integrity-no-journal设置。那么未来open就不需要flag了。此选项仅适用于cryptsetup,如果您使用 direct 则无效integritysetup
  • 当设备已经open编辑完毕时,发出refresh --persistent --integrity-no-journal.此选项仅适用于cryptsetup,如果您使用 direct 则无效integritysetup

旧文本:

您是否--integrity-no-journal向 提供了标志integritysetup open?看起来确实dm-integrity如此不是格式化时将(不)存在的日志保存在超级块中。

我用integritysetup format /dev/sdb1 --no-wipe.

然后我用integritysetup open /dev/sdb1 int-sdb1和 打开它sync; echo 1 > /proc/sys/vm/drop_caches; dd count=16384 bs=4096 if=/dev/zero of=/dev/mapper/int-sdb1。这始终给我带来 2.1Mb/s 到 2.4Mb/s 之间的结果。

我关闭它,然后使用 重新打开integritysetup open /dev/sdb1 int-sdb1 --integrity-no-journal,并发出相同的dd命令。这次它给了我从 4.0Mb/s 到 7.0Mb/s 的速度,这是一个显着的进步。巨大的差异可能是由于闪存转换层造成的;这是一张糟糕的一次性廉价磁盘。

我又用 重复了一遍integritysetup format /dev/sdb1 --no-wipe --integrity-no-journal。再说一次,重要的是你是否给予--integrity-no-journalopen命令,不是format命令。

所以这可能是一个不明确的问题integritysetup。如果你--integrity-no=journal听从format命令的话。

相关内容