Замръзване на Linux заради NVMe SSD е проблем, с който се сблъсках на два различни сървъра. Симптомите изглеждаха като хардуерен дефект или проблем с ядрото, но причината се оказа свързана с енергоспестяващите режими на NVMe устройството.
Как изглежда проблемът?
Системата работи напълно нормално:
- Уеб сайтовете са достъпни
- SSH връзките работят
- Натоварването е нормално
- Няма грешки в RAM паметта
След определен период от време обаче:
- SSH спира да отговаря
- Сайтовете стават недостъпни
- Ping понякога работи, понякога не
- Няма видимо високо CPU натоварване
- Единственият изход е принудителен рестарт
Най-лошото е, че проблемът се появява случайно и често е трудно да бъде възпроизведен.
Първоначалните подозрения
Когато подобен проблем се появи на Linux, обикновено започваме да търсим причината в:
- RAM паметта
- SSD диска
- Процесора
- Linux ядрото
- Захранването
- Драйверите
В моя случай обаче проблемът се появи на два напълно различни сървъра, което ме накара да търся по-задълбочено.
Истинската причина
След продължително разследване се оказа, че виновникът са енергоспестяващите режими на NVMe SSD устройствата.
Някои NVMe дискове и някои комбинации от BIOS, контролери и Linux ядра не работят коректно с най-агресивните режими за пестене на енергия.
В определени ситуации SSD устройството може да премине в дълбок енергоспестяващ режим и след това да не се събуди коректно.
Тъй като операционната система разчита постоянно на диска, резултатът често изглежда като пълен срив на машината.
Решението
Отворете GRUB конфигурацията:
sudo nano /etc/default/grub
Намерете реда:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
или подобен.
Добавете параметъра:
nvme_core.default_ps_max_latency_us=0
Пример:
GRUB_CMDLINE_LINUX_DEFAULT="quiet nvme_core.default_ps_max_latency_us=0"
Запазете файла.
След това изпълнете:
sudo update-grub
и рестартирайте системата:
sudo reboot
Какво прави този параметър?
Параметърът:
nvme_core.default_ps_max_latency_us=0
забранява използването на агресивните енергоспестяващи режими на NVMe устройството.
Това означава:
- Малко по-висока консумация на енергия
- По-стабилна работа
- По-малък риск от случайни замръзвания
За сървъри това почти винаги е разумен компромис.
Как да проверите дали параметърът е активен?
След рестарт:
cat /proc/cmdline
Трябва да видите:
nvme_core.default_ps_max_latency_us=0
в списъка с параметри на ядрото.
Резултатите
След добавянето на този параметър проблемът изчезна напълно и на двата сървъра.
Системите започнаха да работят стабилно без случайни замръзвания, прекъсвания на SSH връзките или недостъпни сайтове.
Кога този метод може да помогне?
Това решение си заслужава да бъде изпробвано ако:
- Използвате NVMe SSD диск
- Linux системата замръзва без причина
- Не откривате проблеми с RAM паметта
- Няма грешки в логовете (защото грешките не стигат до там)
- Проблемът се появява след периоди на ниска активност
Заключение
Ако вашият Linux сървър или работна станция страда от случайни замръзвания, не подценявайте възможността проблемът да е свързан с NVMe енергоспестяващите режими.
Добавянето на параметъра:
nvme_core.default_ps_max_latency_us=0
отнема по-малко от минута и в много случаи може да реши проблем, който иначе би ви коствал часове или дори дни диагностика.
Понякога най-трудните за откриване проблеми имат най-простите решения.
