использование памяти httpd

13

Возникли проблемы с использованием памяти 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 начинает использовать слишком много памяти, вам нужно выполнить некоторые настройки.
wurtel
Я в порядке с настройкой сервера Apache, но в прошлом не делал огромных усилий по настройке производительности для Apache. Какие-либо предложения, на какие директивы я должен смотреть или руководства? Есть ли параметр конфигурации, который я могу включить, чтобы сказать Apache о прекращении разветвленных процессов через определенное время? (Похоже, по какой-то причине Apache не делает этого по умолчанию.)
Джеймс Спиттал
Именно по этой причине я отошел от Apache ... попробуйте Nginx или даже Lighttpd.
Интересный. Слышал о хорошем, 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";}'
MaPePeR

Ответы:

11

Вот что я сделал, чтобы «решить» это:

  1. Набор MaxClients 7(на основе (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Следовательно:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Отключение всех модулей 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

  2. Удалите 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

Джеймс Спиттал
источник
Вышеприведенная конфигурация определенно очень помогла.
Джеймс Шпиттал
1
Пару дней спустя проблемы с «утечкой памяти» httpdисчезли полностью.
Джеймс Шпитталь
2

Боюсь, опция MaxRequestsPerChild помогла в вашем случае, так как она позволяет перерабатывать процессы после определенного количества запросов, поэтому утечка памяти есть, но больше не видна.

Дополнительно: MaxClients = ServerLimit * ThreadsPerChild

В вашем случае, если вам нужно только 7 одновременно работающих пользователей (MaxClients = 7), этого вполне достаточно с 2 процессами (на тот случай, если один не удастся минимизировать время простоя), поэтому конфигурация может быть:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Я использую MaxClients 8 , просто для более равномерного распределения запросов между двумя процессами.

Игорь Левков
источник