Ужасно медленная I/O на массиве RAID NVMe mdadm

Вопрос или проблема

У меня есть сервер Linux с AMD EPYC 7502P 32-Core (ядро 6.10.6), на котором стоит 6 дисков NVMe, и вдруг производительность ввода-вывода упала. Все операции занимают слишком много времени. Установка обновлений пакетов занимает часы вместо секунд (может, минут).

Я пытался запустить fio на файловой системе с RAID5. Существует огромная разница в метрике clat:

    clat (нс): min=190, max=359716k, avg=16112.91, stdev=592031.05

Значение stdev является экстремальным.

Полный вывод:

$ fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --numjobs=1 --size=4g --iodepth=1 --runtime=60 --time_based --end_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=posixaio, iodepth=1
fio-3.33
Запуск 1 процесса
random-write: Создание файла IO (1 файл / 4096MiB)
Работы: 1 (f=1): [F(1)][100.0%][w=53.3MiB/s][w=13.6k IOPS][eta 00m:00s]
random-write: (groupid=0, jobs=1): err= 0: pid=48391: Wed Sep 25 09:17:02 2024
  запись: IOPS=45.5k, BW=178MiB/s (186MB/s)(10.6GiB/61165msec); 0 сбросов зон
    slat (нс): min=552, max=123137, avg=2016.89, stdev=468.03
    clat (нс): min=190, max=359716k, avg=16112.91, stdev=592031.05
     lat (мкс): min=10, max=359716, avg=18.13, stdev=592.03
    перцентили clat (мкс):
     |  1.00th=[   11],  5.00th=[   12], 10.00th=[   14], 20.00th=[   15],
     | 30.00th=[   15], 40.00th=[   15], 50.00th=[   15], 60.00th=[   16],
     | 70.00th=[   16], 80.00th=[   16], 90.00th=[   17], 95.00th=[   18],
     | 99.00th=[   20], 99.50th=[   22], 99.90th=[   42], 99.95th=[  119],
     | 99.99th=[  186]
   bw (  KiB/s): min=42592, max=290232, per=100.00%, avg=209653.41, stdev=46502.99, samples=105
   iops        : min=10648, max=72558, avg=52413.32, stdev=11625.75, samples=105
  lat (нс)   : 250=0.01%, 500=0.01%, 1000=0.01%
  lat (мкс)   : 10=0.01%, 20=99.15%, 50=0.76%, 100=0.03%, 250=0.06%
  lat (мкс)   : 500=0.01%, 750=0.01%, 1000=0.01%
  lat (мс)   : 2=0.01%, 4=0.01%, 10=0.01%, 500=0.01%
  cpu          : usr=12.62%, sys=30.97%, ctx=2800981, majf=0, minf=28
  Глубины IO    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     отправить    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     завершить  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     выданные rwts: всего=0,2784519,0,0 короткие=0,0,0,0 сброшенные=0,0,0,0
     задержка   : цель=0, окно=0, персентиль=100.00%, глубина=1

Статус выполнения группа 0 (все работы):
  ЗАПИСЬ: bw=178MiB/s (186MB/s), 178MiB/s-178MiB/s (186MB/s-186MB/s), io=10.6GiB (11.4GB), run=61165-61165msec

Статистика дисков (чтение/запись):
    md1: ios=0/710496, merge=0/0, ticks=0/12788992, in_queue=12788992, util=23.31%, aggrios=319833/649980, aggrmerge=0/0, aggrticks=118293/136983, aggrin_queue=255276, aggrutil=14.78%
  nvme1n1: ios=318781/638009, merge=0/0, ticks=118546/131154, in_queue=249701, util=14.71%
  nvme5n1: ios=321508/659460, merge=0/0, ticks=118683/138996, in_queue=257679, util=14.77%
  nvme2n1: ios=320523/647922, merge=0/0, ticks=120634/134284, in_queue=254918, util=14.71%
  nvme3n1: ios=320809/651642, merge=0/0, ticks=118823/135985, in_queue=254808, util=14.73%
  nvme0n1: ios=316267/642934, merge=0/0, ticks=116772/143909, in_queue=260681, util=14.75%
  nvme4n1: ios=321110/659918, merge=0/0, ticks=116300/137570, in_queue=253870, util=14.78%

