Я использую CentOS 5 на VPS с памятью 512 МБ. Я обнаружил, что httpd часто не хватает памяти, что отстает от всей системы. Но я не могу понять причину.
Когда я использую top
для мониторинга процессов, иногда один из httpd
вынимает 90 +% памяти, потом SSH зависает на секунды. когда top
снова освежает, что httpd
был убит ядром. Проблема повторяется через несколько минут снова и снова.
Вот системный журнал: http://pastebin.com/bszy9ahq
Конфигурация моей предварительной вилки Apache:
<IfModule prefork.c>
StartServers 1
MinSpareServers 3
MaxSpareServers 7
ServerLimit 128
MaxClients 128
MaxRequestsPerChild 4000
</IfModule>
Вот это httpd -V
:
Server version: Apache/2.2.3
Server built: Mar 24 2012 13:32:42
Server's Module Magic Number: 20051115:3
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 32-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Есть ли способ узнать, какой сценарий вызывает проблему с памятью или просто связан с apache? И как разрешить ...
Системе не хватает памяти, и она решила убить apache, чтобы освободить место. Это не обязательно apache, который использует всю память. 512 МБ может быть недостаточно для 128 процессов httpd, но эта цифра может сильно отличаться. Вы смотрели, сколько памяти использует экземпляр httpd? Не пытайтесь решить эту проблему на основе статического снимка - нанесите график использования памяти (меньше буферов и кеша) по сравнению с количеством экземпляров httpd и выполните регрессию наименьших квадратов - наклон - это объем памяти, используемый для каждого экземпляра. Затем узнайте, сколько памяти использует система, когда Apache выключен. В зависимости от объема содержимого, считываемого с диска, вы должны стремиться к свободному минимуму ~ 20% памяти для кеша / буферов.
Вы настроили свой httpd.conf? Удаление всех резервных модулей? Сообщения поддержки активности должны быть включены, но время ожидания должно составлять не более 2 секунд. Включите сжатие и кеширование вывода для статического содержимого.
Если вы подозреваете утечку памяти в Apache, попробуйте уменьшить MaxRequestsPerChild.
иногда один из httpd забирает 90 +% памяти
Это скорее указывает на сбойный скрипт / модуль.
любой способ узнать, какой сценарий
Не из предоставленной вами информации - нет ничего, что могло бы сказать нам, какой язык сценариев вы используете, или как он вызывается из httpd. Если это PHP, попробуйте добавить скрипт autoprepend, например ....
<?php
register_shutdown_function('logmem');
function logmem()
{
apache_note('x-php-peak-mem', memory_get_peak_usage());
}
и укажите значение в журнале доступа:
"%{x-php-peak-mem}n"
Очевидно, это будет только отчет об успешном завершении запросов, но это только начало.
Опять же, если это PHP, то установка слишком высокого лимита памяти (хотя это также относится и к другим объектно-ориентированным языкам) может быть контрпродуктивной из-за подавления сборки мусора.
(Кстати, если память заканчивается через несколько минут, то "StartServers 1" просто глупо)
Чтобы устранить это:
512 МБ для Apache - это не много, если у вас достаточно загруженный сайт. Возможно, вы захотите взглянуть на настройку своей конфигурации.