Sto studiando un problema in cui la crittografia di un dispositivo a blocchi impone un'enorme penalità di prestazione quando si scrive su di esso. Ore di lettura ed esperimenti su Internet non mi hanno fornito una comprensione adeguata, figuriamoci una soluzione.
La domanda in breve: perché ottengo velocità di scrittura perfettamente elevate quando inserisco un btrfs su un dispositivo a blocchi (~ 170 MB / s), mentre la velocità di scrittura precipita (~ 20 MB / s) quando inserisco un dm-crypt / LUKS tra file system e dispositivo a blocchi, sebbene il sistema sia più che in grado di sostenere un throughput di crittografia sufficientemente elevato?
Scenario
/home/schlimmchen/random
è un file da 4.0 GB pieno di dati /dev/urandom
precedenti.
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Leggerlo è super veloce:
$ 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
(la seconda volta, il file è stato ovviamente letto dalla cache).
Btrfs non crittografato
Il dispositivo viene formattato direttamente con btrfs (nessuna tabella delle partizioni sul dispositivo a blocchi).
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
La velocità di scrittura arriva fino a ~ 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
La velocità di lettura è ben al di sopra di 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
Btrfs crittografato sul dispositivo a blocchi
Il dispositivo è formattato con LUKS e il dispositivo risultante è formattato con 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
La velocità di lettura soffre solo marginalmente (perché lo fa affatto?):
$ 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 crittografato nel file su btrfs sul dispositivo a blocchi
La velocità di scrittura "sale alle stelle" a oltre 150 MB / s quando si scrive in un file crittografato. Ho messo un btrfs sul dispositivo a blocchi, ho assegnato un file da 16 GB, che ho lukfsFormat
editato e montato.
$ 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
Perché le prestazioni di scrittura aumentano in questo modo? Che cosa ottiene questo particolare annidamento di filesystem e dispositivi a blocchi per aiutare ad alte velocità di scrittura?
Impostare
Il problema è riproducibile su due sistemi che eseguono la stessa distribuzione e kernel. Tuttavia, ho anche osservato le basse velocità di scrittura con il kernel 3.19.0 su System2.
- Dispositivo: chiavetta USB 3.0 USB SanDisk Extreme da 64 GB
- System1: Intel NUC 5i5RYH, i5-5250U (Broadwell), 8 GB di RAM, SSD Samsung 840 EVO da 250 GB
- System2: Lenovo T440p, i5-4300M (Haswell), 16GB RAM, SSD Samsung 850 PRO 256GB
- Distro / Kernel: Debian Jessie, 3.16.7
- cryptsetup: 1.6.6
/proc/crypto
per System1: http://pastebin.com/QUSGMfiScryptsetup benchmark
per System1: http://pastebin.com/4RxzPFeT- btrfs (-tools) è la versione 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
Pensieri
- L'allineamento non è la causa per quanto posso vedere. Anche se la dimensione della pagina dello stick è di 16 KiB, l'inizio del payload di cryptsetup è comunque allineato a 2MiB.
--allow-discards
(per luksOpen di cryptsetup) non ha aiutato, come mi aspettavo.- Mentre facevo molti meno esperimenti con esso, ho osservato un comportamento molto simile con un disco rigido esterno, collegato tramite un adattatore USB 3.0.
- Mi sembra che il sistema stia scrivendo blocchi da 64 KiB. Uno script systemtrap che ho provato indica almeno questo.
/sys/block/sdf/stat
sostiene questa ipotesi poiché molte scritture sono state unite. Quindi la mia ipotesi è che scrivere in blocchi troppo piccoli non sia la causa. - Nessuna fortuna con la modifica dello scheduler della coda dei dispositivi a blocchi su NOOP.
- Mettere la cripta in un volume LVM non ha aiutato.