Уничтожение отдельных процессов Apache в mod_python - PullRequest
1 голос
/ 23 февраля 2011

У нас проблема с отдельными процессами Apache, использующими большие объемы памяти в зависимости от запроса и никогда не возвращающими ее в основную систему. Поскольку эти запросы могут происходить в любое время, со временем веб-сервер помещается в своп, что делает его безразличным даже к SSH. Хуже того, после того как запрос завершен, Python не может освободить память обратно, что приводит к тому, что процессы Apache размером 500 Мб - 1 Гб лежат без дела.

Мы выполняем очень мало запросов в секунду, но каждый запрос может быть очень тяжелым.

То, что я хотел бы сделать, - это иметь способ убить отдельного дочернего процесса apache после того, как он завершит обработку запроса, если его резидентная память превышает определенный порог. Я попробовал несколько способов сделать это внутри mod_python, но похоже, что любая форма выхода из системы приводит к тому, что ответ не завершается для клиента.

Помимо грациозности всех процессов (которых мы действительно хотим избежать) всякий раз, когда это происходит, есть ли способ сказать Apache произвольно завершить процесс после того, как он завершит обработку запроса? Все идеи приветствуются.

В качестве дополнительного предупреждения из-за устаревшей природы системы мы не можем перейти на более позднюю версию Python, поэтому мы не можем использовать улучшенную производительность памяти, равную 2,5. Точно так же мы застряли с нашей текущей ОС.

Версии: Система: Red Hat Enterprise 4

Apache: 2.0.55

Python: 2.3.5

1 Ответ

0 голосов
/ 24 февраля 2011

Я бы сказал, что даже это возможно, это будет огромный взлом (и нестабильный) - в этом случае вы должны настроить внешний процесс для apache, который будет контролировать запущенные процессы и убивать отдельный apache, когда он выходит за пределы пределов памяти / времени.

Такой скрипт можно постоянно запускать с помощью основного цикла, который выполняет свои проверки каждые несколько секунд, или даже может быть помещен в crontab для запуска каждую минуту.

Не вижу смысла пытаться сделать это изнутри самих обслуживающих процессов.

...