Назад | Перейти на главную страницу

Apache вне памяти

Я использую 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 - это не много, если у вас достаточно загруженный сайт. Возможно, вы захотите взглянуть на настройку своей конфигурации.