Вероятно, один из дисков неисправен. Есть ли способ определить медленный диск?

Все диски имеют похожие атрибуты SMART, ничего выдающегося:

Data Units Read:                    2,121,457,831 [1.08 PB]
Data Units Written:                 939,728,748 [481 TB]
Controller Busy Time:               40,224
Power Cycles:                       5
Power On Hours:                     6,913

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

iostat -xh
Linux 6.10.6+bpo-amd64 (ts01b)  25/09/24        _x86_64_        (64 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.0%    0.0%    4.3%    0.6%    0.0%   90.2%

     r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz Устройство
    0.12      7.3k     0.00   0.0%    0.43    62.9k md0
 6461.73    548.7M     0.00   0.0%    0.22    87.0k md1
 3583.93     99.9M     9.60   0.3%    1.13    28.5k nvme0n1
 3562.77     98.9M     0.80   0.0%    1.15    28.4k nvme1n1
 3584.54     99.8M     9.74   0.3%    1.18    28.5k nvme2n1
 3565.96     98.8M     1.06   0.0%    1.16    28.4k nvme3n1
 3585.04     99.9M     9.78   0.3%    1.16    28.5k nvme4n1
 3577.56     99.0M     0.86   0.0%    1.17    28.3k nvme5n1

     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz Устройство
    0.00      0.0k     0.00   0.0%    0.00     4.0k md0
  366.41    146.5M     0.00   0.0%   14.28   409.4k md1
 8369.26     32.7M     1.18   0.0%    3.73     4.0k nvme0n1
 8364.63     32.7M     1.12   0.0%    3.63     4.0k nvme1n1
 8355.48     32.6M     1.10   0.0%    3.56     4.0k nvme2n1
 8365.23     32.7M     1.10   0.0%    3.46     4.0k nvme3n1
 8365.37     32.7M     1.25   0.0%    3.37     4.0k nvme4n1
 8356.70     32.6M     1.06   0.0%    3.29     4.0k nvme5n1

     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz Устройство
    0.00      0.0k     0.00   0.0%    0.00     0.0k md0
    0.00      0.0k     0.00   0.0%    0.00     0.0k md1
    0.00      0.0k     0.00   0.0%    0.00     0.0k nvme0n1
    0.00      0.0k     0.00   0.0%    0.00     0.0k nvme1n1
    0.00      0.0k     0.00   0.0%    0.00     0.0k nvme2n1
    0.00      0.0k     0.00   0.0%    0.00     0.0k nvme3n1
    0.00      0.0k     0.00   0.0%    0.00     0.0k nvme4n1
    0.00      0.0k     0.00   0.0%    0.00     0.0k nvme5n1

     f/s f_await  aqu-sz  %util Устройство
    0.00    0.00    0.00   0.0% md0
    0.00    0.00    6.68  46.8% md1
    0.00    0.00   35.24  14.9% nvme0n1
    0.00    0.00   34.50  14.6% nvme1n1
    0.00    0.00   33.98  14.9% nvme2n1
    0.00    0.00   33.06  14.6% nvme3n1
    0.00    0.00   32.33  14.8% nvme4n1
    0.00    0.00   31.72  14.6% nvme5n1

Проблема, похоже, заключается в прерываниях

$ dstat -tf --int24 60
----system---- -------------------------------прерывания------------------------------
     время     | 120   128   165   199   213   342   LOC   PMI   IWI   RES   CAL   TLB 
25-09 10:53:45|2602  2620  2688  2695  2649  2725   136k   36  1245  2739   167k  795 
25-09 10:54:45|  64    64    65    64    66    65  2235     1    26    16  2156     3 
25-09 10:55:45|  33    31    32    32    32    30  2050     1    24    10  2162    20 
25-09 10:56:45|  31    31    30    35    30    33  2303     1    26    63  2245    9 
25-09 10:57:45|  36    29    27    34    35    35  2016     1    23    72  2645    10 
25-09 10:58:45|   9     8     9     8     7     8  1766     0    27     4  1892    15 
25-09 10:59:45|  59    62    59    58    60    60  1585     1    22    20  1704     9 
25-09 11:00:45|  25    21    21    26    26    26  1605     0    26    10  1862    10 
25-09 11:01:45|  34    32    32    33    36    31  1515     0    23    24  1948    10 
25-09 11:02:45|  21    23    23    25    22    24  1772     0    27    27  1781     9 

Поля с увеличенными прерываниями сопоставлены с 9-edge ко всем дискам nvme[0-5]q9, например:

$ cat /proc/interrupts | grep 120:
IR-PCI-MSIX-0000:01:00.0    9-edge      nvme2q9

К сожалению, mdadm пока не может правильно обрабатывать запись в raid5/6 с использованием nvme. Существует 4 другие опции для создания RAID из nvme внутри хоста для повышения производительности записи: используйте zfs, контроллер аппаратного RAID nvme, используйте graid (видеокарта nvidia) или используйте xinnor sw-raid.

Ответ или решение

Согласно описанному вами случаю, ваша система на базе AMD EPYC 7502P с RAID-массивом NVMe на mdadm действительно сталкивается с проблемами производительности ввода-вывода. Ниже я опишу шаги для диагностики и возможные решения проблемы.

Диагностика

  1. Проверка состояния дисков: Несмотря на то, что вы упомянули, что все диски имеют схожие значения SMART, рекомендуется дополнительно проверить состояние каждого диска с помощью команды smartctl -a /dev/nvmeXn1, где X – номер диска. Ищите ошибки или предупреждения, которые могут указывать на проблемы.

  2. Мониторинг I/O: Используйте инструменты как iostat, dstat и iotop, чтобы мониторить производительность работы дисков в реальном времени. Особое внимание уделите показателям await, util и IO wait.

  3. Проверка журналов: Ознакомьтесь с системными журналами (/var/log/syslog и dmesg), чтобы обнаружить возможные ошибки, связанные с дисками или RAID.

  4. Тестирование отдельных дисков: Ваша команда fio показывает высокие значения стандартного отклонения в clat, что может указывать на один или несколько дисков с недостаточной производительностью. Используйте fio для тестирования каждого диска отдельно, чтобы определить, есть ли один из дисков, который значительно медленнее остальных.

Возможные решения

  1. Использование других RAID-решений:

    • ZFS: ZFS обладает отличными свойствами управления данными и может предложить лучшую производительность, особенно при высоких нагрузках на запись. Имейте в виду, что необходимо будет перенастроить массив.
    • Аппаратный RAID: Если ваш сервер поддерживает аппаратный RAID-контроллер, его использование может значительно улучшить производительность записи.
    • NVIDIA GRAID: Если у вас есть графическая карта NVIDIA, вы можете рассмотреть возможность использования GRAID, что также может повысить производительность.
    • SW-RAID Xinnor: Этот программный RAID также может быть вариантом, если вы хотите оставаться на программном уровне.
  2. Параметры mdadm: Возможно, стоит провести тестирование с изменением параметров конфигурации mdadm. Например, использование режима write-back кэша, если это применимо, может улучшить производительность.

  3. Обновление прошивки: Проверьте, есть ли обновления прошивки для ваших NVMe-дисков. Обновления могут очевидно помочь в решении проблем с производительностью.

  4. Увеличение очереди запросов: Попробуйте увеличить глубину очереди iodepth в fio и других I/O-тестах, чтобы увидеть, улучшится ли производительность.

  5. Оптимизация системы: Убедитесь, что ваш сервер не перегружен другими процессами, проверьте использование CPU и RAM с помощью команд top или htop.

Заключение

Проблемы с производительностью I/O могут возникать по множеству причин. Постарайтесь провести высококачественную диагностику состояния своих дисков и производительности системы в целом. Подобрав правильный подход к RAID и оптимизации, вы сможете восстановить удовлетворительную производительность системы. Если проблемы сохраняются, рассмотрите возможность обращения к специалистам в области системного администрирования или к производителю оборудования для получения дополнительной помощи.

Оцените материал
Добавить комментарий

Капча загружается...