blog

подписаться на обновления блога

29
Сен

FirstVds. Битва за память

Перечитываю эту статью уже несколько раз, сам занимался настройкой по ней. И чешутся у меня руки утянуть к себе в блог ее... не то чтобы ради ретинга, скорее ради сохранности. Ну а чтобы никто был не в обиде на меня, сразу заявляю что статью написал талантливый человек Виктор Артёмин и оригинал статьи находится здесь: http://averus.org/main/pages/34

PS статья посвящена настройке сервера firstvds.ru
Данная статься ориентирована на пользователей уровня выше среднего, знакомых с такими понятиями, как SSH, MC, FreeBSD, apache, MySQL, PHP.
Актуальна для шаблона soft2006.

Всё только началось...

Заказав сервер, и внимательно изучив панели, вы заметите такой раздел, как отказы в ресурсах. Слово "отказ" неминуемо вызовет у вас тревогу и желание решить проблему. Сразу хочу заметить, что не всё так страшно, как кажется, но если когда-нибудь у кого-нибудь вместо ожидаемой страницы откроется белый лист - согласитесь, будет немного неприятно. Кнопка F5 (обновить) но если подобное будет происходить часто, то сайт начнёт терять аудиторию.

Итак, для обзора ситуации заходим по SSH на наш сервер и вводим команду top, которая показывает список активных процессов, а так же использование ресурсов (памяти и CPU). В результате видим примерно такую картину(вверху) :

last pid: 53675; load averages: 0.35, 0.33, 0.38 up 0+10:21:50 12:13:49
39 processes: 2 running, 37 sleeping
CPU: 4.3% user, 0.0% nice, 8.7% system, 0.0% interrupt, 87.0% idle
Mem: 99M Active, 29M Free
Swap: 256M Total, 660K Used, 255M Free
Строчка Mem показывает , что у нас используется 99Мб и свободно 29 МБ. Но ситуация может оказаться немного другая:
Mem: 116M Active, 16M Inact

В данной ситуации мы используем 116 Мб. доступной по тарифу памяти и 16 Мб хостер нам даёт так сказать на халяву. Т.е. технология виртуализации и политика FirstVDS позволяет немного выйти за рамки тарифа. А так как сервера загружены не на 100% и не все пользователи используют наполную то остаётся небольшой излишек, который мы можем занять. Использование негарантированной памяти происходит автоматически (как правило, из за особенностей работы apache, о которых расскажу немного позже), и контролировать этот процесс проблематично. В случае, когда сервер (или один из процессов) пытается занять дополнительную память, но на физической машине свободной не осталось, либо когда чей-то сервер попросил вернуть своё "назад" происходит отказы в выделении памяти.

Когда отказы происходят несколько раз в сутки, на ситуацию можно не обращать внимания. Но когда их количество достигает нескольких тысяч в сутки - требуется срочное принятие мер, так как процессом, который получил отказ может оказаться не один из детей апача(в этом случае не отобразиться страничка, и всё), а скажем mysqld ( в этом случае не будет работать всё, что связано с базой данных, и возможно потребуется ваше вмешательство). Существует, конечно, доля вероятности что один отказ в сутки придётся именно на mysql, одна ко она крайне мала.

Итак, что мы можем сделать :

а. Докупить оперативную память(16-32 мбайта, если не хватит, то больше).
б. Произвести тюнинг (о чём дальше речь и пойдёт)

О бедном apache замолвите слово.

Программа, которая отдаёт нам страницы называется WEB-сервером. Данный набор ПО использует в качестве WEB-сервера Apache. Данный сервер используется более, чем половиной серверов интернета. Не вдаваясь в рекламу скажу, что он способен отдавать сотни страниц в секунду. Реализована данная способность за счёт того что запускаются несколько дочерних процессов, каждый их которых способен отдавать единовременно только одну страницу. Тем не менее, каждый процесс требует памяти. Когда число одновременно запрашиваемых страниц становиться больше, чем количество дочерних процессов, запускаются дополнительные процессы, но после того, как страница отдана, остаются висеть в памяти. Со временем их число станет меньше (процессы имеют лимит отданных страниц, после превышения, которого выгружаются), но произойдёт, при небольшом трафике это нескоро. Глубоко в особенности работы апача вникать мы не будем. Скажу только то, что наши действия будут направлены на то, чтобы:

pre : Подключем ngnix
а. Уменьшить количество процессов httpd. (тех самых, что вы видели в команде top)
б. Уменьшить объём памяти, занимаемый каждым из них.

Для дальнейших действий рекомендуется использовать Midnight Commander (вызывается командой mc)

pre : Подключем ngnix

