【问题标题】:uWSGI spawning too many threadsuWSGI 产生太多线程
【发布时间】:2018-07-05 15:30:44
【问题描述】:

uwsgi spawning more processes than expected 类似,但由于那个问题没有得到答复,而且我没有足够的声望在那里提问,所以再次旋转这个问题。这个 (UWSGI killing workers too fast) 也可能是相关的。


我的情况:我有一个烧瓶应用程序,uWSGI 和 nginx。我的 uWSGI 配置的非 systemd 执行很有魅力。当我使用 Emperor 启动 uWSGI 时,我看到一个进程正在运行。当我将.ini 文件添加到 vassals 位置时,事情会爆炸,启动和杀死进程的速度如此之快,以至于 CPU 的使用率达到 100%,而我正在处理的 VM 崩溃了。 .ini 文件的内容是什么似乎并不重要(尝试了一个空文件)。


/some/nfs/share/workers/conf

PYTHONPATH=/some/nfs/share/production/repo
PATH=/some/nfs/share/production/bin:/sbin:/bin:/usr/sbin:/usr/bin
UWSGI_BIN=/some/nfs/share/production/bin/uwsgi
UWSGI_INI=/some/nfs/share/workers/emperor.ini

帝王服务

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
User=myuser
Group=mygroup

EnvironmentFile=/some/nfs/share/workers/conf

ExecStart=/bin/sh -c '${UWSGI_BIN} --ini ${UWSGI_INI}'

RuntimeDirectory=uwsgi

RestartSec=5
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

皇帝.ini

[uwsgi]
emperor = /some/nfs/share/uwsgi/

uid = myuser
gid = mygroup

实际服务.ini

[uwsgi]
wsgi-file = /some/nfs/share/production/repo/app/main.py
callable = create_app

# load some variables
for-readline = /some/nfs/share/workers/conf
  env = %(_)
endfor =

plugins = python

wsgi-disable-file-wrapper = true

socket = /some/nfs/share/workers/uwsgi/%n.sock
pidfile = /some/nfs/share/workers/uwsgi/%n.pid

chmod-socket = 664
vacuum = true
die-on-term = true
close-on-exec = true

我尝试了另一个虚拟服务.ini 文件,这会导致同样的问题(是的,它是空的):

[uwsgi]

如果我将日志记录添加到 emepror.ini,我会得到:

皇帝.ini

[uwsgi]
emperor = /some/nfs/share/uwsgi/

uid = myuser
gid = evfold

logger = file:/some/nfs/share/uwsgi/emperor.log

反过来,这将产生两个进程而不是一个:

