Я розслідую проблему, коли шифрування блочного пристрою накладає величезну штрафну ефективність при його написанні . Години читання в Інтернеті та експериментів не дали мені належного розуміння, не кажучи вже про рішення.
Питання коротше: Чому я отримую ідеально швидкі швидкості запису при покладенні btrfs на блоковий пристрій (~ 170 Мб / с), тоді як швидкість запису падає (~ 20 Мб / с), коли ставлять dm-крипту / LUKS між файлова система та блок пристроїв, хоча система більш ніж здатна підтримувати досить високу пропускну здатність шифрування?
Сценарій
/home/schlimmchen/random
це 4,0 ГБ файл, наповнений даними /dev/urandom
раніше.
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Читання це дуже швидко:
$ 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
(вдруге файл очевидно був прочитаний з кешу).
Нешифровані btrfs
Пристрій безпосередньо відформатований за допомогою btrfs (на блоковому пристрої немає таблиці розділів).
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
Швидкість запису досягає ~ 170 МБ / с:
$ 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
Швидкість читання набагато вище 200 МБ / с.
$ 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 на блоковому пристрої
Пристрій відформатовано LUKS, а отриманий пристрій відформатовано за допомогою 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
Швидкість читання страждає лише незначно (навіщо це взагалі?):
$ 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 у файлі на btrfs на блоковому пристрої
Швидкість запису "зростає" до понад 150 МБ / с при записі в зашифрований файл. Я поставив btrfs на блок пристрою, виділив файл на 16 ГБ, який я 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
Чому ефективність запису збільшується так? Чого саме це вкладення файлових систем та блокових пристроїв досягає для забезпечення високої швидкості запису?
Налаштування
Проблема може бути відтворена у двох системах, що працюють в одному і тому ж дистрибутиві та ядрі. Однак я також спостерігав низькі швидкості запису з ядром 3.19.0 на System2.
- Пристрій: SanDisk Extreme 64GB USB3.0 USB-накопичувач
- System1: Intel NUC 5i5RYH, i5-5250U (Broadwell), 8 Гб оперативної пам’яті, Samsung 840 EVO 250GB SSD
- System2: Lenovo T440p, i5-4300M (Haswell), 16 Гб оперативної пам’яті, Samsung 850 PRO 256 ГБ SSD
- Distro / Kernel: Debian Jessie, 3.16.7
- криптовалюта: 1.6.6
/proc/crypto
для System1: http://pastebin.com/QUSGMfiScryptsetup benchmark
для System1: http://pastebin.com/4RxzPFeT- btrfs (-tools) - версія 3.17
lsblk -t /dev/sdf
: http://pastebin.com/nv49tYWc
Думки
- Наскільки я бачу, вирівнювання не є причиною. Навіть якщо розмір сторінки палиці становить 16 Кбіт, запуск корисного навантаження криптовалюти в будь-якому разі вирівняється до 2 Мбіт.
--allow-discards
(для luxOpen cryptsetup) не допомогло, як я очікував.- Роблячи набагато менше експериментів з цим, я спостерігав дуже схожу поведінку із зовнішнім жорстким диском, підключеним через адаптер USB3.0.
- Мені здається, що система записує блоки 64KiB. Systemtrap сценарій я спробував показує , що принаймні.
/sys/block/sdf/stat
підтримує цю гіпотезу, оскільки багато записів об'єднано. Тому я здогадуюсь, що написання занадто маленькими блоками не є причиною. - Не пощастило змінити планувальник блоків черг пристроїв на NOOP.
- Введення крипти в об'єм LVM не допомогло.