Как устранить перегрузку сервера

Как найти узкое место в работе сервера, быстро устранить проблему, повысить эффективность использования сервера и избежать повторения проблем.

Katie Hempenius
Katie Hempenius

Обзор

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

  1. Оценка. Определите узкое место в работе сервера.
  2. Стабилизация. Примите срочные меры, чтобы уменьшить негативные последствия.
  3. Улучшение. Расширение и оптимизация возможностей сервера.
  4. Мониторинг. Используйте автоматизированные инструменты, чтобы предотвратить проблемы в будущем.

Оценить

Когда трафик перегружает сервер, узким местом может стать один или несколько из следующих компонентов: ЦП, сеть, память или дисковый ввод-вывод. Определив, какой из этих факторов является узким местом, вы сможете сосредоточить усилия на наиболее эффективных мерах по устранению проблемы.

  • ЦП. Если загрузка ЦП постоянно превышает 80 %, необходимо выяснить причину и устранить ее. Производительность сервера часто снижается, когда загрузка ЦП достигает 80–90 %, и становится ещё ниже, когда она приближается к 100 %. Загрузка ЦП при обработке одного запроса незначительна, но при резком увеличении трафика сервер может не справиться с нагрузкой. Чтобы снизить нагрузку на ЦП, перенесите показ на другую инфраструктуру, сократите количество ресурсоемких операций и ограничьте число запросов.
  • Сеть. В периоды высокой нагрузки пропускная способность сети, необходимая для выполнения запросов пользователей, может превышать доступную. На некоторых сайтах, в зависимости от хостинг-провайдера, также могут быть ограничения на совокупный объем передаваемых данных. Чтобы устранить эту проблему, уменьшите размер и количество данных, передаваемых на сервер и с него.
  • Память. Если системе не хватает памяти, данные приходится выгружать на диск. Доступ к диску происходит значительно медленнее, чем к памяти, и это может замедлить работу всего приложения. Если память полностью исчерпана, могут возникать ошибки нехватки памяти (OOM). Чтобы устранить эту проблему, можно настроить распределение памяти, устранить утечки памяти и увеличить объем памяти.
  • Операции ввода-вывода на диске. Скорость чтения и записи данных на диск ограничена возможностями самого диска. Если узким местом является дисковый I/O, то увеличение объема данных, кэшируемых в памяти, может решить эту проблему (за счет увеличения использования памяти). Если это не поможет, возможно, вам потребуется обновить диски.

В этом руководстве описаны методы, направленные на устранение узких мест в ЦП и сети. Для большинства сайтов узкими местами во время всплеска трафика будут ЦП и сеть.

Чтобы найти узкие места, запустите на затронутом сервере команду top. Если возможно, дополните их статистикой от хостинг-провайдера или инструмента мониторинга.

Стабилизация

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

Ограничение частоты запросов

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

Исправить

Хотя отклонение запроса не требует больших ресурсов, лучше всего ограничить частоту запросов на уровне вышестоящего сервера, например с помощью балансировщика нагрузки, обратного прокси-сервера или CDN.

Инструкции

Что ещё почитать:

Кеширование HTTP

Подумайте, как можно более активно кешировать контент. Если ресурс можно загрузить из кеша HTTP (будь то кеш браузера или CDN), то его не нужно запрашивать с сервера-источника, что снижает нагрузку на сервер.

HTTP-заголовки, такие как Cache-Control, Expires и ETag, указывают, как ресурс должен кешироваться кешем HTTP. Проверьте и исправьте эти заголовки, чтобы улучшить кеширование.

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

Диагностика

Запустите Lighthouse и посмотрите на аудит Используйте эффективные правила кеширования для статических объектов, чтобы увидеть список ресурсов с коротким или средним временем жизни (TTL). Подумайте, нужно ли увеличить TTL для каждого из перечисленных ресурсов. Вот примерные рекомендации:

  • Статические ресурсы должны кешироваться с длительным сроком хранения (1 год).
  • Динамические ресурсы должны кешироваться с коротким TTL (3 часа).

Исправить

Установите для директивы max-age заголовка Cache-Control нужное количество секунд.

Инструкции

Постепенное сокращение

Постепенное сокращение – это стратегия временного снижения функциональности, чтобы снять избыточную нагрузку с системы. Эту концепцию можно применять по-разному. Например, можно показывать статичную текстовую страницу вместо полнофункционального приложения, отключать поиск или возвращать меньше результатов поиска, а также отключать некоторые ресурсоемкие или необязательные функции. В первую очередь следует удалять функции, которые можно безопасно и легко удалить с минимальным влиянием на бизнес.

Улучшить

Используйте сеть доставки контента (CDN)

Чтобы снизить нагрузку на сервер, можно передавать статические объекты через сеть доставки контента (CDN).

Основная функция CDN – быстрая доставка контента пользователям за счет большой сети серверов, расположенных близко к ним. Однако большинство сетей доставки контента также предлагают дополнительные функции, связанные с производительностью, такие как сжатие, балансировка нагрузки и оптимизация медиа.

Как настроить CDN

Эффективность CDN зависит от масштаба, поэтому создавать собственную сеть доставки контента обычно нецелесообразно. Базовая настройка CDN занимает около 30 минут и заключается в обновлении записей DNS, чтобы они указывали на CDN.

Оптимизация использования CDN

Диагностика

Определите ресурсы, которые не передаются из CDN (хотя должны), с помощью WebPageTest. На странице результатов нажмите на квадрат над пунктом "Эффективное использование CDN", чтобы посмотреть список ресурсов, которые должны передаваться из CDN.