● emperor.service - uWSGI Emperor
   Loaded: loaded (/etc/systemd/system/emperor.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-07-05 11:09:40 EDT; 2min 7s ago
 Main PID: 19777 (uwsgi)
   Status: "The Emperor is governing 0 vassals"
   CGroup: /system.slice/emperor.service
           ├─19777 /some/nfs/share/production/bin/uwsgi --ini /some/nfs/share/workers/emperor.ini
           └─19778 /some/nfs/share/production/bin/uwsgi --ini /some/nfs/share/workers/emperor.ini

Jul 05 11:09:40 backend systemd[1]: Starting uWSGI Emperor...
Jul 05 11:09:40 backend sh[19777]: [uWSGI] getting INI configuration from /some/nfs/share/workers/emperor.ini
Jul 05 11:09:40 backend sh[19777]: [uWSGI] getting INI configuration from /some/nfs/share/workers/emperor.ini
Jul 05 11:09:40 backend systemd[1]: Started uWSGI Emperor.

这是迄今为止的日志文件(请注意,所有内容都是重复的,很可能是因为记录器实例是独立的:

*** Starting uWSGI 2.0.16 (64bit) on [Thu Jul  5 11:09:40 2018] ***
*** Starting uWSGI 2.0.16 (64bit) on [Thu Jul  5 11:09:40 2018] ***
compiled with version: 4.8.2 20140120 (Red Hat 4.8.2-15) on 12 February 2018 22:16:17
compiled with version: 4.8.2 20140120 (Red Hat 4.8.2-15) on 12 February 2018 22:16:17
os: Linux-3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015
os: Linux-3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015
nodename: backend
nodename: backend
machine: x86_64
machine: x86_64
clock source: unix
clock source: unix
pcre jit disabled
pcre jit disabled
detected number of CPU cores: 4
detected number of CPU cores: 4
current working directory: /
current working directory: /
detected binary path: /some/nfs/share/production/bin/uwsgi
detected binary path: /some/nfs/share/production/bin/uwsgi
dropping root privileges as early as possible
dropping root privileges as early as possible
your processes number limit is 31212
your processes number limit is 31212
your memory page size is 4096 bytes
your memory page size is 4096 bytes
detected max file descriptor number: 1024
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
thunder lock: disabled (you can enable it with --thunder-lock)
*** starting uWSGI Emperor ***
*** starting uWSGI Emperor ***
dropping root privileges after socket binding
dropping root privileges after socket binding
Python version: 3.5.4 |Continuum Analytics, Inc.| (default, Aug 14 2017, 13:26:58)  [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
Python version: 3.5.4 |Continuum Analytics, Inc.| (default, Aug 14 2017, 13:26:58)  [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1cf2180
Python main interpreter initialized at 0x1cf2180
dropping root privileges after plugin initialization
dropping root privileges after plugin initialization
your mercy for graceful operations on workers is 60 seconds
your mercy for graceful operations on workers is 60 seconds
*** Operational MODE: no-workers ***
*** Operational MODE: no-workers ***
dropping root privileges after application loading
dropping root privileges after application loading
spawned uWSGI master process (pid: 19777)
spawned uWSGI master process (pid: 19777)

如果我在 vassals 文件夹中添加 production.ini,我会得到以下日志:

*** has_emperor mode detected (fd: 10) ***
*** has_emperor mode detected (fd: 10) ***
[uWSGI] getting INI configuration from /some/nfs/share/workers/emperor.ini
[uWSGI] getting INI configuration from /some/nfs/share/workers/emperor.ini
[uWSGI] getting INI configuration from production.ini
[uWSGI] getting INI configuration from production.ini
open("./python_plugin.so"): No such file or directory [core/utils.c line 3713]
open("./python_plugin.so"): No such file or directory [core/utils.c line 3713]
!!! UNABLE to load uWSGI plugin: ./python_plugin.so: cannot open shared object file: No such file or directory !!!
!!! UNABLE to load uWSGI plugin: ./python_plugin.so: cannot open shared object file: No such file or directory !!!
Thu Jul  5 11:22:29 2018 - [emperor] vassal production.ini is now loyal
Thu Jul  5 11:22:29 2018 - [emperor] vassal production.ini is now loyal

python_plugin 错误似乎不会以任何特定方式影响执行,我可以从.ini 文件中删除plugins = python,这不会有太大变化。

在这个阶段,有 50 多个工人与上面的 uWSGI 工人相关联,并且机器完全没有响应。

任何帮助表示赞赏:)


编辑:我能够在没有记录的情况下隔离 Emperor.service 一次,并且使用 vassals 中的 production.ini 文件,它看起来像这样(相反,我假设容器应该是嵌套在那边的主PID里面?)

● emperor.service - uWSGI Emperor
   Loaded: loaded (/etc/systemd/system/emperor.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-07-05 12:01:57 EDT; 12min ago
 Main PID: 25432 (uwsgi)
   Status: "The Emperor is governing 1 vassals"
   CGroup: /system.slice/emperor.service
           ├─25432 /some/nfs/share/production/bin/uwsgi --ini /some/nfs/share/workers/emperor.ini
           ├─25960 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25961 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25962 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25963 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25964 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25965 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25966 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25967 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25968 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25969 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25970 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25971 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25972 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25973 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25974 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25975 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25976 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25977 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25978 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25979 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25980 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25981 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25982 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25983 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25984 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25985 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25986 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25987 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25988 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25989 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25990 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25991 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25992 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25993 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25994 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25995 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25996 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25997 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25998 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─25999 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26000 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26001 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26002 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26003 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26004 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26005 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26006 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26007 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26008 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26014 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26015 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26030 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26035 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26037 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26038 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26039 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26040 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26044 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26045 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26048 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26049 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26051 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26052 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26054 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26055 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26056 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26057 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26059 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26062 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26063 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26064 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26065 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26066 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26068 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26069 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26070 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26071 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26074 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26075 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26076 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26078 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26080 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26081 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26083 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26084 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26086 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26088 /some/nfs/share/production/bin/uwsgi --ini production.ini
           ├─26090 /some/nfs/share/production/bin/uwsgi --ini production.ini
           └─26091 /some/nfs/share/production/bin/uwsgi --ini production.ini

Jul 05 12:14:29 backend uwsgi[25432]: *** Starting uWSGI 2.0.16 (64bit) on [Thu Jul  5 12:14:29 2018] ***
Jul 05 12:14:29 backend uwsgi[25432]: compiled with version: 4.8.2 20140120 (Red Hat 4.8.2-15) on 12 February 2018 22:16:17
Jul 05 12:14:29 backend uwsgi[25432]: os: Linux-3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015
Jul 05 12:14:29 backend uwsgi[25432]: nodename: backend
Jul 05 12:14:29 backend uwsgi[25432]: machine: x86_64
Jul 05 12:14:29 backend uwsgi[25432]: clock source: unix
Jul 05 12:14:29 backend uwsgi[25432]: pcre jit disabled
Jul 05 12:14:29 backend uwsgi[25432]: detected number of CPU cores: 4
Jul 05 12:14:29 backend uwsgi[25432]: current working directory: /some/nfs/share/production/bin/workers/uwsgi
Jul 05 12:14:29 backend uwsgi[25432]: writing pidfile to /some/nfs/share/production/bin/workers/uwsgi/production.pid

【问题讨论】:

    标签: python uwsgi systemd


    【解决方案1】:

    想通了:

    如果您通过 systemctl 运行 uWSGI,包括使用 --ini 指令的 Emperor 文件将被解释为实际上是服务的 ini。将命令放入ExecStart的正确方法是:

    ExecStart=/bin/sh -c '${UWSGI_BIN} --emperor ${UWSGI_INI}'
    

    其中UWSGI_BIN 是二进制文件的位置,UWSGI_INI 是代表服务的.ini 文件所在的位置。

    我想如果我想设置任何皇帝配置标志,这些应该放在ExecStart 中。这有点不幸,但显然情况就是这样。

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2016-05-07
      • 2017-07-19
      • 2021-01-08
      相关资源
      最近更新 更多