Учитывая то, что на сайте помимо отдаваемых РНР скриптами динамических страниц, имеются статические объекты, такие как картинки, CSS , файлы которые не завият от работы php-скрипта и доступны по подному и тому же пути (например http://your_site.com/img/fon.gif) . Каждый запрос страницы пользователем может сопровождаться загрузкой элементов дизайна (20-30 картинк), если неграмотно настроено кеширование, что может потребовать запуска дополнительных процессов httpd, и соответственно поеданию драгоценной памяти. Наиболее эффективная мера борьбы с этим явлением закулчается в установке кеширующего сервера ngnix. Чтобы вас не пугать сразу хочу сказать, что большинство крупнейших проектов рунета (мамба, рамблер, вконтакте) его используют.

Работает он примерно так : Когда клиент запрашивает страницу - запрос приходит на ngnix. Он смотрит на тип контента и наличие её в своём кеше. Если это просто картинка и она запрашивалась ранее, то он её просто отдаёт не напрягая при этом лишний раз апач. Если нет то запрос спускается к апачу. Если запрошен не статичный файл,а страница, то запрос сразу уходит на апач. Таким образом мы безболезненно снижаем число обращений к апачу и соответственно число необходимых процессов httpd в памяти.

Устанавливается он просто : Следуем в панель ISP далее в разделе настройки сервера открываем пункт возможности.

далее находим в списке "Nginx - быстрый и лёгкий WWW сервер для кэширования" и справа вверху нажимаем "установить" или на жёлтую лампочку, если ngnix уже установлен.

а. Уменьшить количество процессов:
Для уменьшения количества процессов, делаем следующие действия :
идём по пути : /usr/local/etc/apache22/extra
и редактируем файл : httpd-mpm.conf

В нём находим следующие строчки( мой сервер работает сданными настройками) :

<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 8
MaxClients 20
MaxRequestsPerChild 25
</IfModule>

StartServers: число процессов при старте.
MinSpareServers: Минимальное число процессов в обычном режиме.
MaxSpareServers: Максимальное число.
MaxClients: Максимальное число процессов httpd.
MaxRequestsPerChild: Максимальное число страниц отданных процессом, после которого он убивается.

Приведённые выше настройки даны для сервера с небольшой посещаемостью. После применения, периодически просматривайте логи, если серверу придётся часто дозапускать процессы, он об этом сообщит, в этом случае увеличьте значения StartServers , MinSpareServers ,MaxSpareServers. Как показывает практика для сервера с посещаемостью до 2000 уников/сутки 2-5 серверов вполне достаточно, если, конечно нет пиковых нагрузок.
Мы настроили модуль MPM( Multi-Processing Module), но по умолчанию он отключен. Для того чтоб его подключить нам необходимо найти в файле httpd.conf (находится /usr/local/etc/apache22) строку :

# Server-pool management (MPM specific)
# Include etc/apache22/extra/httpd-mpm.conf

и убрать # вначале второй строки.

После чего перезагрузить сервер введя в командной строке apachectl -k restart

б. Уменьшить объём памяти, занимаемый каждым httpd.

Данные действия вы делаете на свой страх и риск! После проведения данной оптимизации перестанут работать phpMyAdmin и WebMail из панели ISP manager. (PhpMyAdmin придётся добавлять ручками).

Создавая сайт, вам приходилось выбирать режим работы php. (подробнее о режимах написано тут : http://firstvds.ru/ru/technology/faq/phpmodes.html ) Режимы "PHP как FastCGI" и "PHP как модуль Apache" имеют свои приемущества, в частности работают быстрее, однако в данном случае каждый из них является модулем апача и соответственно вносит свой вес в каждый процесс httpd. Даже если ни один из ваших сайтов не использует данные режмы, в любом случае они загружаются в каждом процессе. Так как PhpMyAdmin и WebMail (находящиеся в панели) привязаны к режиму "PHP как модуль Apache" то после отключения данных модулей они работать перестанут.

Преже, чем мы отключим данные модули убедитесь, что PHP на всех ваших сайтах переведёт в режим "PHP как CGI" . После чего переходим к следующим действиям :

Снова открывает httpd.conf
находим строчки :
LoadModule php5_module libexec/apache22/libphp5.so
LoadModule fcgid_module libexec/apache22/mod_fcgid.so
И ставим перед ними символ #
Снова перезагружаем апач apachectl -k restart
Ну и для проверки смотрим, что нам говорит команда top

В заключении хочу сказать, что для восстановления работы phpMyAdmin скачайте последнюю версию с сайта проекта и распакуйте в какой-нибудь каталог одного из своих сайтов.

Далее: ← Раньше:
  • http://shibaon.ru ShibaOn

    Хорошая статейка. Вообще, настройка и оптимизация *nix’ов — это процесс очень творческий и многогранный. В результате может получиться настоящий шедевр.

  • http://averus.org Артёмин Виктор

    Спасибо за сохранение ссылок и авторства.
    Стоит отметить что статья затачивал под пути и условия на firstvds и слабую нагрузку(1-2 одновременных сессии).
    Если нагрузка побольше или памяти побольше (чем 128 мб) то рекомендую увеличить настройки mpm_prefork_mod ule.
    Если будут вопросы — обращайтесь в личку, постараюсь помочь.