Стрелка, указывающая на кнопку "Эффективное использование CDN"
Результаты WebPageTest

Исправить

Если ресурс не кешируется сетью доставки контента, убедитесь, что выполняются следующие условия:

Масштабирование вычислительных ресурсов

Решение о масштабировании вычислительных ресурсов следует принимать осторожно. Хотя масштабирование вычислительных ресурсов часто необходимо, преждевременное масштабирование может привести к ненужному усложнению архитектуры и финансовым затратам.

Диагностика

Высокое значение показателя Time to First Byte (TTFB) может означать, что сервер работает на пределе своих возможностей. Эту информацию можно найти в аудите Lighthouse Сократите время ответа сервера (TTFB).

Чтобы получить более подробную информацию, используйте инструмент мониторинга для оценки загрузки ЦП. Если текущая или ожидаемая загрузка ЦП превышает 80 %, рекомендуем увеличить количество серверов.

Исправить

Добавление балансировщика нагрузки позволяет распределять трафик между несколькими серверами. Балансировщик нагрузки находится перед пулом серверов и направляет трафик на нужный сервер. Поставщики облачных сервисов предлагают собственные балансировщики нагрузки (GCP, AWS, Azure). Вы также можете настроить собственный балансировщик с помощью HAProxy или NGINX. После установки балансировщика нагрузки можно добавить дополнительные серверы.

Помимо балансировки нагрузки, большинство поставщиков облачных сервисов предлагают автомасштабирование (GCP, AWS, Azure). Автомасштабирование работает в сочетании с балансировкой нагрузки. Оно автоматически увеличивает и уменьшает вычислительные ресурсы в зависимости от спроса в данный момент времени. Однако автомасштабирование не является волшебным решением: для запуска новых экземпляров требуется время и значительная настройка. Поскольку автоматическое масштабирование усложняет работу, сначала следует рассмотреть более простую настройку на основе балансировщика нагрузки.

Включите сжатие

Текстовые ресурсы следует сжимать с помощью gzip или brotli. Gzip может уменьшить размер передаваемых ресурсов примерно на 70 %.

Диагностика

Чтобы определить, какие ресурсы нужно сжать, используйте проверку Lighthouse Включите сжатие текста.

Исправить

Включите сжатие, обновив конфигурацию сервера. Инструкции

Оптимизируйте изображения и медиаконтент

Изображения составляют большую часть размера файлов большинства сайтов. Оптимизация изображений может быстро и значительно уменьшить размер сайта.

Диагностика

В Lighthouse есть несколько проверок, которые выявляют потенциальные возможности оптимизации изображений. Другой способ – найти самые большие графические файлы с помощью инструментов разработчика. Скорее всего, именно их и нужно оптимизировать.

Проверки Lighthouse по теме:

Рабочий процесс в инструментах разработчика Chrome:

Исправить

Если у вас мало времени

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

Учитывайте следующее:

  • Размер. Изображения не должны быть больше, чем необходимо.
  • Сжатие. Как правило, уровень качества 80–85 минимально влияет на качество изображения, но при этом уменьшает размер файла на 30–40 %.
  • Формат. Для фотографий используйте формат JPEG, а не PNG. Для анимированного контента используйте формат MP4, а не GIF.

Если у вас есть время

Если изображения составляют значительную часть вашего сайта, рекомендуем настроить CDN для изображений. Сети доставки контента для изображений предназначены для показа и оптимизации изображений и позволяют снизить нагрузку на сервер-источник. Настроить CDN для изображений несложно, но вам потребуется обновить URL существующих изображений, чтобы они указывали на CDN.

Что ещё почитать:

Минифицируйте JS и CSS

Минификация удаляет ненужные символы из JavaScript и CSS.

Диагностика

Чтобы определить, какие ресурсы нуждаются в минификации, используйте проверки Lighthouse Минифицируйте CSS и Минифицируйте JavaScript.

Исправить

Если у вас мало времени, сосредоточьтесь на минификации JavaScript. На большинстве сайтов JavaScript больше, чем CSS, поэтому это окажет более заметный эффект.

Отслеживать

Инструменты мониторинга серверов обеспечивают сбор данных, панели инструментов и оповещения о производительности сервера. Их использование может помочь предотвратить и смягчить будущие проблемы производительности сервера.

Настройка мониторинга должна быть максимально простой. Чрезмерный сбор данных и оповещения имеют свою цену: чем больше объем или частота сбора данных, тем дороже их сбор и хранение; чрезмерное количество оповещений неизбежно приводит к игнорированию страниц.

Для оповещений следует использовать показатели, которые позволяют стабильно и точно обнаруживать проблемы. Для этого хорошо подходит время ответа сервера (задержка), поскольку оно позволяет выявить множество проблем и напрямую связано с удобством для пользователей. Оповещения на основе показателей более низкого уровня, таких как загрузка ЦП, могут быть полезным дополнением, но будут улавливать меньшее подмножество проблем. Кроме того, оповещения должны основываться на производительности, наблюдаемой в хвосте (другими словами, 95-й или 99-й процентили), а не на средних значениях. В противном случае средние значения могут легко скрыть проблемы, которые затрагивают не всех пользователей.

Исправить

У всех крупных поставщиков облачных сервисов есть собственные инструменты мониторинга (GCP, AWS, Azure). Кроме того, отличной бесплатной альтернативой с открытым исходным кодом является Netdata. Независимо от того, какой инструмент вы выберете, вам нужно будет установить агент мониторинга на каждом сервере, который вы хотите отслеживать. После этого настройте оповещения.

Инструкции