Как провести анализ производительности при лагах сервера?

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

Ответ

При появлении лагов на сервере я действую по методике "сверху вниз" (от общей картины к конкретной причине), используя стандартные утилиты Linux.

1. Быстрая общая диагностика: Запускаю набор команд для получения общего состояния системы за последние 1-5-15 минут и в реальном времени.

# 1. Нагрузка системы
uptime
# 2. Использование CPU, памяти, swap, IO (обновляется каждую секунду)
vmstat 1
# 3. Детализация по процессам (сортировка по CPU, потом по памяти)
top -o %CPU
# или htop, если установлен
# 4. Дисковые операции ввода-вывода
iostat -xz 1
# 5. Сетевая активность
sar -n DEV 1

2. Углубленный анализ по выявленным симптомам:

  • Высокая загрузка CPU (%us или %sy в vmstat):

    • Смотрю, какой процесс потребляет CPU, через top.
    • Для Java-процессов беру thread dump для анализа блокировок: jstack <PID> или kill -3 <PID>.
    • Для C-подобных процессов могу использовать perf или strace для анализа системных вызовов.
  • Проблемы с памятью (высокий swpd, si/so в vmstat):

    • Смотрю использование памяти процессами: top или ps aux --sort=-%mem.
    • Проверяю кэш страниц: free -h. Большой объём в cache — это нормально.
    • Ищу возможные утечки.
  • Высокая загрузка диска (большие значения await, %util в iostat):

    • Определяю, какие процессы активно работают с диском: iotop.
    • Проверяю, не заполнено ли дисковое пространство: df -h.
    • Анализирую, не исчерпаны ли лимиты IOPS/пропускной способности в облаке.
  • Сетевые проблемы:

    • Смотрю количество соединений и их состояние: ss -tnp.
    • Проверяю, нет ли переполнения очередей (send-Q, recv-Q в ss).
    • При подозрении на сетевую перегрузку использую tcpdump для захвата трафика.

3. Анализ логов приложения:

# Просмотр логов systemd-сервиса за последний час
journalctl -u my-service --since "1 hour ago" -f
# Поиск ошибок в лог-файле приложения
tail -f /var/log/myapp/error.log | grep -i "error|exception|timeout"

4. Долгосрочное решение: Для предотвращения таких ситуаций в будущем настраиваю систему мониторинга (например, Prometheus + node_exporter + Grafana), которая собирает метрики системы и приложения, и алертинг (например, через Alertmanager) при достижении пороговых значений (например, CPU > 80% более 5 минут).