![Параллельное чтение с программного RAID-массива происходит медленнее, чем «должно» быть, если судить по другим тестам](https://rvso.com/image/789250/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20RAID-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D0%BC%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%B5%D0%B5%2C%20%D1%87%D0%B5%D0%BC%20%C2%AB%D0%B4%D0%BE%D0%BB%D0%B6%D0%BD%D0%BE%C2%BB%20%D0%B1%D1%8B%D1%82%D1%8C%2C%20%D0%B5%D1%81%D0%BB%D0%B8%20%D1%81%D1%83%D0%B4%D0%B8%D1%82%D1%8C%20%D0%BF%D0%BE%20%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%BC%20%D1%82%D0%B5%D1%81%D1%82%D0%B0%D0%BC.png)
Примечание: Я видел здесь несколько похожих вопросов, но:
- ни один из них не касается чтения множества файлов одновременно, и
- Большинству из них более 10 лет, и они касаются более неактуальных версий оборудования и ядра.
Фон:
У меня есть машина Linux (Ubuntu, ядро 5.15.0-82-generic) с двумя 128-ядерными процессорами и 128 ГБ оперативной памяти. На ней есть массив RAID 5 из 10 SSD, подключенных через SATA, каждый из которых рассчитан на чтение со скоростью до 530 МБ/с. Они фактически доступны только для чтения, когда используются (они используются в основном днем, а новые данные добавляются каждую ночь). Моя общая проблема заключается в том, чтобы параллельно снабжать десятки ядер данными с дисков.
Процедура сравнительного анализа
Я проверяю производительность чтения, запуская экземпляры
dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576
параллельно с iostat
и iotop
. Между запусками я очищаю кэш, запуская
sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
Я уверен, что это работает правильно, потому что если я этого не сделаю, то последующее чтение горячего файла завершится почти сразу же, а затем, как только я это сделаю, чтение этого файла вернется к той же производительности, что и раньше.
Результаты сравнительного анализа
Если я читаю один файл через программный RAID, я получаю скорость чтения где-то между 500 и 700 МБ/с, и, глядя на вывод, iostat
я вижу, что это достигается тем, что чтение с каждого из десяти дисков происходит практически с одинаковой скоростью параллельно.
Если я читаю с дисков напрямую (т. е. если я указываю /dev/sda
, /dev/sdb
и т. д. в качестве if=
аргументов dd
), то я могу считывать данные с каждого из них параллельно со скоростью 530 МБ/с каждый (т. е. считывание 1 ГБ со всех десяти занимает ровно столько же времени, сколько считывание 1 ГБ с одного из них).
Однако если я попытаюсь прочитать несколько файлов параллельно через программный RAID, я получу очень существенное падение производительности. Если я прочитаю десять файлов параллельно через программный RAID, то отдельные файлы достигнут скорости чтения от 150 до 350 МБ/с, и весь процесс займет примерно в 4 раза больше времени, чем копирование того же объема данных напрямую с дисков.
Более того, по данным iotop, чтение с помощью программного обеспечения, похоже, упирается в абсолютный предел при общей скорости чтения около 2,7 ГБ/с.
Думаю, для того, чтобы обеспечить все ядра достаточным объемом данных с диска и не тратить их впустую, мне, вероятно, придется перейти на NVMe вместо SATA, но сначала я хочу решить эту проблему, поскольку, похоже, либо программный RAID, либо что-то вышестоящее ограничивает скорость чтения с этих дисков.
Вопросы:
- Как определить, где находится узкое место?
- Как мне вообще посмотреть здесь параметры конфигурации и какие еще есть варианты?
- Есть ли фундаментальные ограничения моей установки, которые делают то, что я пытаюсь сделать, невозможным? Если да, есть ли альтернативные конфигурации, которые я мог бы использовать?
То, что я уже пробовал
- Игра с размером блока
dd
, делая его больше или меньше, не дает никакого эффекта. - Настройка размера кэша RAID с упреждающим чтением и/или полосой не оказывает никакого эффекта
- Обновление ядра до немного более новой версии, которое apt хотело существенно ухудшить результаты тестов, по сути ограничив общую пропускную способность на уровне 500 МБ/с IIRC.
Приложение:
Пример выходных данных iostat -k 1
во время выполнения теста производительности:https://pastebin.com/yuWwWbRU
Содержание /proc/mdstat
:
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
bitmap: 0/59 pages [0KB], 65536KB chunk
unused devices: <none>