当所有线程繁忙时,UWSGI 会阻止传入连接

当所有线程繁忙时,UWSGI 会阻止传入连接

我有一个简单的 UWSGI 应用程序,它位于 LB 后面,具有以下 .ini 配置

[uwsgi]
socket=0.0.0.0:5071
chdir = src/
wsgi-file = uwsgi.py
processes=2
threads=1
protocol=http
plugins=python
exit-on-reload=false
master=true
# Cleanup of temp files
vacuum = true    

当所有2x1线程都忙时,应用程序继续服务通过对传入的连接进行排队,等待线程释放。

对我来说,这是一种不受欢迎的行为,因为我希望 UWSGI 返回 5xx 状态代码,这样我就不会过度饱和单个发行版的资源。

客户端测试代码

附加 UWSGI 应用程序的测试客户端代码

proxy = {
    'http':'http://localhost:5071'
}

@threaded
def f():
    print('Sending request')
    response = requests.get('http://dummy.site',proxies=proxy)
    print(str(response.status_code )+ response.text)

for i in range(5):
    f()

测试 (1)

添加listen = 2到.ini 并同时触发 3 个请求只会打印:

*** uWSGI listen queue of socket "0.0.0.0:5071" (fd: 3) full !!! (3/2) ***

而第三个连接似乎仍然以某种方式被接受,排队并随后执行,而不是5xx引发错误。

测试(2)

添加listen = 0到 .ini 并同时触发 5 个请求只会一次执行两个请求。完整队列输出不再显示。不知何故,当线程被释放时,请求仍然在某处排队并执行。

当所有线程都忙时,如何阻止传入到 UWSGI 应用程序的连接?

答案1

这是一个非常奇怪的要求,但如果你真的想这样做,你可以尝试减少监听队列(归零),即--listen 0。我还没有测试过,也不知道零是否被视为有效值。这通常是增加因为网站的流量在增加,而不是减少。

相关内容