LUKS暗号化を使用すると、NVMeのパフォーマンスが低下します。

LUKS暗号化を使用すると、NVMeのパフォーマンスが低下します。

Proxmoxホストですべてのコマンドを実行し、ディスクをLUKS暗号化すると、読み取り速度が28%、書き込み速度が66%増加しました。 aes-niが有効になっていて、ハードウェアアクセラレーションで十分なパフォーマンスを得ることができるので、実際に何が起こっているのかわかりません...また、暗号化されていないドライブに速く書き込むことは意味がありません。

root@red:/dev/mapper# lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda       8:0    0 111.8G  0 disk
├─sda1    8:1    0  1007K  0 part
├─sda2    8:2    0   512M  0 part
└─sda3    8:3    0 111.3G  0 part
sdb       8:16   0 111.8G  0 disk
├─sdb1    8:17   0  1007K  0 part
├─sdb2    8:18   0   512M  0 part
└─sdb3    8:19   0 111.3G  0 part
sdc       8:32   0  12.8T  0 disk
sdd       8:48   0  12.8T  0 disk
nvme0n1 259:0    0 465.8G  0 disk

root@red:/dev/mapper# hdparm -t /dev/nvme0n1

/dev/nvme0n1:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 Timing buffered disk reads: 4774 MB in  3.00 seconds = 1591.14 MB/sec

root@red:/dev/mapper# dd if=/dev/zero of=/dev/nvme0n1 oflag=direct bs=128k count=32k
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 2.39636 s, 1.8 GB/s

それでは、次のように暗号化したいと思います。

root@red:~# cryptsetup luksFormat /dev/nvme0n1

WARNING!
========
This will overwrite data on /dev/nvme0n1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/nvme0n1:
Verify passphrase:

root@red:~# cryptsetup luksOpen /dev/nvme0n1 Test
Enter passphrase for /dev/nvme0n1:

root@red:~# lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda       8:0    0 111.8G  0 disk
├─sda1    8:1    0  1007K  0 part
├─sda2    8:2    0   512M  0 part
└─sda3    8:3    0 111.3G  0 part
sdb       8:16   0 111.8G  0 disk
├─sdb1    8:17   0  1007K  0 part
├─sdb2    8:18   0   512M  0 part
└─sdb3    8:19   0 111.3G  0 part
sdc       8:32   0  12.8T  0 disk
sdd       8:48   0  12.8T  0 disk
nvme0n1 259:0    0 465.8G  0 disk
└─Test  253:0    0 465.8G  0 crypt


root@red:~# hdparm -t /dev/mapper/Test

/dev/mapper/Test:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 Timing buffered disk reads: 3450 MB in  3.00 seconds = 1149.84 MB/sec

root@red:~# dd if=/dev/zero of=/dev/mapper/Test oflag=direct bs=128k count=32k
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 6.83405 s, 628 MB/s
root@red:~#

これはcryptsetupのベンチマークです。

root@red:~# cryptsetup benchmark
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b      1011.6 MiB/s      3031.2 MiB/s
    serpent-cbc        128b        85.2 MiB/s       646.1 MiB/s
    twofish-cbc        128b       192.3 MiB/s       354.1 MiB/s
        aes-cbc        256b       792.4 MiB/s      2475.1 MiB/s
    serpent-cbc        256b        87.2 MiB/s       648.4 MiB/s
    twofish-cbc        256b       193.2 MiB/s       355.4 MiB/s
        aes-xts        256b      1921.2 MiB/s      1919.5 MiB/s
    serpent-xts        256b       626.2 MiB/s       634.2 MiB/s
    twofish-xts        256b       349.9 MiB/s       353.1 MiB/s
        aes-xts        512b      1780.3 MiB/s      1768.5 MiB/s
    serpent-xts        512b       614.3 MiB/s       637.7 MiB/s
    twofish-xts        512b       353.2 MiB/s       352.5 MiB/s

