Когда я начинал, меня пугали загадочные цифры в выводе top
и htop
. Что такое Load Average? Почему свободной памяти почти нет, но система работает? Давайте разберёмся с основами Linux, которые должен знать каждый DevOps.
Load Average - пульс вашей системы
Что это?
$ uptime
14:22:01 up 45 days, 3:14, 2 users, load average: 0.45, 0.67, 0.82
Три цифры - это средняя нагрузка за 1, 5 и 15 минут.
Как читать?
- Load 1.0 = один процесс полностью загружает одно ядро
- 4 ядра, Load 4.0 = все ядра заняты на 100%
- 4 ядра, Load 8.0 = 4 процесса работают, 4 ждут в очереди
Пример из жизни
Представьте кассы в магазине:
- 4 кассы (ядра)
- Load 2.0 = 2 кассы работают, 2 свободны ✅
- Load 4.0 = все кассы заняты ⚠️
- Load 8.0 = все кассы заняты + 4 человека в очереди 🔥
Что делать?
# Проверить количество ядер
nproc
# или
cat /proc/cpuinfo | grep processor | wc -l
# Правило большого пальца:
# Load Average < количество ядер = OK
# Load Average ≈ количество ядер = напряжённо
# Load Average > количество ядер × 2 = проблемы
Процессы - кто что делает
Состояния процессов
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 225832 9516 ? Ss Jun10 2:15 /sbin/init
STAT - состояние процесса:
- R (Running) - выполняется прямо сейчас
- S (Sleeping) - спит, ждёт события
- D (Disk sleep) - ждёт диск (не прерывается!)
- Z (Zombie) - завершился, но родитель не забрал статус
- T (Stopped) - остановлен (Ctrl+Z)
Приоритет и “вежливость” (nice)
# Запустить с низким приоритетом
nice -n 19 ./backup.sh
# Изменить приоритет работающего процесса
renice -n 10 -p 1234
# -20 = максимальный приоритет (грубиян)
# 0 = обычный
# +19 = минимальный приоритет (вежливый)
Сигналы - как общаться с процессами
# Вежливо попросить завершиться
kill -TERM 1234 # или просто kill 1234
# Приказать завершиться (не игнорируется)
kill -KILL 1234 # или kill -9 1234
# Перечитать конфиг (для демонов)
kill -HUP 1234
# Посмотреть все сигналы
kill -l
Память - почему её всегда мало?
Разбираемся с free
$ free -h
total used free shared buff/cache available
Mem: 15Gi 3Gi 256Mi 1Gi 12Gi 11Gi
Swap: 0B 0B 0B
Что значат колонки:
- used - реально используется программами
- free - совсем свободная (и это нормально что мало!)
- buff/cache - кэш файлов (освободится если надо)
- available - сколько доступно для программ
Почему free показывает мало свободной памяти?
Linux кэширует всё что можно! Свободная RAM = потраченная RAM.
# Очистить кэш (редко нужно)
echo 3 > /proc/sys/vm/drop_caches
# Но лучше доверять Linux
Swap - когда RAM кончилась
# Проверить использование swap
swapon -s
free -h
# Кто использует swap?
for file in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file
done | sort -k 2 -n | tail -20
OOM Killer - серийный убийца
Когда память кончается, Linux начинает убивать процессы.
# Проверить, кого убили
dmesg | grep -i "killed process"
journalctl -u <service> | grep -i oom
# Защитить важный процесс
echo -1000 > /proc/<PID>/oom_score_adj
Практические примеры
1. Сервер тормозит - с чего начать?
# Шаг 1: Load Average
uptime
# Шаг 2: Кто ест CPU?
top
# Нажать 'P' - сортировка по CPU
# Нажать 'M' - сортировка по памяти
# Шаг 3: Проблемы с диском?
iostat -x 1
# Смотрим %util - если близко к 100%, диск перегружен
# Шаг 4: Память
free -h
# Если available мало - проблемы с памятью
2. Найти процесс-вредитель
# По имени
pgrep -f "python script.py"
# По порту
lsof -i :8080
ss -tlnp | grep :8080
# По использованию файла
lsof /var/log/app.log
3. Мониторинг в реальном времени
# htop - красивый и удобный
htop
# iotop - кто нагружает диск
iotop
# nethogs - кто ест трафик
nethogs
Шпаргалка по командам
Процессы
ps aux # все процессы
ps -ef # все процессы (System V)
ps aux | grep nginx # найти процесс
pgrep nginx # найти PID по имени
pidof nginx # то же самое
pstree # дерево процессов
Память
free -h # использование памяти
vmstat 1 # статистика в реальном времени
cat /proc/meminfo # детальная информация
smem # память по процессам
CPU
top # общий мониторинг
htop # то же, но красивее
mpstat 1 # статистика по ядрам
sar -u 1 5 # история CPU
Типичные проблемы и решения
Load Average высокий, но CPU свободен
Причина: процессы ждут диск (состояние D).
# Проверить
ps aux | awk '$8 ~ /D/ { print $0 }'
# Найти проблемный диск
iostat -x 1
Swap используется при свободной RAM
Причина: swappiness слишком высокий.
# Проверить
cat /proc/sys/vm/swappiness
# Уменьшить (временно)
echo 10 > /proc/sys/vm/swappiness
# Навсегда
echo "vm.swappiness=10" >> /etc/sysctl.conf
Zombie процессы
Причина: родительский процесс не забрал статус.
# Найти
ps aux | grep defunct
# Убить родителя (zombie умрёт сам)
kill -TERM <parent_pid>
Золотые правила
- Не паникуйте при Load Average > ядер - посмотрите тренд
- Мало free памяти - это нормально - смотрите available
- Не используйте kill -9 сразу - сначала kill -TERM
- iostat важнее top при проблемах с производительностью
- Логи расскажут больше чем метрики - проверяйте dmesg и journalctl
Домашнее задание
- Запустите
stress --cpu 4
и посмотрите как растёт Load Average - Создайте zombie процесс и научитесь его находить
- Заполните память и посмотрите как работает OOM Killer
- Научитесь читать вывод
vmstat 1
Помните: понимание основ Linux - это фундамент карьеры в DevOps. Не стесняйтесь экспериментировать на тестовых серверах!