Apache2 PHP Site - Достигнут лимит MaxClients - диагностирование?

У нас есть сайт с умеренным трафиком (примерно 20000 посещений в день), на котором запущено приложение PHP/MySQL на Apache 2.2, Ubuntu 9.10 Server, из экземпляра Amazon EC2 c1.small (1,7 ГБ ОЗУ).

У нас были проблемы с сайтом, которые постоянно переставали отвечать. Как грязный хак, я установил MaxClients/ServerLimit на 450.

<IfModule mpm_prefork_module>
KeepAlive           On
KeepAliveTimeout     7
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          450
ServerLimit         450
MaxRequestsPerChild   0
</IfModule>

Сайт, кажется, работает дольше, чем раньше, но все равно умирает. Проверяя список процессов у меня (третий столбец - физическая память, четвертый столбец - виртуальный размер):

xxxxxxxxx@domU-XXXXXXXXX:/etc/apache2$ ps -eo pid,user,rss,vsz,args | grep apache
 2333 root     11092  39084 /usr/sbin/apache2 -k start
 3704 www-data 11060  41292 /usr/sbin/apache2 -k start
 3826 www-data 10016  39844 /usr/sbin/apache2 -k start
 3954 www-data 11976  41612 /usr/sbin/apache2 -k start
 4061 www-data 11844  41668 /usr/sbin/apache2 -k start
 4064 www-data 10988  40676 /usr/sbin/apache2 -k start
 4084 www-data 11804  41428 /usr/sbin/apache2 -k start
 4086 www-data 10192  39828 /usr/sbin/apache2 -k start
 4099 www-data 11876  41748 /usr/sbin/apache2 -k start
 4100 www-data 10980  40668 /usr/sbin/apache2 -k start
 4102 www-data  8952  39724 /usr/sbin/apache2 -k start
 4107 www-data 11856  41860 /usr/sbin/apache2 -k start
 4108 www-data  9952  39604 /usr/sbin/apache2 -k start
 4109 www-data     0      0 [apache2] <defunct>
 4114 www-data  7172  39724 /usr/sbin/apache2 -k start
 4115 www-data 10968  40668 /usr/sbin/apache2 -k start
 4122 www-data 11888  41844 /usr/sbin/apache2 -k start
 4123 www-data 11584  41444 /usr/sbin/apache2 -k start
 4124 www-data  7036  39596 /usr/sbin/apache2 -k start
 4125 www-data  6744  39084 /usr/sbin/apache2 -k start
 4126 www-data  9532  39552 /usr/sbin/apache2 -k start
 4127 www-data 10112  39812 /usr/sbin/apache2 -k start
 4128 www-data  6600  39084 /usr/sbin/apache2 -k start
 4129 www-data  6736  39084 /usr/sbin/apache2 -k start
 4130 www-data  7004  39596 /usr/sbin/apache2 -k start
 4131 www-data  6740  39084 /usr/sbin/apache2 -k start
 4132 www-data 11616  41596 /usr/sbin/apache2 -k start
 4134 www-data  7024  39588 /usr/sbin/apache2 -k start
 4135 www-data 11808  41516 /usr/sbin/apache2 -k start
 4136 www-data  7008  39460 /usr/sbin/apache2 -k start
 4137 www-data  6988  39460 /usr/sbin/apache2 -k start
 4139 1003       796   3040 grep --color=auto apache
victorhooi@domU-12-31-39-02-B6-34:/etc/apache2$

Есть ли простой способ узнать, что именно происходит? Мое понимание внутренних функций Apache не очень хорошее, но я бы подумал, что нам не понадобится столько параллельных процессов, чтобы обслуживать такую ​​страницу с таким трафиком. Мы унаследовали приложение, поэтому мало что знаем о его внутренностях, но это довольно простой сайт типа CMS, показывающий несколько результатов поиска, и я не думал, что ему понадобится такой кряк.

Я запускал ab для сайта, получал довольно паршивую частоту запросов (намного меньше 50 в секунду), но, возможно, это был мой плохой выбор настроек - многие из этих запросов, похоже, не выполнялись.

Где мне искать информацию о происходящем или какие-либо советы по устранению неполадок, которые я мог бы попробовать?

Ура, Виктор

4 ответа

Решение

450 детей с RSS около 10 МБ каждый более 4 ГБ потенциального использования памяти. Более чем достаточно, чтобы ваш экземпляр c1.small поменялся местами. Обмен почти всегда является нисходящей спиралью для серверов Apache.

Я бы сказал, что следующие несколько вещей, которые я хотел бы проверить, это:
- упоминается ли в журнале ошибок apache попадание в maxclients
- упоминает ли dmesg или /var/log/messages OOM killer?
- это обмен сервером
- является ли рост использования памяти медленным и устойчивым или резким / быстрым

Первые два просто смотрят на текстовые файлы. Третье, что вы можете сделать, но графики помогут, и четвертое вам нужны графики. Настройте apache's mod_status (вероятно, он уже там раскомментирован) и укажите на него munin/collectd/cacti.

Если вы подтвердите, что причина заключается в исчерпании памяти и обмене, есть масса, которую вы можете сделать оттуда. Во-первых, вы можете снизить свои максимальные клиенты до 150. Это оставит место для других вещей и кеша файловой системы (здесь mysql? Если так, то оставьте больше). RSS - это грубая метрика для экстраполяции, это просто все, что мы получили. Как только вы настроитесь на это, посмотрите графики с течением времени и посмотрите, есть ли у вас место для подъема или спуска. Оттуда вы можете сосредоточиться на 1.) Более тонких дочерних элементах apache (меньше модулей, затяните конфигурацию php) 2.) заставьте apache делать меньше (сочетание cdn, альтернативных http-серверов и параметров прокси-сервера http) 3.) upgradeyyed $$$

Недавно я собрал несколько советов по настройке производительности в http://www.anchor.com.au/hosting/dedicated/improving-server-capacity для работы; это работало довольно хорошо для машин, на которых я недавно применял это. Кроме того, если это более широкая проблема производительности компьютера, которая может быть не характерна для Apache, у меня есть гораздо более глубокая статья на http://www.anchor.com.au/hosting/development/HuntingThePerformanceWumpus которая охватывает определение того, какой компонент системы вызывает проблемы.

Вы также можете попросить Apache запустить с 50 процессами (StartServers 50), чтобы он не проходил всю процедуру расширения сервера при запуске, попробуйте увеличить количество запасных серверов Max примерно до 20, чтобы потоки не угасайте, если ваши запросы приходят волнами.

У вас могут быть постоянные соединения, открытые для вашего сервера с длительным тайм-аутом. Поскольку дополнительные клиенты продолжают подключаться, они занимают все больше и больше процессов apache. При постоянных подключениях каждый клиент может принять 1 (или более) подключений к вашему серверу.

Проверьте это для получения дополнительной информации: http://httpd.apache.org/docs/1.3/misc/perf-tuning.html

Другие вопросы по тегам