Что проверять при лагах сервера, если дело не в высокой загрузке CPU?

«Что проверять при лагах сервера, если дело не в высокой загрузке CPU?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я бы начал с проверки подсистем, которые часто становятся узким местом:

  • Дисковый ввод-вывод (I/O): Высокая задержка (await) или утилизация (%util) диска. Проверяю командой:
    iostat -x 1

    Если %util постоянно близок к 100%, проблема в дисковой подсистеме.

  • Память и свопинг: Проверяю, не начал ли система активно использовать своп, что резко замедляет работу.
    free -h
    vmstat 1  # смотрю на колонки si (swap in) и so (swap out)

    Также проверяю логи (dmesg | grep -i oom) на наличие убийств процессов OOM-killer'ом.

  • Сетевая подсистема: Перегрузка сетевого интерфейса, ошибки или потеря пакетов. Использую:
    iftop -n  # для просмотра трафика
    netstat -s | grep -E "segments retransmited|packet receive errors"  # для ошибок
  • Логи и конфигурация: Изучаю логи приложения и системные логи (journalctl -xe --since "5 minutes ago") на предмет ошибок. Проверяю, не исчерпаны ли лимиты (например, на количество открытых файлов): ulimit -n.

На одном из проектов мы столкнулись с лагами из-за того, что приложение исчерпало лимит на дескрипторы файлов, что не отражалось на графиках загрузки CPU.