5

Я установил программный RAID5 для Linux на три жестких диска и хочу зашифровать его с помощью cryptsetup/LUKS. Мои тесты показали, что шифрование приводит к значительному снижению производительности, что я не могу объяснить.

RAID5 способен записывать 187 МБ / с [1] без шифрования. Благодаря шифрованию скорость записи снижается примерно до 40 МБ / с.

RAID имеет размер порции 512 КБ и битовую карту с намерением записи. Я использовал -c aes-xts-plain -s 512 --align-payload=2048 в качестве параметров для cryptsetup luksFormat , поэтому полезная нагрузка должна быть выровнена по 2048 блокам по 512 байт (т.е. 1 МБ). cryptsetup luksDump показывает смещение полезной нагрузки 4096. Поэтому я считаю, что выравнивание правильное и соответствует размеру фрагмента RAID.

Процессор не является узким местом, так как он имеет аппаратную поддержку AES (aesni_intel). Если я пишу на другой диск (SSD с LVM), который также зашифрован, у меня скорость записи составляет 150 МБ / с. top показывает, что загрузка процессора действительно очень низкая, только RAID5 xor занимает 14%.

Я также попытался поместить файловую систему (ext4) непосредственно в незашифрованный RAID, чтобы проверить, не является ли расслоение проблемой. Файловая система несколько снижает производительность, как и ожидалось, но не так сильно (скорость записи меняется, но> 100 МБ / с).

Резюме:
Диски + RAID5: хорошо
Диски + RAID5 + ext4: хорошо
Диски + RAID5 + шифрование: плохо
SSD + шифрование + LVM + ext4: хорошо

Шифрование не влияет на производительность чтения, оно составляет 207 МБ / с без и 205 МБ / с с шифрованием (что также свидетельствует о том, что мощность процессора не является проблемой).

Что я могу сделать, чтобы улучшить производительность записи зашифрованного RAID?

[1] Все измерения скорости были выполнены с несколькими прогонами dd if=/dev/zero of=DEV bs=100M count=100 (то есть, записывая 10G в блоках по 100M).

Изменить: Если это помогает: я использую Ubuntu 11.04 64bit с Linux 2.6.38.

Edit2: производительность остается примерно такой же, если я передаю размер блока 4 КБ, 1 МБ или 10 МБ на dd .

2 ответа2

5

Решение состоит в том, чтобы установить функцию stripe_cache_size для рейдов MD .

По умолчанию установлено значение 256, но его можно увеличить до 32768.

Это делается путем записи желаемого размера в /sys/block/md0/md/stripe_cache_size (если raid равен md0). На Ask Ubuntu есть решение для постоянной установки значения.

Я тестировал тот же RAID, что и в вопросе, и получил следующие цифры:

size   256: 50 MB/s
size  4096: 123 MB/s
size  8192: 142 MB/s
size 16384: 140 MB/s
size 32768: 142 MB/s

Эти тесты проводились с Ubuntu 12.04 (Linux 3.2) путем записи 10 ГБ в файл с блоками по 1 МБ.

Справочная информация: в полосовом кэше хранятся недавно написанные блоки. Если данные записываются непрерывно, может случиться, что во время первой записи записывается только часть одной полосы. Это означает, что код RAID должен прочитать всю полосу с диска, обновить ее и полностью записать заново. Если приходит вторая запись для другой части той же полосы, все это должно быть сделано снова. Теперь, если кэш используется и все еще содержит данные, записанные при первой записи, чтение, которое было необходимо перед второй записью, может быть опущено.

Обычно большой размер блока при записи предотвращает проблему (потому что записываются полные полосы сразу, и, таким образом, чтение вообще не требуется). Тем не менее, похоже, что при записи на базовое устройство шифрование использует только небольшие блоки, и, таким образом, увеличение кеша имеет положительный эффект.

1

У LUKS есть Botleneck, то есть он просто создает один поток на каждое блочное устройство.

Вы размещаете шифрование поверх RAID 5? Затем, с точки зрения вашей ОС, у вас есть только одно устройство, тогда оно использует только один поток для всех этих дисков, то есть диски работают последовательно, а не параллельно.

Вы размещаете LVM поверх зашифрованных устройств? Затем вы создаете один поток на устройство, позволяя им работать параллельно.

Решение для этого? Если вы используете Linux, независимо от скорости вашего процессора, мощности или числа ядер, используйте программный рейд, а затем создайте тома поверх зашифрованных дисков. Таким образом, ваша ОС увидит несколько устройств и создаст поток для каждого.

Недостатком является многократный ввод пароля, но во избежание этого вы можете перейти к этой настройке. Один диск или часть диска имеют загрузочный и корневой разделы, загрузка незашифрована, root зашифрован и содержит ключевой файл, этот ключевой файл используется для расшифровки других устройств (возможно, остальной части того же диска).

Я обнаружил, что эта проблема не с использованием RAID, а с виртуальной машиной, которая замедляла хост-ОС, пока я не понял, что ОС gues монополизирует поток luks. Я решил создать разные разделы на одном устройстве и использовать один раздел для виртуальной. диски, то они не могут монополизировать поток, и производительность обеих ОС значительно улучшилась.

Я думаю, что вы также можете получить выгоду от использования программного RAID, в конечном итоге вы не зависите от вашего оборудования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .