Estoy investigando un problema en el que cifrar un dispositivo de bloque impone una gran penalización de rendimiento al escribir en él. Horas de lectura y experimentos en Internet no me proporcionaron una comprensión adecuada, y mucho menos una solución.
La pregunta en resumen: ¿por qué obtengo velocidades de escritura perfectamente rápidas cuando pongo un btrfs en un dispositivo de bloque (~ 170MB / s), mientras que la velocidad de escritura cae en picada (~ 20MB / s) cuando pongo un dm-crypt / LUKS entre sistema de archivos y el dispositivo de bloque, aunque el sistema es más que capaz de mantener un rendimiento de cifrado suficientemente alto?
Guión
/home/schlimmchen/random
es un archivo de 4.0GB lleno de datos de /dev/urandom
antes.
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Leerlo es súper rápido:
$ 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 segunda vez, el archivo obviamente se leyó del caché).
Btrfs sin cifrar
El dispositivo está formateado directamente con btrfs (sin tabla de particiones en el dispositivo de bloque).
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
La velocidad de escritura llega 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 velocidad de lectura está muy por encima de 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 cifrados en el dispositivo de bloque
El dispositivo está formateado con LUKS, y el dispositivo resultante está formateado 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 velocidad de lectura sufre solo marginalmente (¿por qué lo hace en absoluto?):
$ 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 cifrados en el archivo en btrfs en el dispositivo de bloque
La velocidad de escritura "se dispara" a más de 150 MB / s cuando se escribe en un archivo cifrado. Puse un btrfs en el dispositivo de bloque, asigné un archivo de 16GB, que edité y monté lukfsFormat
.
$ 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
¿Por qué aumenta el rendimiento de escritura de esta manera? ¿Qué logra este anidamiento particular de sistemas de archivos y dispositivos de bloque para ayudar en altas velocidades de escritura?
Preparar
El problema es reproducible en dos sistemas que ejecutan la misma distribución y kernel. Sin embargo, también observé las bajas velocidades de escritura con el kernel 3.19.0 en System2.
- Dispositivo: SanDisk Extreme 64GB USB3.0 USB Stick
- Sistema1: Intel NUC 5i5RYH, i5-5250U (Broadwell), 8GB RAM, Samsung 840 EVO 250GB SSD
- Sistema2: Lenovo T440p, i5-4300M (Haswell), 16GB RAM, Samsung 850 PRO 256GB SSD
- Distro / Kernel: Debian Jessie, 3.16.7
- cryptsetup: 1.6.6
/proc/crypto
para System1: http://pastebin.com/QUSGMfiScryptsetup benchmark
para System1: http://pastebin.com/4RxzPFeT- btrfs (-tools) es la versión 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
Pensamientos
- La alineación no es la causa por lo que puedo ver. Incluso si el tamaño de página del dispositivo es de 16 KB, el inicio de la carga útil de cryptsetup está alineado a 2 Mb de todos modos.
--allow-discards
(para crykssetup's luksOpen) no ayudó, como esperaba.- Mientras hacía muchos menos experimentos con él, observé un comportamiento muy similar con un disco duro externo, conectado a través de un adaptador USB3.0.
- Me parece que el sistema está escribiendo bloques de 64 KB. Un script de systemtrap que probé indica que al menos eso.
/sys/block/sdf/stat
respalda esta hipótesis, ya que muchas escrituras se fusionan. Entonces, supongo que escribir en bloques demasiado pequeños no es la causa. - No hubo suerte con cambiar el planificador de la cola del dispositivo de bloque a NOOP.
- Poner la cripta en un volumen LVM no ayudó.