Использование памяти процессами php-cgi неуклонно растет


8

Я пытаюсь настроить веб-сервер на VPS. Моя проблема заключается в том, что использование памяти процессами php-cgi увеличивается со временем, даже если веб-сайт вообще не получает никакого трафика. (пока что за брандмауэром)

VPS имеет 360 МБ оперативной памяти. Я использую Debian Lenny 32bit и его пакеты lighttpd и php5-cgi. Помимо некоторых изменений конфигурации (перечисленных ниже), я использую стандартную настройку Debian.

Сайт основан на Drupal. Используя модуль devel Drupal, я могу сказать, что использование PHP-скриптов в памяти в среднем составляет менее 20 КБ и никогда не превышает 8 МБ.

Вот соответствующие части из вывода ps aux:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data 29871  0.0  1.7  54552  6368 ?        Ss   Aug12   0:00 /usr/bin/php-cgi
www-data 29873  0.0  7.4  65808 27468 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29874  0.0  3.7  55808 13736 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29875  0.0  4.3  58040 16204 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29876  0.0  4.4  57444 16288 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29877  0.0  1.7  54552  6368 ?        Ss   Aug12   0:00 /usr/bin/php-cgi
www-data 29879  0.0  9.6  67140 35684 ?        S    Aug12   0:26 /usr/bin/php-cgi
www-data 29880  0.0  6.6  59172 24492 ?        S    Aug12   0:23 /usr/bin/php-cgi
www-data 29881  0.0  7.1  59784 26388 ?        S    Aug12   0:22 /usr/bin/php-cgi
www-data 29882  0.0  7.4  60880 27440 ?        S    Aug12   0:23 /usr/bin/php-cgi
  • Нормально ли иметь такой большой php-cgi?
  • Можно ли оценить использование памяти php-cgi на основе настроек?
  • Любые советы по снижению потребления памяти процессами php-cgi?

Поиск известных утечек памяти не дал ничего значимого. И я был бы удивлен, если бы стандартные пакеты Debian / config имели такую ​​очевидную утечку памяти. Другие пользователи на том же хосте не имеют этой проблемы.

То, что я сделал до сих пор, установлено PHP_FCGI_MAX_REQUESTSв низкое значение, чтобы процессы php-cgi быстро перерабатывались. Когда я использую abдля имитации высокой нагрузки, это работает очень хорошо. Процессы быстро умирают, прежде чем они становятся больше, чем 10 МБ. Однако при низкой и средней нагрузке все процессы стабильно растут (из-за балансировки нагрузки), и большинство из них одновременно потребляют более 28 МБ, что подвергает мой VPS риску замены. Обратите внимание, что даже без какого-либо трафика процессы неуклонно растут.

Я могу уменьшить количество процессов php-cgi, но это скорее обходной путь, чем исправление. Я был бы удивлен, если бы php-cgi нормально рос таким образом.

Кроме того, суммирование общих номеров RSS для процессов php-cgi дает:

$ ps -C php-cgi -o rss= | awk '{s+=$1}END{print s/1024}'
195.738

Тем не менее, free -mдает следующий вывод:

             total       used       free     shared    buffers     cached
Mem:           360        351          8          0         33        190
-/+ buffers/cache:        127        232
Swap:          255          0        255
  • Я что-то пропустил? Почему используемая память (без буферов) меньше общей резидентной памяти процессов php-cgi на хосте?

У меня есть следующие расширения PHP:

php5-cgi php5-common php5-curl php5-gd php5-mysql php5-xcache

xcache.sizeустановлен на 24M. Раньше он был 32M, но уменьшить его не помогло. xcache.var_sizeустановлено в 0. Остальные плагины используют стандартную конфигурацию. Страницы администрирования xcache показывают, что xcache использует менее 1 МБ.

PHP memory_limitустановлен на 32M.

Вот мой конфиг FastCGI:

fastcgi.server    = ( ".php" =>
  ((
    "bin-path" => "/usr/bin/php-cgi",
    "socket" => "/tmp/php.socket",
    "max-procs" => 2,
    "idle-timeout" => 20,
    "bin-environment" => (
      "PHP_FCGI_CHILDREN" => "4",
      "PHP_FCGI_MAX_REQUESTS" => "1000"
    ),
    "bin-copy-environment" => (
      "PATH", "SHELL", "USER"
    ),  
    "broken-scriptfilename" => "enable" 
  ))
)

Я использую более или менее акции, lighttpd.confкоторые поставляются с Debian.

Пожалуйста, дайте мне знать, если есть какие-либо другие данные, которые я могу предоставить.

Любая помощь приветствуется. Я пытался решить эту проблему в течение нескольких дней. У меня закончились идеи.

Ответы:


2

Попробуйте опустить вниз var_size. Если бы у нас было значение в 64 МБ, через несколько часов он начал сильно меняться, а через несколько часов он полностью упал. Постарайтесь сохранить исходные настройки на 32M, может быть, это вам очень поможет - у нас была такая же проблема на нашем сайте путешествий. Xcache по-прежнему много глючного программного обеспечения :(


1

Установка максимального количества запросов - правильная идея. Это способ предотвратить заполнение оперативной памяти системы при утечке памяти.

Одна вещь, которую я предлагаю вам попробовать, это переключиться на apache + mod_php. Если это работает без утечки памяти, значит, ваша проблема связана с CGI. Если он продолжает течь с mod_php, то, вероятно, где-то есть утечка памяти в коде.

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


Спасибо за Ваш ответ. Все модули Drupal хорошо известны, и модуль devel не сообщает об утечках памяти в Drupal. Кроме того, утечка памяти происходит, даже если вообще нет попаданий. Что касается попытки Apache, я бы оставил это в качестве последнего средства, когда у меня заканчиваются идеи. Еще раз спасибо.
Джон

У меня такие же проблемы ... Как убить процесс PHP-CGI, когда вы закончите с ним? Я просто использую ту же настройку с Wordpress, и это почти убивает мой срез 256 мегабайт.
Кайл

Используйте Nginx, так как он меньше обоих серверов и не имеет утечек памяти у PHP. Wordpress и другие крупные сайты используют его.
Xeoncross

0

Часто такие проблемы возникают из-за некоторого кэша кода операции, такого как XCache, или из-за расширения PHP memcached.


0

Удалите неиспользуемые библиотеки из /etc/php5/apache2/conf.d. Вероятно, вам не нужны pdo.ini и pdo_mysq.ini или mysqli.ini. Это сэкономит несколько Mega of Ram.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.