【问题标题】:Too many uwsgi threads running运行的 uwsgi 线程过多
【发布时间】:2016-05-07 01:29:16
【问题描述】:

早上好,

我是网络服务器基础架构和管理的新手。我尝试使用 nginx + uwsgi + django 和 python 安装的网络服务器存在以下问题:每次刷新或请求用户正在执行的网页时,uwsgi 都会创建 2-3 个永不终止的新线程。几天后,我的线程数超过了 30000,我不得不重新加载 uwsgi 以保持网页的性能。

要检查线程数,我使用以下命令: ps - eLf | grep uwsgi(你可以看到附件的结果)。

我的uwsgi配置如下:

[uwsgi]

vhost = true

socket = /tmp/mySocket.sock

master = true

processes = 4

max_request =  300

vacuum = true

die-on-term = true

close-on-exec = true

harakiri = 30

wsgi-file = /home/virtualEnv/server/wsgi.py

virtualenv = /home/virtualEnv

pythonpath = /home/virtualEnv/myServer

chdir=/home/virtualEnv/myServer

pidfile=/tmp/myFile.pid

daemonize = /var/log/uwsgi/uwsgi-@(exec://date +%%Y-%%m-%%d).log

log-reopen = true

chmod-socket = 664

gid = www-data

uid = www-data

我的 uwsgi.py 文件如下:

import os
import sys

path = ‘/home/virtualEnv/myServer'
if path not in sys.path:
   sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'myServer.settings'

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

而我的 /etc/init/uwsgi.conf 文件是:

description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec uwsgi --emperor /etc/uwsgi/vassals/ --wsgi-file /home/virtualEnv/server/wsgi.py

我尝试过使用带和不带线程的 uwsgi,带和不带 --thunder-lock 但没有真正改变。

编辑:

清理 uwsgi.ini 文件后,我仍然遇到同样的问题。文件的当前配置是:

uwsgi.ini:

[uwsgi]
socket = /tmp/mySocket.sock
master = true
processes = 4
max_request =  3
vacuum = true
die-on-term = true
close-on-exec = true
harakiri = 30
wsgi-file = /home/virtualEnv/server/wsgi.py
virtualenv = /home/virtualEnv
pythonpath = /home/virtualEnv/myServer
chdir=/home/virtualEnv/myServer
pidfile=/tmp/myFile.pid
logger = file:/var/log/uwsgi/uwsgi-@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
chmod-socket = 664
gid = www-data
uid = www-data

uwsgi.conf

description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec uwsgi --emperor /etc/uwsgi/vassals/

nginx.conf:

user www-data;
worker_processes auto;
worker_rlimit_nofile 10000;
pid /run/nginx.pid;
events {
worker_connections 10000;
multi_accept on;
use epoll;
}

http {
server_tokens off;
resolver 8.8.8.8;
map $http_accept_language $lang {
default en;
~*en en;
~*pt pt;
~*fr fr;
~*it it;
~*es es;
~*ru ru;
~*ro ro;}
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 10m;
large_client_header_buffers 2 1k;
client_body_timeout 12;
client_header_timeout 12;
keepalive_requests 100;
send_timeout 10;
open_file_cache max=2500 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
sendfile off;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 5000;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
charset UTF-8;
gzip on;
gzip_http_version 1.0;
gzip_vary on;
gzip_static on;
gzip_disable ""msie6"";
gzip_min_length 256;
gzip_comp_level 1;
gzip_buffers 4 32k;
gzip_proxied any;
gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}"

【问题讨论】:

  • 我也遇到了同样的问题,请问您找到解决方法了吗?
  • 除了在必要时优雅地重新加载工作人员之外,我还没有找到解决方案。

标签: python django multithreading nginx uwsgi


【解决方案1】:

你正在启动 uWSGI Emperor,所以你不应该直接将 wsgi-file 传递给它。从 uwsgi.conf 文件中删除该参数。

当使用 Emperor 时,你不应该守护你的 uWSGI 实例,因为 Emperor 会失去与它的连接,这可能会导致在每个请求上产生新的实例(Emperor 不知道有一些实例,因为它们已经守护所以它会产生一个新的来处理请求)。你应该从你的 uWSGI 配置中删除 daemonize

此外,不应该在明确指向 wsgi 文件时使用 vhost。如果您不知道此参数的作用或认为您不需要它,请将其删除。

更改后,您的文件应如下所示:

uwsgi.ini 文件:

[uwsgi]


socket = /tmp/mySocket.sock
master = true
processes = 4
max_request =  300
vacuum = true
die-on-term = true
close-on-exec = true
harakiri = 30
wsgi-file = /home/virtualEnv/server/wsgi.py
virtualenv = /home/virtualEnv
pythonpath = /home/virtualEnv/myServer
chdir=/home/virtualEnv/myServer
pidfile=/tmp/myFile.pid
log-reopen = true
chmod-socket = 664

gid = www-data
uid = www-data

uwsgi.conf 文件:

description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec uwsgi --emperor /etc/uwsgi/vassals/

wsgi.py 文件不会改变。

如果您想从 uwsgi 服务器获取日志文件,请使用:

logger                  = file:/var/log/uwsgi/uwsgi-@(exec://date +%%Y-%%m-%%d).log

而不是daemonize

【讨论】:

  • 非常感谢您的回复。我已经尝试了您建议的配置,但问题似乎仍然存在。工人似乎从未被重新加载。例如,如果我将 max_request 值设置为 5,是否应该在服务了 5 个请求后重新加载工作人员?
  • 请在我提到的更改后显示您的 nginx 配置和 uWSGI 配置
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 2018-04-06
  • 2012-07-28
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多