Возникли проблемы с использованием памяти httpd
( Apache/2.2.29
).
Со временем использование памяти в httpd
процессах возрастает, пока не достигнет 100%.
Последний раз, когда я перезагружался, httpd
было около 24 часов назад. Выход из free -m
:
[ec2-user@www ~]$ free -m
total used free shared buffers cached
Mem: 1655 1415 239 0 202 424
-/+ buffers/cache: 788 866
Swap: 1023 4 1019
Чтобы доказать, что это точно httpd
, я перезапустил httpd
и free -m
снова побежал :
[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[ec2-user@www ~]$ free -m
total used free shared buffers cached
Mem: 1655 760 894 0 202 360
-/+ buffers/cache: 197 1457
Swap: 1023 4 1019
Таким образом, перезапуск Apache занимает свободную память с 239 Мб до 894 Мб - что кажется большим скачком.
Я просматривал список включенных в настоящее время модулей Apache (их довольно много) и отключен / удален mod_wsgi
и mod_perl
(ни один из которых не требуется для этого сервера, на котором запущено веб-приложение на основе PHP - в частности, Magento).
Основываясь на https://servercheck.in/blog/3-small-tweaks-make-apache-fly , я запустил ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'
и получил следующий вывод:
[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'
15.1328 MB
118.09 MB
127.449 MB
129.059 MB
117.734 MB
113.824 MB
125.062 MB
123.922 MB
119.855 MB
108.066 MB
136.23 MB
114.031 MB
113.27 MB
110.695 MB
102.113 MB
113.234 MB
186.816 MB
118.602 MB
0.835938 MB
Запуск другого предложенного диагностического инструмента, для MaxClients
которого ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
возвращается следующее:
[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB
Этот сервер ( m1.small
экземпляр Amazon AWS ) имеет 1.7 Gb
оперативную память. И потому:
Любые дальнейшие указатели / предложения о том, как лучше всего настроить httpd
параметры или как диагностировать, что именно может быть причиной этого?
источник
-/+ buffers/cache
строку; однако в этом случае изменение сопоставимо. В зависимости от того, как настроен apache, он может начинаться с пары процессов, готовых к обработке запросов; после периода множества одновременных запросов, вероятно, будет запущено больше процессов для обработки нагрузки. Количество незанятых процессов также можно настроить. Поэтому, если Apache начинает использовать слишком много памяти, вам нужно выполнить некоторые настройки.nginx
так что, может быть, пришло время попробовать, но, честно говоря, я использую Apache годами и у меня никогда не было серьезных проблем. Хотя Magento действительно жует память.grep httpd
-process (по крайней мере, для меня). Чтобы исправить это, я бы рекомендовал исключить эту строку из расчета следующим образом:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
Ответы:
Вот что я сделал, чтобы «решить» это:
MaxClients 7
(на основе(1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748
)Следовательно:
Отключение всех модулей Apache , за исключением
authz_host_module
,log_config_module
,expires_module
,deflate_module
,setenvif_module
,mime_module
,autoindex_module
,negotiation_module
,dir_module
,alias_module
,rewrite_module
,php5_module
Удалите
mod_ssl
пакет, так как клиент не используетhttps://
вообще.Я сообщу, как только эта новая конфигурация будет запущена некоторое время, чтобы увидеть, решит ли это это.
Некоторое вдохновение здесь было заимствовано у: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ и http://www.activoinc.com/ загрузки / httpd.conf-Magento
источник
httpd
исчезли полностью.Боюсь, опция MaxRequestsPerChild помогла в вашем случае, так как она позволяет перерабатывать процессы после определенного количества запросов, поэтому утечка памяти есть, но больше не видна.
Дополнительно: MaxClients = ServerLimit * ThreadsPerChild
В вашем случае, если вам нужно только 7 одновременно работающих пользователей (MaxClients = 7), этого вполне достаточно с 2 процессами (на тот случай, если один не удастся минимизировать время простоя), поэтому конфигурация может быть:
Я использую MaxClients 8 , просто для более равномерного распределения запросов между двумя процессами.
источник