Сервер тормозит: как за пять минут найти причину

Сайт отвечает медленно, админка открывается с задержкой, обработка встала. Дальше обычно начинается перебор: перезапустить сервис, почистить кеш, а если не помогло - добавить ресурсов. Иногда срабатывает, но чаще деньги уходят на ресурс, который и не был узким местом.

Разберём, как за несколько команд определить, что именно упёрлось: процессор, память, диск или сеть. И отдельно - почему бывает, что все метрики выглядят нормально, а сервер всё равно медленный.

Четыре подозреваемых

четыре причины медленной работы и по какому признаку различаются.
четыре причины медленной работы и по какому признаку различаются.

Начинать стоит с общей картины. Одна команда показывает почти всё сразу:

top

Смотреть надо на три места: загрузку процессора, свободную память и строку load average сверху. Дальше проверяем подозреваемых по очереди.

Процессор. Признак - загрузка близка к ста процентам и есть процесс, который её держит. Это самый понятный случай.

Память. Признак - свободной почти нет и активно используется swap. Когда память кончается, система начинает выгружать данные на диск, и тормозит всё сразу.

free -h

Диск. Самый частый и самый неочевидный случай. Процессор при этом может быть почти свободен: процессы не считают, а ждут диск.

df -h

Сначала проверьте, есть ли вообще свободное место: заполненный диск тормозит и ломает всё подряд.

Сеть. Признак - медленно отдаются данные, но сам сервер отзывчив. Проверяется сравнением: локально всё быстро, а снаружи долго.

Что означает load average

Три числа в верхней строке - средняя длина очереди задач за 1, 5 и 15 минут. Их постоянно читают неправильно.

Сравнивать надо с числом ядер. Значение 4 на четырёхъядерном сервере - это полная, но здоровая загрузка. То же значение на одном ядре означает, что задачи стоят в очереди вчетверо дольше, чем выполняются.

Смотреть надо на динамику. Если первое число заметно больше третьего, нагрузка растёт прямо сейчас. Если меньше - пик уже прошёл.

Очередь копится не только из-за процессора. Процессы, ждущие диск, тоже попадают в эту очередь. Поэтому высокий load при незагруженном процессоре - почти верный признак того, что упёрлись в диск.

Узнать число ядер:

nproc

Steal time: когда виноват не ваш сервер

Специфичная для виртуальных серверов вещь, про которую редко знают, а объясняет она самые загадочные случаи.

На хосте живёт несколько виртуальных машин. Если соседи создают чрезмерную нагрузку, ваша машина ждёт своей очереди к физическому процессору. Для вас это выглядит так: процессор почти свободен, память есть, диск не забит, а всё работает медленно.

Видно это в выводе top в строке загрузки процессора, в поле st. Обычные значения - около нуля. Устойчивые единицы процентов и выше означают, что вам не достаётся процессорного времени.

Что с этим делать:

  • Убедиться, что это не разовый всплеск. Понаблюдайте несколько часов, см. мониторинг VPS.
  • Написать в поддержку с конкретными цифрами: это штатная ситуация, машину обычно переносят на менее загруженный хост.
  • Рассмотреть тариф с гарантированными ресурсами или выделенный сервер, если задача чувствительна к задержкам.

Именно поэтому в описании тарифов встречается формулировка про гарантированные ресурсы: она про то, что соседи не смогут забрать ваше процессорное время.

Кто именно виноват

Общая картина показывает, какой ресурс кончился. Дальше нужно найти процесс.

Отсортировать процессы по потреблению памяти:

ps aux --sort=-%mem | head -10

Посмотреть, что происходит в реальном времени, удобнее в интерактивном виде:

htop

Если подозрение на диск, а инструментов диагностики нет, первым делом смотрят логи: там обычно видно, что именно буксует, см. логи на сервере.

Отдельный частый виновник - база данных. Она одновременно ест память и создаёт нагрузку на диск, поэтому выглядит то как одна проблема, то как другая, см. база данных на своём сервере.

Когда дело не в сервере

Прежде чем добавлять ресурсы, стоит исключить три вещи.

Медленно только снаружи. Если на самом сервере всё быстро, а по сети долго, проблема в канале, маршруте или в том, что отдаётся слишком много данных, см. как ускорить сайт на VPS.

Медленно только одна страница. Тогда это не сервер, а конкретный код или запрос к базе. Ресурсы тут не помогут.

Медленно после обновления. Проверьте, что изменилось: часто виновато не железо, а новая версия или изменившаяся конфигурация, см. обновление сервера.

Порядок действий

1. Посмотреть общую картину и определить, какой ресурс на пределе. 2. Проверить свободное место на диске - это самая частая и быстро решаемая причина. 3. Найти процесс, который потребляет больше всех. 4. Проверить steal time, если метрики выглядят нормально. 5. Сравнить изнутри и снаружи, чтобы исключить сеть. 6. И только потом добавлять ресурсы, зная, каких именно.

Последний пункт и экономит деньги: без диагностики обычно докупают память, когда упирались в диск.

Частые ошибки

Добавляют ресурсы, не выяснив причину. Платят за память, а упирались в диск или в соседей по хосту.

Читают load average без учёта числа ядер. Значение 4 на четырёх ядрах - норма, на одном - перегрузка.

Не смотрят на свободное место. Заполненный диск выглядит как что угодно, кроме своей настоящей причины.

Игнорируют steal time. Самый загадочный случай: метрики в норме, а работа медленная.

Проверяют скорость только с сервера. Проблема с сетью так не видна.

Перезапускают сервис как первое действие. Симптом уходит, причина остаётся, повторяется через день.

Частые вопросы

Как понять, чего не хватает серверу? Посмотреть общую картину командой top: загрузку процессора, свободную память и load average. Затем проверить место на диске и найти процесс-потребитель.

Что значит высокий load average при свободном процессоре? Почти наверняка упёрлись в диск: процессы ждут ввода-вывода и тоже стоят в очереди. Сравнивать значение надо с числом ядер.

Что такое steal time? Время, которое ваша виртуальная машина ждёт процессор из-за нагрузки соседей по физическому серверу. Устойчивые единицы процентов - повод обратиться в поддержку.

Почему метрики в норме, а сервер медленный? Три типичные причины: steal time, узкое место в сети и медленный код или запрос к базе, который ресурсов почти не потребляет.

Что проверить в первую очередь? Свободное место на диске. Это самая частая причина и самая быстрая в устранении.

Поможет ли добавление памяти? Только если упёрлись именно в неё. При нехватке диска или при steal time дополнительная память не изменит ничего.

Как отличить проблему сервера от проблемы сети? Сравнить скорость работы на самом сервере и снаружи. Если локально быстро, дело не в ресурсах машины.


Упёрлись в ресурсы? VPS на NVMe с гарантированными ресурсами - процессор и память не делятся с соседями, наращиваются за минуты без переезда. Площадки в Москве, Казани и Амстердаме, активация за 3 минуты.