【问题标题】:why I don't see processes of mod_wsgi为什么我看不到 mod_wsgi 的进程
【发布时间】:2014-07-11 07:26:26
【问题描述】:

我有一个 wsgi 应用程序配置如下:

WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess myapp user=myuser threads=10 maximum-requests=10000
WSGIScriptAlias / /usr/local/myapp/wsgi.py
WSGIProcessGroup myapp

我希望看到我的应用程序正在运行的进程...但是使用 ps auxpstree 我看不到子进程:

init─┬─apache2─┬─apache2
     │         ├─2*[apache2───26*[{apache2}]]
     │         ├─apache2───14*[{apache2}]
     │         ├─apache2───12*[{apache2}]
     │         └─apache2───16*[{apache2}]

我的 wsgi 是否在守护程序模式下执行?如何检查我的 python 进程的健康状况?

我正在尝试调试我的 wsgi python 应用程序,当同时请求大量连接时(例如:来自单个网页的 30 个连续 ajax 请求),该应用程序挂起(有时出现内存故障)。

【问题讨论】:

  • 尝试添加显示名称,例如WSGIDaemonProcess myapp processes=24 threads=4 display-name=%{GROUP}
  • 我也不确定 mod_wsgi 是否提供 Python 线程转储,这对于检查挂起的 Web 应用程序问题非常方便。我切换到支持此功能的 UWSGI:uwsgi-docs.readthedocs.org/en/latest/Tracebacker.html
  • 最新的 mod_wsgi 版本将在进程因请求超时而关闭时尝试转储 Python 线程。
  • 我有 mod-wsgi 版本 3.3-4build1。我认为它是 debian-stable 版本。
  • 当时mod_wsgi的最新版本是4.2.5。所以你有点落后了。

标签: python django mod-wsgi


【解决方案1】:

为了完整起见,我将扩展 Mikko Ohtamaa 的评论。

mod_wsgi 进程名称确实采用了父进程的名称,例如。 /usr/sbin/apache2 -k start 取决于发行版等。

使用display-name 选项允许我们设置不同的进程名称:

当使用ps 命令列出进程时,为守护进程定义一个不同的名称。如果值为%{GROUP},则名称将为(wsgi:group),其中组替换为守护进程组的名称。

请注意,所提供值的字符数只能显示为执行进程的 argv0 最初占用的字符数。超出此范围的任何内容都将被截断。

此功能可能无法在所有平台上如所述那样工作。通常它还需要具有 BSD 传统的 ps 程序。因此,在某些版本的 Solaris UNIX 上,/usr/bin/ps 程序不起作用,但 /usr/ucb/ps 可以。其他可以显示该值的程序包括htop

Reference.

例子:

WSGIDaemonProcess myapp user=myuser threads=10 maximum-requests=10000 display-name=django-myapp
WSGIScriptAlias / /usr/local/myapp/wsgi.py
WSGIProcessGroup myapp

然后:

ps aux | grep django-myapp

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多