Перейти к основному контенту

Методы уменьшения нагрузки на VPS

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

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

Чтобы локализовать проблему, необходимо провести анализ работы сервера. Примерную картину происходящего можно получить в меню «Статистика» панели VDSmanager («Текущая нагрузка» -> «Отчет о нагрузке» -> «Отказы в ресурсах») или с помощью панели ISPmanager, пункт «Информация о системе». Для более детального анализа требуется работа в консоли.

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

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

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

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

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

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

Для того, чтобы определить процесс, который нагружает диск в Linux можно использовать команду iotop. Вывод покажет процент загрузки диска сервисами, работающими на сервере.


Модули Apache

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


Лог-файлы

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

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

Необходимо проверить параметры MaxClients и MaxSpareServers. Оптимальное значение 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 подробно описан в следующих статьях:

- Краткое руководство по борьбе с DDOS-атаками на http-сервер
- Использование mod security для блокирования DDoS атак
Рост посещаемости ресурса или повышенная нагрузки из-за индексации

Отслеживать посещаемость ресурса можно с помощью сторонних сервисов, таких как: Яндекс.Метрика (http://metrika.yandex.ru/), Google Analytics (http://www.google.com/analytics/) или счетчиков LiveInternet (http://www.liveinternet.ru/add). Также полезно анализировать 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 выглядят следующим образом
User-agent: Yandex
Allow: /cgi-bin
Disallow: /

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

В .htaccess это может выглядеть так:
SetEnvIfNoCase User-Agent "^Yandex" search_bot
SetEnvIfNoCase User-Agent "^Yahoo" search_bot
Order Allow,Deny
Allow from all
Deny from env=search_bot

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

Более подробно можно прочитать здесь: http://web-optimist.blogspot.ru/2008/05/tds-htaccess.html и http://help.yandex.ru/webmaster/?id=996567

Можно попробовать установить на сервер 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 гарантировано будет создавать временные таблицы на диске в случаях если:
присутствует BLOB или TEXT столбец в таблице;
размер колонки при использовании GROUP BY или DISTINCT больше 512 байт;
размер колонки в выводе SELECT, при использовании UNION или UNION ALL больше 512 байт.
MySQL создает нагрузку на процессор

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

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

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

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

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

Исправляется добавлением в конфигурационный файл строчки
managed-keys-directory "/var/named/dynamic";

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

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

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