您的服务器套接字监听的连接数限制为100个。

46

我在uwsgi上运行flask应用程序。我使用supervisor来管理uwsgi进程。我发现日志中显示:

您的服务器套接字侦听队列仅限于100个连接。

如何克服100个连接的限制?我的运行脚本如下:

[program:myapp]
command=uwsgi --master -s /tmp/app.sock --module myapp:app --processes 2 -H /srv/sites/mysite chmod-socket 666 --enable-threads

1
你确定这是你需要做的吗?如果你积累了100个连接的积压,那么你必须使用至少99%的容量,然后增加限制只会给你极小的喘息空间,之后进入的连接数量将超过你可能提供的服务。更有成效的方法是找出如何更快地处理请求。 - hmakholm left over Monica
4个回答

50
请注意,"侦听队列"设置为100个连接并不意味着您的服务器只能处理100个同时(或总共)连接——这取决于配置的进程或线程数。侦听队列是一个套接字设置,告诉内核如何限制未接受连接的数量,即监听套接字的等待连接队列中未完成连接的数量。如果挂起连接的数量超过指定大小,新连接会自动被拒绝。正常运行的服务器应该不需要很大的侦听队列设置。
根据手册,您可以使用-l选项更改侦听队列的大小:
-l|--listen <num>
       set  socket  listen queue to <n> (default 100, maximum is system
       dependent)

45

使用-l--listen选项(如user4815162342所指出的)仅通过增加uwsgi的侦听队列,将其设置为大于128的值,可能会阻止uwsgi启动。Unix套接字和TCP连接侦听队列还有系统级别限制,默认值为128,需要增加。

您可以验证是否设置为:

cat /proc/sys/net/core/somaxconn

uwsgi已经进行了修复,使得如果在启动uwsgi时传递给--listen参数的值大于系统级别限制,它将导致uwsgi完全失败。如果您想将uwsgi的监听队列限制设置为大于系统级别限制的值,则必须首先增加内核的限制。可以执行以下命令来完成这个过程:

$ echo 4096 > /proc/sys/net/core/somaxconn
$ sysctl -w net.core.somaxconn=4096

要使其在重启后仍然生效,请将 net.core.somaxconn=4096 添加到 /etc/sysctl.conf 中。


9
作为之前回答中所述:
  1. 增加内核连接
  2. 也要增加uWSGI的连接数
例如,如果你正在使用dockerdocker-compose:
  1. 如何增加内核连接

docker-compose.yml文件中,在描述如何运行uWSGI的块中:

uwsgi_runner:
    <<: *app-base
    command: /usr/local/bin/uwsgi --ini /app/uwsgi.ini
    # ... other settings ...
    sysctls:
        net.core.somaxconn: 1024 # set max connections to 1024 in kernel
  1. 如何增加uWSGI中的连接数

uwsgi.ini文件中:

[uwsgi]
# ... other settings ...
listen = 1024 # set max connections to 1024 in uWSGI

此外,如果您没有使用uwsgi.ini配置文件,您可以直接在docker-compose命令中更改此参数(使用-l--listen标志):

uwsgi_runner:
    <<: *app-base
    command: /usr/local/bin/uwsgi -l 1024 #other-parameters-here

为了得到一个完美的答案,请描述一下如何增加内核连接,就像你写的那样。 - Baptiste Mille-Mathias
net.core.somaxconn: 1024设置为步骤,以增加内核中的连接,如果您的环境在Docker中运行。 - Denis Krumko
1
你好 Denis,编辑你的答案,不要在评论框中回答,谢谢 :) - Baptiste Mille-Mathias

3

您可以修改/proc/sys/net/core/somaxconn中的SOMAXCONN以增加此限制。

这只是Linux调整系统的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接