Тюнинг nginx, mysql, php на VPS.
Дата: Август 31st, 2008 Автор: EugeneVC
Достался мне как то VPS сервер на котором крутился региональный торрент трекер. Все ужасно тормозило и часто трекер был недоступен. Так как я люблю торрент трекеры - то предложил ребятам заняться тюнингом, они не отказались.
Все это крутилось на виртуальном выделенном сервере (VPS). Параметры VPS были такие 500 мГц CPU и 386M памяти, система Debian Etch 4. Веб сервер стоял на apache1.3, в качестве базы данных использовалась mysql5.0. Мною была произведена предварительная настройка:
Шаг 1. Установка nginx
Пришлось похоронить apache и заменить его на nginx. Причины как обычно, ускоренная отдача статики и меньшее потребление памяти. Статей на эту тему в интернете полным-полно.
Нужные пакеты: nginx
Шаг 2. Перевод php в режим fastcgi
Для этого используем следующий скрипт.
Нужные пакеты: php-cgi, lighttpd. Подробно тоже останавливатся не буду.
Шаг 3. Установка mysql последней версии
Ставим mysql5.1 одной из последних версий. Для debian он берется из backports.
Нужные пакеты: mysql5
Шаг 4.
Настраиваем все и заставляем работать. Я специально не стал останавливаться на настройке nginx и mysql - они многократно были описаны в интернете.
Запуск
На наш ресурс стали захаживать посетители и nginx встречал их любимой ошибкой “502 Bad Gateway”. Причиной отказа стал nginx, он не мог открыть tcp сокет - о чем радостно вопил в логе.
Проблема 1. Ограниченное количество tcp сокетов
Набрав команду: cat /proc/user_beancounters мы видим
uid resource held maxheld barrier limit failcnt
342: kmemsize 6560447 7965730 8192000 9011200 0
lockedpages 0 0 64 64 0
privvmpages 32802 72065 65536 72090 140
shmpages 10371 10387 16384 16384 0
numtcpsock 120 62 250 250 56734
[..cut..]
что напротив параметра numtcpsock постоянно увеличивающуюся циферку в последнем ряду - это отказы в доступных tcp сокетах. Нам не хватает сокетов для работы - увеличить их количество нельзя, это обычно ограничения хостера на создаваемые VPS.
Решение: на 1 соединение nginx приходится 1 tcp сокет? Как бы нитак, ответ 3. Один себе забирает nginx, 1 mysql, 1 php. НО! Php и mysql работаю локально - значит их можно переводить на unix сокеты.
Для этого для php в скрипте изменяем:
FCGIPORT="8888"
на
FCGIPORT="/var/run/spawn/fastcgi_socket"
далее
if test x$UID = x0; then
EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN"
else
EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -C $PHP_FCGI_CHILDREN"
fi
на
.
if test x$UID = x0; then
EX="$SPAWNFCGI -s $FCGIPORT -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN"
else
EX="$SPAWNFCGI -s $FCGIPORT -f $FCGIPROGRAM -C $PHP_FCGI_CHILDREN"
fi
Для mysql соединяемся из mysql_connect не с “localhost”, a “:/var/run/mysqld/mysqld.sock”.
Количество сокетов уменьшилось в системе - но его можно еще уменьшить - уличная магия да и только. Набрав команду netstat -a - мы видим кучу соединений и некоторые чего-то ждут. Для того что бы ждали поменьше - выставляем в конфиге nginx параметр:
keepalive_timeout 0;
Он означает, что отдав вебсервер отдав контент - закроет соединение, а не будет висеть и ждать 60 секунд - занимая сокет.
Ура ресурсу полегчало, но не радовала маленькая скорость загрузки страниц. На этот раз стало понятно, что mysql выжирает кучу процессора и параметр iowait высок.
Проблема 2: Маленькая скорость mysql.
Я не большой спец тюнингу по mysql, решил воспользоваться рекомендациями гуру написавшими данный скрипт. Скрипт смотрит статистику по работающему mysql ( желательно, что бы он проработал более 48 часов) подсказывает, что у вас не так. Мне пришлось править следующие параметры в my.cnf
max_connections = 15; // количество одновременных соединений - на VPS не много памяти, а mysql выделяет на каждое соеденение кучу памяти
key_buffer = 30M; // mysql по подсказкам скрипта использует всего 22M
table_cache = 256; //количество одновременно открытых таблиц
+ кучку обычных настроек
skip-innodb; // трекер использует только myisam таблицы
отключить все логи - что бы диск не был занят
Проблема 3. Уменьшение занимаемой памяти.
Установка для php. Данный модуль компит php в байт код ускоряя его работу и уменьшая занимаемую память. Самое главное тут, что бы все скомпиленые php файлы умещались в shared memory. Для диагностики выполните файлик test.php:
Ищем следующие строки:
Memory Size 33,554,396 Bytes
Memory Available 19,280,056 Bytes
Memory Allocated 14,274,340 Bytes
Если Memory Available будет близко к нулю - для этого мы должны ее увеличить, иначе все будет кешироватся на диск. Для этого под рутом выполняем
echo 134217728 >/proc/sys/kernel/shmall #выделяем 128M
echo 134217728 >/proc/sys/kernel/shmmax
и перезагружаем машину .
В результате этой не большой настройки трекер обслуживая порядка 50 пользователей одновременно онлайн - по top занимает всего 200 M памяти и средней нагрузке 2.0.
PS: дальнейшая оптимизация упирается только в CPU и требует более мощной тачки. Некоторые команды могу у вас не пойти, я так и не понял как создать swap на VPS ( при создании пишет, что в доступе отказано).
Популярность: 33%
Категория: Uncategorized, Базы данных |
Похожие статьи:
- Настройка Kohana и nginx
- Продажа MP3 через партнерку
- nginx и 502 bad gateway - что делать?
- Ускорение форума phpBB при помощи memcached
- KDE3 vs KDE4 в Debian
Сентябрь 15th, 2008 - 1:39 пп
[...] через spawn. Часто используют скрипты от lighttpd ( см. тут). Сколько запросов вы сможете обработать? Я построил [...]
Сентябрь 25th, 2008 - 6:21 пп
про установку можно почитать тут:
Октябрь 16th, 2008 - 3:46 пп
[...] тут недавно скромным облазадтелем VPS от хостера agava. Перешел я к ним от мастерхоста, ибо там [...]
Ноябрь 26th, 2008 - 10:29 пп
[...] Источник [...]
Декабрь 30th, 2008 - 3:05 пп
Указывая “localhost” в mysql_connect, соединение из php автоматом идёт через unix socket, а не tcp/ip.
Январь 2nd, 2009 - 11:14 пп
очень странная информация - чем подкреплена?
Март 10th, 2009 - 4:59 пп
Как-то я не уловил связи между nginx и торрентом…
Первый нужен для сайтиков всяких, а второй для обмена файлами…
Запутали…
Март 11th, 2009 - 12:53 пп
Торрент сервер как пример загруженного сайта, на нем и тюнился nginx.
Декабрь 8th, 2009 - 12:57 дп
Дошёл до пункта:
====================
3. Один себе забирает nginx, 1 mysql, 1 php. НО! Php и mysql работаю локально - значит их можно переводить на unix сокеты.
Для этого для php в скрипте изменяем:
FCGIPORT=”8888″
на
FCGIPORT=”/var/run/spawn/fastcgi_socket”
===================
И где это искать и менять???
Декабрь 8th, 2009 - 12:58 дп
Что вообще с этим http://lastage.ru/files/run_php_cgi скриптом делать? Народ хелп, вопрос актуальный очень!