10. Troubleshooting: подход production-инженера
Типовые кейсы (сервер тормозит, закончился диск, сервис не стартует, нет сети, упал после рестарта) и системный алгоритм диагностики: CPU/память/диск, логи, сеть, права, последние изменения.
Типовые кейсы
Сервер «тормозит»
- Load average и CPU:
top,htop— высокий load при высоком %CPU означает перегрузку процессора; при высоком load и низком CPU — часто I/O wait (диск или сеть). Смотреть столбец wa в top,iostat -x 1,vmstat 1. - Память и swap:
free -h— занята ли RAM, активен ли swap. Активный swap даёт задержки. Топ процессов по памяти:ps -eo pid,rss,cmd --sort=-rss | head. - Диск:
iostat,iotop— кто читает/пишет; не заполнен ли раздел и inode (df -h,df -i). - Сеть: при подозрении на сетевую перегрузку —
ss,nethogs, трафик по интерфейсам.
См. разделы 4. Процессы, CPU, память и 2. Файловая система и диски.
Закончился диск
- Место:
df -h— какой раздел заполнен (часто/,/var,/var/log). - Inode:
df -i— при свободных гигабайтах «No space left» часто из-за исчерпания inode (много мелких файлов). - Кто съел:
du -sh /var/*,du -sh /var/log/*; часто логи, кэш, временные файлы. - Удалённые файлы, ещё открытые:
lsof +L1— не освобождают место до закрытия; перезапуск сервиса освобождает. - Действия: очистка логов (logrotate, ручное удаление), расширение тома (LVM) или перенос данных.
См. раздел 2. Файловая система и диски.
Сервис не стартует
- Логи unit’а:
journalctl -u <unit> -n 100 --no-pager— там обычно причина: ошибка конфига, порт занят, permission denied, отсутствующий файл или зависимость. - Зависимости: unit может ждать другой unit (After=, Requires=); проверить
systemctl list-dependencies, состояние зависимостей. - Права и владелец: конфиг или рабочий каталог с неверными правами; проверить путь из unit и
ls -la. - Порт занят:
ss -tlnp— не слушает ли другой процесс нужный порт.
См. разделы 1. Архитектура и основы ОС, 6. Логи и observability, 3. Пользователи и безопасность.
Нет сети
- Линк и адрес:
ip link,ip addr— интерфейс up, есть ли IP. - Маршрут:
ip route,ip route get <цель>— куда уходят пакеты, есть ли default route. - DNS:
cat /etc/resolv.conf,dig hostname,dig @8.8.8.8 hostname— резолвится ли имя, доступен ли резолвер. - Firewall:
iptables -L -n -v,nft list ruleset— нет ли DROP для нужного трафика в INPUT/FORWARD. - Слушающий адрес: сервис может слушать только 127.0.0.1 — тогда снаружи недоступен;
ss -tlnp.
См. разделы 5. Сеть в Linux и 6. Linux Networking в разделе Networking.
Упал после рестарта
- Что изменилось при перезагрузке: конфиги в /etc, fstab, сеть (DHCP дал другой IP?), зависимости пакетов после обновления.
- Логи загрузки и сервисов:
journalctl -b— что происходило при старте;journalctl -u <unit> -b— почему unit не поднялся. - Логи ядра:
journalctl -k -b,dmesg— OOM, ошибки диска, драйверов. - Файловая система и монтирование: не смонтировался ли раздел (ошибка в fstab, отсутствует устройство), не изменился ли UUID диска.
Систематически: сравнить текущее состояние с тем, что было до рестарта (конфиги, список пакетов, вывод mount, ip, systemctl).
Алгоритм диагностики
Один и тот же порядок помогает не пропустить очевидное и быстрее выйти на причину.
1. CPU / Memory / Disk
Сначала базовые ресурсы: не перегружен ли CPU, не закончилась ли память (и не ушло ли всё в swap), не заполнен ли диск и inode. Команды: top, free -h, df -h, df -i. Если здесь проблема — дальше искать, кто потребляет (процессы, каталоги, логи).
2. Logs
Логи сервиса и ядра часто сразу дают причину: ошибка конфига, порт занят, OOM, сбой диска. journalctl -u <unit>, journalctl -k, dmesg. При любом инциденте смотреть логи в первую очередь после проверки ресурсов.
3. Network
Если симптом «не доступен» или «не резолвится»: линк, адрес, маршрут, DNS, firewall, на каком адресе слушает сервис. Не предполагать «сеть работает» — проверить по шагам с проблемного хоста.
4. Permissions
«Permission denied», сервис не может прочитать конфиг или записать в каталог — проверить владельца, права, ACL, при необходимости SELinux/AppArmor. Не решать проблему chmod 777 без понимания причины.
5. Recent changes
Что менялось перед инцидентом: обновления пакетов, смена конфига, рестарт, добавление диска, смена сети. Часто причина в последнем изменении; откат или точечное исправление конфига восстанавливает работу.
!!! tip "Практика"
Чек-лист при любом инциденте: (1) Ресурсы — CPU, память, диск/inode; (2) Логи — unit и ядро; (3) Сеть — если касается доступности; (4) Права — если отказ в доступе к файлам; (5) Что меняли недавно. Так вы не тратите время на второстепенное и быстрее находите root cause.
Паттерны и антипаттерны
| Паттерн | Описание |
|---|---|
| Идти по алгоритму | Ресурсы → логи → сеть → права → изменения. Не прыгать наугад. |
| Фиксировать состояние до правок | Снимки конфигов, вывод команд — чтобы откатиться или сравнить. |
| Один шаг за раз | Менять одну вещь, проверять; иначе непонятно, что помогло. |
| Антипаттерн | Почему плохо | Что делать |
|---|---|---|
| Менять всё подряд | Теряется причинно-следственная связь, сложно откатить. | Менять по одному, проверять, документировать. |
| Игнорировать логи | В логах часто уже написана причина. | Всегда смотреть journalctl и dmesg при сбоях. |
| Полагаться на «у меня работает» | Окружение (сеть, версии, конфиг) может отличаться. | Проверять на проблемном хосте и в том же окружении. |
Дополнительные материалы
- 1. Архитектура и основы ОС
- 2. Файловая система и диски
- 4. Процессы, CPU, память
- 5. Сеть в Linux
- 6. Логи и observability
- 9. Observability и отладка (Networking) — инструменты и подход к сетевой диагностике