Monday, September 25th, 2017

Тюнинг nginx, mysql, php на VPS

Published on Март 30, 2009 by   ·   Комментариев нет

Введение

В настоящее время стало популярно вместо обычного хостинга, брать себе виртуальный сервер (VPS).
Дешево, по сравнению с настоящим сервером ( в 2-3 раза) и места много. Так мои друзья и поступили,
заказав себе VPS и отказались от обычного хостинга. Их ресурс был достаточно популярен, но к сожалению
часто был не доступен. Взяв VPS — они думали, что решили проблемы с надежностью — но не тут то было.
Так как у меня уже был опыт оптимизации таких серверов, они попросили меня посмотреть в чем причина тормозов.
Параметры VPS были такие 500 мГц CPU и 386M памяти, система Debian Etch 4. Веб сервер стоял на apache1.3,
в качестве базы данных использовалась mysql5.0.
Работал VPS на базе Virtuozzo.

По следам оптимизации — была написана эта статья. Статья расчитана на опытных вебмастеров.

Предварительная настройка

Шаг 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 по подсказкам [14]скрипта использует всего 22M
           table_cache = 256; //количество одновременно открытых таблиц  + кучку обычных настроек
           skip-innodb; // трекер использует только myisam таблицы отключить все логи - что бы диск не был занят

Проблема 3. Уменьшение занимаемой памяти.

Установка eAccelerator для 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


   в /etc/sysctl.conf добавляем:
           kernel.shmall = 134217728
           kernel.shmmax = 134217728

и перезагружаем nginx в VPS.

В результате этой не большой настройки трекер обслуживая порядка 50
пользователей одновременно онлайн — по top занимает всего 200 M памяти
и средней нагрузке 2.0.

PS: дальнейшая оптимизация упирается только в CPU и требует более
мощной тачки. Некоторые команды могу у вас не пойти, я так и не понял
как создать swap на VPS ( при создании пишет, что в доступе отказано).








































Смотрите также:

Readers Comments (Комментариев нет)




Да человек я, человек! =)

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]