У нас есть сайт с умеренным трафиком (примерно 20 000 посещений в день), на котором запущено приложение 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 в секунду), но, возможно, это был мой плохой выбор настроек - многие из этих запросов, казалось, не выполнялись.
Где мне искать информацию о том, что происходит, или какие-либо советы по устранению неполадок, которые я мог бы попробовать?
Ура, Виктор
450 детей с RSS размером около 10 МБ каждый - это более 4 ГБ потенциального использования памяти. Более чем достаточно, чтобы заставить ваш экземпляр c1.small поменяться местами. Для серверов Apache свопинг - это почти всегда нисходящая спираль.
Я бы сказал, что следующие несколько вещей, которые я хочу проверить, это
- упоминается ли в журнале ошибок apache попадание в maxclients
- упоминает ли dmesg или / var / log / messages вообще OOM killer
- это сервер подкачки
- рост использования памяти медленный и устойчивый или резкий / быстрый рост
Первые два просто смотрят текстовые файлы. Третий - вы можете делать cli, но вам помогут графики, а четвертый - вам нужны графики. Настройте mod_status apache (вероятно, уже там, просто раскомментируйте его) и укажите на него munin / collectd / cacti.
Если вы подтвердите, что причина в нехватке памяти и подкачке, вы можете многое сделать. Во-первых, вы можете снизить максимальное количество клиентов примерно до 150. Это оставит место для других вещей и кеша файловой системы (здесь mysql? Если да, оставьте больше). RSS - это приблизительная метрика для экстраполяции, вот и все, что у нас есть. После того, как вы настроите это, посмотрите графики с течением времени и посмотрите, есть ли у вас место для движения вверх или вниз. Оттуда вы можете сосредоточиться на 1.) более тонких дочерних элементах apache (меньше модулей, усложните конфигурацию php) 2.) чтобы apache делал меньше (сочетание cdn, альтернативных http-серверов и параметров http-прокси) 3.) обновленyyed $$$
Я собрал несколько советов по настройке производительности в http://www.anchor.com.au/hosting/dedicated/improving-server-capacity для работы недавно; он отлично работал на машинах, на которых я недавно его применил. Кроме того, если это более широкая проблема производительности машины, которая может быть не специфичной для Apache, у меня есть гораздо более подробная статья на http://www.anchor.com.au/hosting/development/HuntingThePerformanceWumpus который включает определение того, какой компонент системы вызывает проблемы.
У вас могут быть постоянные соединения с вашим сервером с длительным таймаутом. По мере того, как дополнительные клиенты продолжают подключаться, они берут на себя все больше и больше процессов apache. При постоянных подключениях каждый клиент может иметь 1 (или более) подключение к вашему серверу.
Проверьте это для получения дополнительной информации: http://httpd.apache.org/docs/1.3/misc/perf-tuning.html
Вы также можете попробовать указать Apache для запуска с 50 процессами (StartServers 50), чтобы ему не приходилось выполнять всю процедуру расширения сервера при запуске, попробуйте увеличить количество резервных серверов Max примерно до 20, чтобы потоки не умирай, если ваши запросы будут приходить волнами.