Уменьшение нагрузки на VDS или VPS

Нагрузка на VDS может возникать по ряду причин. Рост посещаемости, неправильная настройка сервисов, действия злоумышленников — это и многое другое может служить причиной нестабильной работы сервера и веб-ресурса. Условно всю нагрузку можно разделить на три типа: нагрузка на память, процессор и диск. Кроме того, каждый тарифный план обладает лимитом на файловые дескрипторы (фактически, количество открытых файлов) и количество одновременно запущенных процессов. В данной статье будут описаны основные причины возникновения нагрузки, их поиск и устранение.

Инструменты для анализа работы сервера

*NIX утилиты. Чтобы локализовать проблему, необходимо провести анализ работы сервера. Примерную картину происходящего можно получить в панели VMmanager, раздел СтатистикаНагрузка VM, или с помощью панели ISPmanager, раздел Состояние системыИнформация о системе. Для более детального анализа требуется работа в консоли.

Один из самых доступных и простых в использовании средств мониторинга в Unix — команда top. Команда выдаст информацию о работе сервисов в реальном времени. Нас интересуют столбцы COMMAND (команда, выполняемая на сервере), %CPU (какой процент ресурсов центрального процессора использует сервис), %MEM (какой процент памяти использует сервис). Кроме этих столбцов следует обратить внимание на строки load average (la, среднее количество процессов, ожидающих выполнения за последние 1, 5 и 15 минут), Mem (количество свободной и используемой памяти). Вывод команды даст примерное представление о потреблении ресурсов. Если la на вашем VDS вырос выше 5 — это плохой знак.

Список процессов и потребление ресурсов также можно посмотреть командой ps auxw.

Чтобы узнать количество свободной и используемой памяти, на ОС Linux также можно воспользоваться командой free -m.

Команда vmstat выдает информационный отчет об активности процессов, памяти, свопинга, поблочного ввода/вывода, прерываний и процессора. Вывод vmstat сложнее в понимании.

Нагрузку на диск можно посмотреть следующим образом:

  • Для FreeBSD можно запустить команду top -mio. В выводе нас больше всего будут интересовать столбцы COMMAND и PERCENT (процент загрузки диска командой). Также можно использовать команды gstat и iostat.
  • Чтобы определить процесс, который нагружает диск в Linux, можно использовать команду iotop. Вывод покажет процент загрузки диска сервисами, работающими на сервере.

Модули Apache. Веб-сервер Apache является главным звеном в обеспечении работоспособности сайта. Именно этот сервис занимается отдачей контента пользователю. Для Apache существует множество модулей. Такие модули, как mod_performance и mod_status позволяют определить, какие скрипты создают наибольшую нагрузку.

Лог-файлы. Проблему не всегда можно распознать «на глаз». Полезным, также, бывает чтение лог-файлов сервера. Их местоположение зависит от используемой операционной системы и настроек сервисов.

Причины нагрузки

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

В списке процессов (top, ps) висит большое количество дочерних процессов apache или потоков php-cgi. Или процессы Apache создают высокую нагрузку на ЦП.

Возможные причины и варианты решения:

Неправильная настройка ограничений для веб-сервера. Необходимо проверить параметры MaxClients и MaxSpareServers. Оптимальное значение MaxClients можно рассчитать по формуле

MaxClients=M×0,8/H

М — общее количество памяти
H — количество памяти, потребляемое одним процессом Apache

