Как уменьшить нагрузку на CPU и БД

Обсудить
Как уменьшить нагрузку на CPU и БД

С ростом посещаемости сайта увеличивается нагрузка на CPU и MySQL. И примерно через неделю Timeweb начинает настойчиво просить дать им больше денег перейти на другой тариф. Что ж, их можно понять: сайт потребляет больше ресурсов, чем заложено по тарифу. Но прежде чем доплачивать, давайте попробуем избавиться от нагрузки.

В интернете есть множество статей с десятками пунктов, как уменьшить нагрузку. Что там только не пишут: и lazyload (Google PageSpeed рекомендует), и gzip-сжатие, и написание директив в robots.txt, и выставление кэша в .htaccess для статических файлов (хотя на дворе 2019 год и 95% хостеров делают это за вас), и многие другие мелочи.

Нет, сделать lazyload - это супер, и обработку картинок на стороне сервера тоже круто, и обязательно собрать все стили в один CSS-файл, и скрипты в футер + async. Но в плане уменьшения нагрузки это не поможет. Действительно рабочих методов лишь несколько.

1. Включить кэширование.

Для Joomla я использую компонент Jotcache. Каждый сам для себя решает, какое время кэширования ставить. Так как у меня новостной сайт, я ставлю 5 минут. Но если скорость добавления и обновления информации не играет ощутимой роли (например, для сайтов-статейников), можно ставить и 30-90 минут.

P.S. Стандартные встроенные компоненты тут не помогут. Кэширование должно сократить нагрузку в 2-3 раза.

2. Сократить количество запросов к БД.

Каждый включенный компонент, модуль, плагин или расширение - это дополнительные запросы к базе данных. Особенно, если это связано с любым контентом. Криво написанные модули могут делать десятки запросов к БД. Например, модуль "последних записей" может делать не 1 запрос к БД, а столько, сколько записей выводится.

Например, этот делает около 20 запросов:

Запросы

Какое решение? Убирать модуль, искать другой, уменьшать количество запросов экспериментальным путем.

3. Заблокировать чересчур активных ботов.

Нужно зайти в /ваш_сайт/access_log и посмотреть, кто там и что там. Если находим слишком активных ботов, от которых нет никакого толку, блокируем их.

Для этого заходим в .htaccess и дописываем такие строки:

RewriteCond %{HTTP_USER_AGENT} PycURL [OR]
RewriteCond %{HTTP_USER_AGENT} Aport [OR]
RewriteCond %{HTTP_USER_AGENT} ia_archiver

PycURL, Aport, ia_archiver - это названия ботов. Каждая строка в списке заканчивается [OR], а последняя - просто названием бота.

Кстати, некоторые еще предлагают игнорировать ботов через robots.txt, но большинство обходит эти директивы.

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

У моего сайта сейчас не сезон, посещаемость - 200 человек в сутки. Но в access_log 14700 записей. Из них:

  • Semrush - 4000
  • YandexNews (RSS) - 4600
  • YandexBot - 1300
  • GoogleBot - 700
  • Bing - 300
  • DotBot - 500
  • Mail.RU_Bot - 400
  • Остальные 2000 - боты, реальные люди и прочее.

Когда я писал эту статью, то заметил что в один день megaindex.ru полностью пропарсил сайт, из-за чего нагрузка поднялась до 3000s (лимит 1000).

Semrush ранее был более скромным, но постоянные 30% запросов в день от общего числа - тоже причина отправиться в бан. Что касается YandexNews, который делает запрос к RSS-ленте, то RSS-лента - с пятью последними новостями, что делает нагрузку не такой ощутимой даже при 4600 запросах в сутки.

Semrush, Ahrefs, Megaindex, Linkpad, Moz и т.д. - просто парсят ваш сайт с целью узнать внешние ссылки и их направление. Кого блокировать, а кого оставлять - на ваш выбор.

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

Комментарии