Параллельное чтение с программного RAID-массива происходит медленнее, чем «должно» быть, если судить по другим тестам

Параллельное чтение с программного RAID-массива происходит медленнее, чем «должно» быть, если судить по другим тестам

Примечание: Я видел здесь несколько похожих вопросов, но:

  1. ни один из них не касается чтения множества файлов одновременно, и
  2. Большинству из них более 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, либо что-то вышестоящее ограничивает скорость чтения с этих дисков.

Вопросы:

  1. Как определить, где находится узкое место?
  2. Как мне вообще посмотреть здесь параметры конфигурации и какие еще есть варианты?
  3. Есть ли фундаментальные ограничения моей установки, которые делают то, что я пытаюсь сделать, невозможным? Если да, есть ли альтернативные конфигурации, которые я мог бы использовать?

То, что я уже пробовал

  • Игра с размером блока 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>

Связанный контент