LUKS暗号化パーティションのデータアクセス速度

LUKS暗号化パーティションのデータアクセス速度

Linux (Fedora 28) では、ホーム ディレクトリを LUKS で暗号化しており、Gnome Disk (スクリーンショット) を使用すると、基礎となる LUKS パーティション (上部の青い四角形) と復号化されたホーム パーティション (下部の白い四角形) を個別にベンチマークできます。

LUKS パーティションのアクセス時間は 500MB/秒ですが、復号化されたアクセスでは 350MB/秒になります。明確に言うと、これは 500GB SSD の同じパーティションです。

次のように結論付けるのは妥当だろうか暗号化データアクセスが 30% (= 150/500) 遅くなっていますか?

このタイプの数字は文書化されていますか、それとも私が何か間違っているのでしょうか。これは私が予想していたよりもはるかに遅いです。

スクリーンショットディスク


編集:これは私の出力です

$ cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       384375 iterations per second for 256-bit key
PBKDF2-sha256     494611 iterations per second for 256-bit key
PBKDF2-sha512     323634 iterations per second for 256-bit key
PBKDF2-ripemd160  293225 iterations per second for 256-bit key
PBKDF2-whirlpool  185917 iterations per second for 256-bit key
argon2i       4 iterations, 748334 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      4 iterations, 745443 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b       195.0 MiB/s       664.0 MiB/s
    serpent-cbc        128b        28.8 MiB/s        94.7 MiB/s
    twofish-cbc        128b        58.8 MiB/s       111.6 MiB/s
        aes-cbc        256b       146.5 MiB/s       507.3 MiB/s
    serpent-cbc        256b        33.3 MiB/s       110.2 MiB/s
    twofish-cbc        256b        59.3 MiB/s       123.6 MiB/s
        aes-xts        256b       433.7 MiB/s       416.8 MiB/s
    serpent-xts        256b       101.0 MiB/s        94.7 MiB/s
    twofish-xts        256b       111.8 MiB/s       110.3 MiB/s
        aes-xts        512b       349.5 MiB/s       356.6 MiB/s
    serpent-xts        512b       101.6 MiB/s        96.0 MiB/s
    twofish-xts        512b       111.2 MiB/s       108.1 MiB/s

$ lscpu | grep aes
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge 
mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall
 nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology
 nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est 
tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer
 aes xsave avx f16c rdrand lahf_lm cpuid_fault epb pti ssbd ibrs ibpb stibp
 tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm 
ida arat pln pts flush_l1d

2020年編集:コンピュータを変更したら、crypto ベンチマークの結果がまったく変わりました。これは、プロセッサの高速化だけでは説明できないほどです。つまり、古いハードウェアには専用の暗号化チップが搭載されていなかったのだと思います。

$ cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1      1756408 iterations per second for 256-bit key
PBKDF2-sha256    2264742 iterations per second for 256-bit key
PBKDF2-sha512    1653905 iterations per second for 256-bit key
PBKDF2-ripemd160  949797 iterations per second for 256-bit key
PBKDF2-whirlpool  711381 iterations per second for 256-bit key
argon2i       8 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      8 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b      1256.4 MiB/s      3669.2 MiB/s
    serpent-cbc        128b       101.6 MiB/s       771.8 MiB/s
    twofish-cbc        128b       230.0 MiB/s       418.4 MiB/s
        aes-cbc        256b       947.9 MiB/s      2961.6 MiB/s
    serpent-cbc        256b       105.1 MiB/s       785.0 MiB/s
    twofish-cbc        256b       235.7 MiB/s       424.5 MiB/s
        aes-xts        256b      2209.9 MiB/s      2218.9 MiB/s
    serpent-xts        256b       762.0 MiB/s       776.6 MiB/s
    twofish-xts        256b       415.7 MiB/s       384.0 MiB/s
        aes-xts        512b      1701.8 MiB/s      1677.2 MiB/s
    serpent-xts        512b       713.7 MiB/s       769.6 MiB/s
    twofish-xts        512b       407.9 MiB/s       414.2 MiB/s

答え1

暗号化により、各ディスク ブロックはアクセス時に OS によって復号化される必要があるため、CPU 負荷がさらに増加し​​ます。テスト結果 (約 600 MB/秒の復号化) は、i7 での一般的な AES 処理としては平均的なものです。

この問題を回避するために、最近の CPU には通常、ハードウェア ベースの AES サポートが組み込まれています。Intel はこの機能を「AES-NI」(図ではlscpu「aes」と表示) と呼んでおり、これにより同じ AES 復号化で 2~3 GB/秒の速度を実現できます。

まず実行してlscpu、機能フラグの中に「aes」が含まれているかどうかを確認します。インテルARKCPU モデルには存在すると表示されますが、ファームウェア (BIOS) 設定によって無効になっている可能性があります。(ARK には脚注があります:「一部の製品は、プロセッサ構成の更新により AES New Instructions をサポートできます。最新のプロセッサ構成の更新を含む BIOS については、OEM にお問い合わせください。」

Linux は、ハードウェア アクセラレーションを有効にするために「aesni_intel」モジュールを使用します。 を実行して、カーネルで有効になっているかどうかを確認しますzgrep AES_NI_INTEL /proc/config.gz。「 」と表示される場合は=y、メイン カーネル イメージの一部であり、使用できるはずです。

出力に " =m" と表示される場合は、モジュールとしてコンパイルされています。 を実行して、モジュールを手動でロードしてみてください。 コマンドがモジュールを見つけられない場合は、再起動する必要がある可能性があります。 (再起動後、と同じカーネル バージョンが表示されていることをsudo modprobe -v aesni_intel確認してください。)uname -rls /lib/modules

関連情報