Когда я начинал, меня пугали загадочные цифры в выводе 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>

Золотые правила

  1. Не паникуйте при Load Average > ядер - посмотрите тренд
  2. Мало free памяти - это нормально - смотрите available
  3. Не используйте kill -9 сразу - сначала kill -TERM
  4. iostat важнее top при проблемах с производительностью
  5. Логи расскажут больше чем метрики - проверяйте dmesg и journalctl

Домашнее задание

  1. Запустите stress --cpu 4 и посмотрите как растёт Load Average
  2. Создайте zombie процесс и научитесь его находить
  3. Заполните память и посмотрите как работает OOM Killer
  4. Научитесь читать вывод vmstat 1

Помните: понимание основ Linux - это фундамент карьеры в DevOps. Не стесняйтесь экспериментировать на тестовых серверах!