Ich untersuche ein Problem, bei dem das Verschlüsseln eines Blockgeräts beim Schreiben eine enorme Leistungseinbuße mit sich bringt . Stundenlanges Lesen und Experimentieren im Internet verschafften mir kein richtiges Verständnis, geschweige denn eine Lösung.
Die Frage in Kürze: Warum bekomme ich perfekt schnelle Schreibgeschwindigkeiten, wenn ich ein BTRFS auf ein Blockgerät lege (~ 170MB / s), während die Schreibgeschwindigkeit (~ 20MB / s) sinkt, wenn ich eine dm-Krypta / LUKS dazwischen lege? Dateisystem und das Blockgerät, obwohl das System mehr als in der Lage ist, einen ausreichend hohen Verschlüsselungsdurchsatz aufrechtzuerhalten?
Szenario
/home/schlimmchen/random
ist eine 4.0 GB große Datei, die mit Daten aus /dev/urandom
früheren Versionen gefüllt ist .
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Das Lesen geht super schnell:
$ 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
(Das zweite Mal wurde die Datei offensichtlich aus dem Cache gelesen.)
Unverschlüsselte BTRFS
Das Gerät ist direkt mit btrfs formatiert (keine Partitionstabelle auf dem Blockgerät).
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
Die Schreibgeschwindigkeit erreicht bis zu ~ 170 MB / 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
Die Lesegeschwindigkeit liegt deutlich über 200 MB / 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
Verschlüsselte BTRFS auf Block-Gerät
Das Gerät ist mit LUKS formatiert, und das resultierende Gerät ist mit btrfs formatiert:
$ 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
Die Lesegeschwindigkeit leidet nur geringfügig (warum überhaupt?):
$ 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
Verschlüsselte BTRFS in Datei auf BTRFS auf Blockgerät
Die Schreibgeschwindigkeit "steigt" auf über 150 MB / s, wenn in eine verschlüsselte Datei geschrieben wird. Ich habe ein BTRFS auf das Block-Gerät gelegt und eine 16-GB-Datei zugewiesen, die ich lukfsFormat
bearbeitet und gemountet habe.
$ 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
Warum steigt die Schreibleistung so? Was bewirkt diese spezielle Verschachtelung von Dateisystemen und Blockgeräten, um hohe Schreibgeschwindigkeiten zu erzielen?
Installieren
Das Problem ist auf zwei Systemen reproduzierbar, auf denen dieselbe Distribution und derselbe Kernel ausgeführt werden. Allerdings habe ich auch die niedrigen Schreibgeschwindigkeiten mit Kernel 3.19.0 auf System2 beobachtet.
- Gerät: SanDisk Extreme 64 GB USB 3.0 USB-Stick
- System 1: Intel NUC 5i5RYH, i5-5250U (Broadwell), 8 GB RAM, Samsung 840 EVO 250 GB SSD
- System 2: Lenovo T440p, i5-4300M (Haswell), 16 GB RAM, Samsung 850 PRO 256 GB SSD
- Distribution / Kernel: Debian Jessie, 3.16.7
- Cryptsetup: 1.6.6
/proc/crypto
für System1: http://pastebin.com/QUSGMfiScryptsetup benchmark
für System1: http://pastebin.com/4RxzPFeT- btrfs (-tools) ist Version 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
Gedanken
- Die Ausrichtung ist meines Erachtens nicht die Ursache. Selbst wenn die Seitengröße des Sticks 16 KB beträgt, ist der Start der Cryptsetup-Nutzdaten ohnehin auf 2 MB ausgerichtet.
--allow-discards
(für luksOpen von cryptsetup) hat nicht geholfen, wie ich erwartet hatte.- Während ich viel weniger Experimente damit machte, beobachtete ich ein sehr ähnliches Verhalten bei einer externen Festplatte, die über einen USB3.0-Adapter angeschlossen war.
- Es scheint mir, dass das System 64-KB-Blöcke schreibt. Ein Systemtrap-Skript, das ich ausprobiert habe, zeigt dies zumindest an.
/sys/block/sdf/stat
unterstützt diese Hypothese, da viele Schreibvorgänge zusammengeführt werden. Ich vermute also, dass das Schreiben in zu kleinen Blöcken nicht die Ursache ist. - Kein Glück, den Warteschlangenplaner für Blockgeräte auf NOOP zu ändern.
- Das Einfügen der Krypta in ein LVM-Volume hat nicht geholfen.