Сервер упирается в один из четырёх ресурсов: память, процессор, диск или скорость диска. Сайт или бот при этом тормозит, падает или перестаёт отвечать, но причина у всех симптомов разная. Ниже по каждому ресурсу: что смотреть и как читать вывод. Команды вводите на сервере по SSH, права root нужны только там, где указан sudo.
Память
free -h
Показывает память и swap в удобных единицах. Смотрите на колонку available: это оценка памяти, которую можно отдать программам без выгрузки данных на диск. Колонка free почти всегда мала, потому что Linux использует свободную память под кэш файлов, и это нормально. Тревожный признак: available стремится к нулю, а строка Swap заполнена.
Самый явный сигнал нехватки это OOM: ядро убивает процесс, потому что память кончилась. Проверка:
sudo journalctl -k | grep -i -E 'out of memory|oom'
journalctl -k выводит журнал ядра, grep оставляет строки про нехватку памяти. Если там есть записи вида Out of memory: Killed process, ядро уже убивало процесс, имя которого указано в строке. Подробнее о журналах: службы и журналы на VPS.
Кто ест память прямо сейчас:
ps aux --sort=-%mem | head -n 6
ps aux выводит все процессы, --sort=-%mem ставит наверх самые прожорливые по памяти, head -n 6 оставляет заголовок и пять строк.
Для кратких пиков поможет файл подкачки, для постоянной нехватки нужна память побольше.
Процессор
uptime
nproc
uptime показывает три числа load average: средняя нагрузка за 1, 5 и 15 минут. nproc выводит число ядер. Практическое правило: если нагрузка за 5–15 минут стабильно выше числа ядер, процессам приходится ждать очереди на процессор. Одиночный всплеск на минуту ни о чём не говорит. Учтите, что load average считает и процессы, ждущие диск, поэтому высокое число не всегда значит нехватку процессора.
top
Открывает список процессов в реальном времени, по умолчанию отсортированный по нагрузке на процессор. Строка %Cpu(s) показывает загрузку: us это программы, wa ожидание диска. Выход клавишей q. Клавиша M сортирует по памяти, P по процессору.
Диск
df -h
df -i
df -h показывает занятое и свободное место на каждой файловой системе, сервер обычно интересует строка с корнем /. df -i показывает inode: у каждого файла есть своя запись, и если их исчерпать множеством мелких файлов, место на диске есть, а создать файл нельзя. Опасный признак: Use% близок к 100.
Найти, что занимает место:
sudo du -xh --max-depth=1 /var | sort -h | tail -n 10
du считает размер каталогов, -x не выходит за пределы одной файловой системы, --max-depth=1 показывает только первый уровень, sort -h сортирует размеры по возрастанию, tail -n 10 оставляет десять самых больших. Повторяйте команду для найденного каталога, спускаясь вниз. Частые виновники: журналы, кэши и образы Docker. Не удаляйте незнакомые файлы без понимания, что это.
Скорость диска
Если процессор не занят, память есть, а всё равно медленно, возможно, упёрлось чтение и запись диска. Для проверки установите пакет sysstat:
sudo apt install sysstat
iostat -x 1 5
Первая команда ставит набор утилит, вторая выводит расширенную статистику дисков раз в секунду пять раз. Первый отчёт показывает усреднение с момента загрузки, смотрите на следующие. Если %util у диска держится около 100, а в top высок показатель wa, диск не справляется. Тогда стоит подумать про тип накопителя.
Сначала найдите виновника
Тариф обычно меняют последним. Сначала ответьте на вопросы:
- какой процесс ест ресурс (
ps,top)? - это постоянная нагрузка или одиночный пик, например бэкап ночью?
- нет ли утечки: память растёт день за днём, пока процесс не перезапустят?
- не забит ли диск журналами или старыми архивами?
Если виновник это ваш проект и он работает как задумано, значит ему нужен тариф побольше. Если это лишняя служба, остановите её. Для контейнеров полезна команда docker stats --no-stream: она один раз показывает нагрузку каждого контейнера.
Что делать дальше
Когда ясно, что не хватает именно ресурса, определите, чего и сколько. Общие принципы описаны в статье как выбрать VPS. Затем сравните тарифы по конфигурациям: 2 ядра, 2 ГБ, 2 ядра, 4 ГБ и 4 ядра, 8 ГБ, или откройте подбор VPS с фильтром.
