Я пытаюсь настроить веб-сервер на 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
Поиск известных ошибок утечки памяти не дал ничего значимого. И я был бы удивлен, если бы пакеты / конфигурация Debian по умолчанию имели такую очевидную утечку памяти. У других пользователей на том же хосте этой проблемы нет.
То, что я сделал до сих пор, установлено 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:
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.
Сообщите мне, есть ли другие данные, которые я могу предоставить.
Любая помощь приветствуется. Я уже несколько дней пытаюсь решить эту проблему. У меня закончились идеи.
Попробуйте опустить var_size. Если бы у нас было значение в 64 МБ, через несколько часов он начал бы сильно менять местами, а через следующие несколько часов он полностью отключился. Попытайтесь сохранить исходные настройки на 32M, возможно, это должно вам сильно помочь - у нас была такая же проблема в нашем путешествовать на сайте Xcache по-прежнему много глючного софта :(
Установка максимального количества запросов - правильная идея. Это способ предотвратить переполнение системной оперативной памяти при утечке памяти.
Я предлагаю вам попробовать перейти на apache + mod_php. Если это работает без утечки памяти, значит, ваша проблема связана с CGI. Если утечка продолжается с помощью mod_php, то, вероятно, где-то в коде есть утечка памяти.
Вы сказали, что используете Drupal. У вас установлены какие-либо модули Drupal? Я сомневаюсь, что в стабильной версии Drupal есть утечки памяти в ядре, поэтому проблемы, скорее всего, возникнут в модулях и других сторонних надстройках и настройках.
Удалите неиспользуемые библиотеки из /etc/php5/apache2/conf.d. Возможно, вам не нужны pdo.ini и pdo_mysq.ini или mysqli.ini. Это сэкономит немного Mega of Ram.
Часто проблемы такого рода возникают из-за кеширования кода операции, такого как XCache, или из-за расширения PHP memcached.