Как запросить у ядра linux, какие операции, связанные с хранением-, в настоящее время выполняются на уровне FS / блочного уровня / контроллера SATA?

время от времени наш сервер Linux LAMP (, использующий PHP-FPM, XFS на тонком LVM на HW RAID, Centos8), становится недоступным и перестает отвечать на запросы. на запросы HTTP(S).

С помощью централизованного ведения журналов мы обнаружили, что в этих случаях средняя загрузка быстро достигает сотен, в то время как все больше и больше процессов (systemd-journald, процессов php, потоков ядра xfs/dm... )попасть в состояние D. По данным iostat и pidstat, ЦП и диск почти не загружены, а средняя нагрузка колеблется в районе 170, что довольно странно. Из вывода htop/ps не видно ни одного, ни группы мошеннических процессов, которые могли бы объяснить такое поведение. Это просто стандартные процессы, которые, кажется, сталкиваются с каким-то «блокпостом».

Единственная другая странность с мониторингом диска заключается в том, что во время этих событий перегрузки iostat периодически сообщает о довольно высоком w_await для раздела /var (2500-5000 мс, в то время как другие разделы, такие как /var/log, /var/lib/mysql обычно не превышает 10 мс). Этот раздел должен быть тихим большую часть времени, поэтому непонятно, почему iostat сообщает о таком большом времени ожидания w_wait.

Тогда единственным решением будет выключение и выключение сервера.

Это происходит на двух серверах одного типа и никогда на других. Кажется, это какая-то неисправность ФС/блочного слоя/контроллера/диска; многие процессы внезапно начинают ждать диска или чего-то еще в ядре, но, согласно iotop/iostat, диск мало что делает.

Есть ли способ запросить драйвер FS/блочного уровня/контроллера ядра Linux, что именно они делают с хранилищем и от имени какого процесса? Стандартные инструменты, такие как iotop/iostat, сообщают мне только имена активных процессов ввода-вывода и активность разделов диска, но не сообщают, какие процессы обращаются к какому разделу диска и что именно они там делают.

0
задан 22 September 2021 в 17:20
1 ответ

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

Когда запущено более, скажем, 100 активных процессов, они спотыкаются друг о друга. Они соревнуются за ресурсы (ЦП и т. д.). В результате все процессы работают медленнее, иногда до такой степени, что кажется, что единственным решением является перезагрузка сервера.

В случае с MariaDB я рекомендую включить медленный журнал, чтобы вы могли определить запрос, который оказывает наибольшее влияние на систему. Тогда ускорь его. Если вам нужна помощь, предоставьте запрос, его объяснение и создание таблицы. Подробнее:http://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog

Ускорение нескольких запросов, вероятно, снизит 170 Load Average и I/O, тем самым устранив узкое место.

2
ответ дан 22 September 2021 в 21:35

Теги

Похожие вопросы