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

Apache mpm worker + wsgi Python / Django worker застряли

У нашего сервера Apache + Django есть проблема, заключающаяся в том, что рабочие застревают. Это рабочая модель mpm, и через некоторое время каждый процесс, обслуживающий несколько десятков рабочих потоков, замораживает всех своих рабочих:

# apache2ctl status
Apache Server Status for localhost

Server Version: Apache/2.2.14 (Ubuntu) mod_ssl/2.2.14 OpenSSL/0.9.8k mod_wsgi/
    2.8 Python/2.6.5
Server Built: Mar 8 2013 16:46:38

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Current Time: Friday, 05-Apr-2013 15:56:17 CEST
Restart Time: Thursday, 04-Apr-2013 11:23:23 CEST
Parent Server Generation: 11
Server uptime: 1 day 4 hours 32 minutes 53 seconds
Total accesses: 244313 - Total Traffic: 4.7 GB
CPU Usage: u181.45 s33.97 cu.62 cs0 - .21% CPU load
2.38 requests/sec - 47.9 kB/second - 20.2 kB/request
108 requests currently being processed, 42 idle workers

_K__K______KK_____W_________W________K_K__________..............
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW..............
................................................................
................................................................
................................................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

При выполнении apache2ctl fullstatus, вы можете видеть, что это ровно два PID, у которых все рабочие процессы находятся в "рабочем" состоянии. В настоящее время PID 822 и 5284. И эти процессы не обслуживают никаких функциональных запросов. Кроме того, их можно убить только сигналом 9 (kill -9)

Опция WSGIDaemonProcess cpu-time-limit=120/120 не поможет нам по двум причинам: он есть только в WSGI версии 3.0 и выше, плюс процессы не потребляют ресурсы ЦП, поэтому время ЦП у них мало.

Мы наблюдаем некоторую медленную работу сервера. Это не очень медленно, но может быть быстрее (иногда зависает при запросах), и я подозреваю, что эта проблема связана с этим. В любом случае, этого не должно быть.

Это сервер Ubuntu 10.04 LTS с Apache 2.2.14 и libapache2-mod-wsgi 2.8-2ubuntu1. Сайты обслуживаются так:

WSGIScriptAlias / /srv/http/bla/passenger_wsgi.py

Это рабочая конфигурация:

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      50
    MaxClients           200
    ServerLimit          6
    MaxRequestsPerChild  1000
</IfModule>

Есть идеи, что это такое и как его решить? Или, по крайней мере, как установить автоматическое уничтожение этих процессов? Ulimit - это сложно, потому что они не потребляют много ЦП.

Ваши настройки MPM для начала немного нарушены по разным причинам. Предлагаю вам посмотреть мой доклад с PyCon по адресу:

Что касается зависания вашего сервера, у вас, вероятно, используется сторонний модуль расширения, который небезопасно использовать из вспомогательного интерпретатора. Вам нужно заставить ваше приложение запускаться в основном интерпретаторе. Видеть:

Чтобы выяснить, где зависают процессы, также ознакомьтесь со способами получения трассировки стека, как описано в:

Если это тупик, как и ожидалось, и вы не хотите просто пытаться использовать основной интерпретатор, вероятно, потребуется использовать gdb, чтобы получить трассировку стека, где он застрял.

Подход с трассировкой стека Python будет работать, если проблема в том, что ваш код блокирует вызовы внешних служб. Вы также можете получить представление об этом, просмотрев дескрипторы открытых файлов с помощью lsof или ofiles.

я починил это некоторое время назад, преобразовав сайты в режим демона вместо встроенного режима и поместив перед ним прокси-сервер nginx, который обрабатывает все статические файлы.