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

Apache с mod_perl ест память при простое

Веб-сервер Apache, на котором запущено приложение mod_perl, демонстрирует ненормальное использование памяти - после прекращения "дневной нагрузки" системная память исчерпывается процессами Apache и вызывается oom_killer. Когда на следующее утро нагрузка возвращается, использование памяти нормализуется - вероятно, потому, что рабочие Apache периодически перерабатываются, если генерируется достаточное количество обращений:

Это график количества обращений apache в секунду для корреляции:

Оставшиеся 2 хита в секунду в течение ночи вызываются проверками HAProxy - он запускается. HEAD http://mydomain.example.com/running HTTP/1.0 запросы к серверу каждые полсекунды с "Бег" является статическим файлом (т.е. не вызывает никакого кода Perl). Также кажется, что отключение этих проверок решает проблему использования памяти, но, очевидно, не может быть решением.

Все 3 сервера с одинаковой конфигурацией (за HAProxy) демонстрируют это поведение. Операционная система - Ubuntu 10.10, Apache версии 2.2.16. Кажется, это утечка памяти, но я понятия не имею, как начать ее отладку - есть подсказки?

Это связано с утечкой памяти в коде Perl. Утренняя переработка может быть сделана по случаю logrotate. Лучшее решение для этого - использовать fast-cgi вместо mod_perl, который использует, например, 30 воркеров, поэтому каждый потребляет память, поэтому, если каждый будет перерабатывать очень часто, например, 100 запросов, а не 1000 или 10000, это все равно будет поглощать память. Итак, если вы настроите, например, 8, 16, 32 fast-cgi worker (зависит от вашей оперативной памяти) и перерабатывают их каждые 100 рендеров страниц, это не займет столько оперативной памяти, и производительность не будет снижена. Кроме того, вы получите большую безопасность, если сможете разделить модули между разными исполнителями fast-cgi, работающими на разных пользователях, и в идеале вы также настроите SELinux для изоляции этих учетных записей.