Эти значения можно узнать из вывода команды top. MaxSpareServers на VDS не рекомендуется устанавливать выше 10. Ограничения устанавливаются в конфигурационных файлах:

  • Debian: /etc/apache2/apache2.conf
  • Centos: /etc/httpd/conf/httpd.conf
  • FreeBSD: /usr/local/etc/apache22/extra/httpd-mpm.conf (необходимо убедиться, что данный файл подключен в основном конфигурационном файле /usr/local/etc/apache22/httpd.conf

Стоит обратить внимание на то, что настройки разделены по модулям, в зависимости от MPM, который использует Apache. Узнать это можно из вывода команды apachectl -V (строка Server MPM).

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

[Sat Jun 25 14:14:17 2011] [error] server reached MaxClients setting, consider raising 
the MaxClients setting

Важно найти оптимальное значение данной директивы.

Возможно, ваш сервер ресурс стал жертвой DDoS-атаки. DDoS-атаки стали одним из самых дешевых и надежных средств «борьбы с конкурентами». Процесс обнаружения и борьбы с DDoS подробно описан в следующих статьях:

Рост посещаемости ресурса или повышенная нагрузка из-за индексации. Отслеживать посещаемость ресурса можно с помощью сторонних сервисов, таких как: Яндекс.Метрика, Google Analytics или счетчиков LiveInternet.

Также полезно анализировать access-логи сайтов. Они расположены:

  • Linux: /var/www/httpd-logs/sitename.access.log
  • FreeBSD: /home/httpd-logs/sitename.access.log

Достаточно часто причиной скачков нагрузки на веб-сервер является работа ботов поисковых сервисов, таких как YandexBot, GoogleBot или MSNBot. При этом в access-логах сайтов появляются записи вида:

77.88.29.248 - - [30/May/2013:03:52:02 +0400] "GET /img/3.jpg HTTP/1.1" 304 - "-" "Mozilla/5.0 
(compatible; YandexImages/3.0; +http://yandex.com/bots)"

Есть возможность запретить доступ ботов к сайту частично или полностью. Делается это с помощью файла robots.txt или .htaccess в корне сайта или той директории, доступ к которой вы хотите запретить. При полном запрете поисковый сервис не сможет индексировать сайт. Правила robots.txt выглядят следующим образом

# запрещает скачивать все, кроме страниц начинающихся с '/cgi-bin'

User-agent: Yandex
Allow: /cgi-bin
Disallow: /

В .htaccess это может выглядеть так:

# разрешаем доступ всем, кроме тех, чей User-Agent начинается с Yandex или Yahoo.

SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Yahoo" search_bot

Order Allow,Deny
Allow from all
Deny from env=search_bot

Более подробно про настройку htaccess. Про настройку robots.txt в помощи Яндекса.

Неправильная работа скриптов. Причиной высокой нагрузки на веб-сервер может стать не оптимальное использование скриптами ресурсов сервера. Нагрузку скриптов на сервер можно проверить с помощью модулей Apache (mod_performance и mod_status). В этом случае необходимо отлаживать скрипты. Трассировку скрипта можно сделать с помощью расширений php: xdebug или xhprof.

Рекомендуем обратиться к разработчику скриптов. Также вам помогут следующие статьи:

Можно попробовать установить на сервер Nginx (ISPmanager → «Возможности») и php-кэшер, например APC. В такой связке Nginx будет отдавать статику, а APC кэшировать запросы клиентов, что позволит увеличить скорость отдачи контента.

Apache создает нагрузку на процессор

Такое возникает при неправильной работе скриптов (см. выше), работе с аудио/видео или использовании mod_gzip для сжатия данных. Попробуйте отключить сжатие данных или оптимизировать скрипты.

MySQL создает нагрузку на диск

Неправильная конфигурация MySQL или построение запросов. Иногда MySQL использует диск для хранения временных таблиц. Это происходит в случае нехватки места в буферах памяти или при использовании сложных запросов. Размер буферов регулируется директивами в конфигурационном файле my.cnf. В данном случае, необходимо увеличить директивы tmp_table_size и max_heap_table_size. Проблему можно локализовать, используя команду mysqladmin -i 2 processlist -p с паролем администратора MySQL. В выводе будут присутствовать записи Created_tmp_disk_tables. При оптимизации настроек очень удобно пользоваться скриптами mysqltuner.pl и tuning-primer.

Внимание! Неправильная настройка параметров MySQL может привести к повышенному расходу оперативной памяти и других ресурсов системы.

MySQL гарантировано будет создавать временные таблицы на диске в случаях если:

  • присутствует BLOB или TEXT столбец в таблице
  • размер колонки при использовании GROUP BY или DISTINCT больше 512 байт
  • размер колонки в выводе SELECT, при использовании UNION или UNION ALL больше 512 байт

MySQL создает нагрузку на процессор

Вероятнее всего, проблема в «битых» индексах или таблицах. Информация об этом должна содержаться в логах MySQL. Необходимо запустить проверку таблиц. Сделать это можно через phpMyAdmin или командой mysqlcheck -Arp, введя пароль администратора MySQL.

Почтовый сервер создает нагрузку на процессор

Вероятнее всего, с вашего почтового сервера рассылается спам. Посмотреть очередь сообщений можно с помощью команды mailq. Используя идентификаторы из вывода команды, можно посмотреть письма в очереди. Для exim, например, это делается командами exim -Mvb (покажет тело письма), exim -Mvh (покажет заголовки письма). Для sendmail>/samp> письма можно посмотреть в папке /var/spool/mqueue/. Кроме того, информацию можно найти в логах:

  • exim: /var/log/exim/mainlog
  • sendmail: /var/log/maillog

Основные причины отправки спама с сервера:

  • взлом почтового ящика (необходимо сменить пароли);
  • взлом сервера и загрузка скриптов, рассылающих спам (можно определить по заголовку письма X-PHP-Script);
  • намеренная рассылка спама одним из пользователей.

DNS-сервер создает нагрузку на процессор

Вероятнее всего, сервер подвергся DNS Amplification атаке. Атака подробно описана в статье.

Чтобы избежать атаки необходимо добавить в конфигурационный файл DNS-сервера опцию allow-transfer в которой перечислить только доверенные ip-адреса серверов.

Для дистрибутивов CentOS также присутствует ошибка в старых версиях named. Исправляется добавлением в конфигурационный файл строчки:

managed-keys-directory "/var/named/dynamic";

Процессы tar и gzip создают нагрузку на диск и процессор

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

Неизвестные процессы создают нагрузку на сервер (память, процессор, диск)

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