root@red:~# root@red:~# cryptsetup luksDump /dev/nvme0n1
LUKS header information
Version:        2
Epoch:          3
Metadata area:  16384 [bytes]
Keyslots area:  16744448 [bytes]
UUID:           XXXX
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]

root@red:~# sort -u /proc/crypto | grep module
module       : aesni_intel
module       : crc32_pclmul
module       : crct10dif_pclmul
module       : cryptd
module       : ghash_clmulni_intel
module       : kernel
module       : serpent_avx2
module       : serpent_avx_x86_64
module       : serpent_generic
module       : serpent_sse2_x86_64
module       : twofish_avx_x86_64
module       : twofish_generic
module       : twofish_x86_64
module       : twofish_x86_64_3way
root@red:~#

aes-xtsを使ったベンチマークから約1700MB/sが出てくるのに、なぜドライブ速度がそんなに影響を受けるのだろうか。どんな助けでも大変感謝します!

ベストアンサー1

~からcryptsetup ベンチマークマニュアルページ:

注:このベンチマークはメモリのみを使用し、参照用にのみ使用されます。これにより、実際のストレージ暗号化速度を直接予測することはできません。

出力の最初の行もこれにヒントを提供しますcryptsetup benchmark(強調):

root@archiso ~ # cryptsetup benchmark                                                                  
# Tests are approximate using memory only (no storage IO).
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PBKDF2-sha1      1875806 iterations per second for 256-bit key
...

これが実際のストレージ階層でこれらの違いを見ることができる理由ですdd。ファイルシステムタイプとマウントオプション自体が独自のオーバーヘッドを追加します。例えばzstdレベル1ソフト圧縮を使用するBtrfsでは:

root@archiso ~ # hdparm -t /dev/nvme0n1 
/dev/nvme0n1:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 Timing buffered disk reads: 4658 MB in  3.00 seconds = 1552.45 MB/sec

# cryptsetup luksFormat  /dev/nvme0n1p2
# cryptsetup open --allow-discards !$ luks

# hdparm -t /dev/mapper/luks
/dev/mapper/luks:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 Timing buffered disk reads: 3638 MB in  3.00 seconds = 1212.52 MB/sec

# mkfs.btrfs --label btrfs -m dup --csum xxhash /dev/mapper/luks
# mount -t btrfs -o noatime,ssd,compress=zstd:1,autodefrag /dev/disk/by-label/btrfs /mnt
# dd if=/dev/zero of=/mnt/test oflag=direct bs=128k count=32k
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 7.76791 s, 553 MB/s

圧縮しないと、あなたと同様の結果が得られます。

# rm /mnt/test
# umount /mnt
# mount -t btrfs -o noatime,ssd,autodefrag /dev/disk/by-label/btrfs /mnt 
# dd if=/dev/zero of=/mnt/test oflag=direct bs=128k count=32k
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 6.35182 s, 676 MB/s

これは、Intel Core i5-10210Uプロセッサと2x4G LPDDR3 2133 MT / s Samsungメモリを搭載したIntel 660p 512G NVMeドライブにあります。ソフトウェア暗号化の利点を享受するには、NVMeストレージのパフォーマンスをあまりにもあきらめる必要があることは本当に残念です。

Cloudflareはいくつかのことをしました。Linuxディスク暗号化の高速化どのLinux 5.9にマージそして通常5.10.9で利用可能、しかしありますレポート実際には損傷性能保存が含まれている場合は、マイユースケースで確認できます。

ソフトウェアが最新であると仮定すると、次のものを使用できます。cryptsetup openそして:

--perf-no_read_workqueue--perf-no_write_workqueue

dm-crypt 内部作業キューをバイパスし、読み取りまたは書き込み要求を同期的に処理します。

メモ:これらのオプションは、低レベルのdm-cryptパフォーマンス調整にのみ使用され、デフォルトのdm-crypt動作を変更する必要がある場合にのみ使用する必要があります。カーネル5.9以上が必要です。

上記のRedditリンクでは、読み取りオプションを有効にして書き込みオプションを無視することをお勧めします。いつものように、テストしてベンチマークする必要があります!

おすすめ記事