Плохая производительность с программным обеспечением Linux RAID5 и шифрованием LUKS

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

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

RAID имеет размер блока 512K и битовую карту намерения записи. Я использовал -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: good


Диски + RAID5 + ext4: good


Диски + RAID5 + шифрование: bad


SSD + шифрование + LVM + ext4: хорошо

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

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

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

Edit: если это помогает:
Я использую Ubuntu 11.04 64bit с Linux 2.6.38.

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

28
задан Philipp Wendler
25.03.2023 10:49 Количество просмотров материала 3617
Распечатать страницу

2 ответа

решение установить stripe_cache_size функция для MD рейдов.

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

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

Я тестировал на том же рейде, что и в вопросе, и получил следующие номера:

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 МБ.

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

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

5
отвечен Philipp Wendler 2023-03-26 18:37

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

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

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

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

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

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

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

1
отвечен cablop 2023-03-26 20:54

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

disk-encryption
linux
luks
raid-5
software-raid
Вверх