我需要配置服务器来处理超过一百万个打开的 websocket 连接(理想情况下是两百万个)。
我使用的配置来自这博文:
sysctl -w fs.file-max=12000500
sysctl -w fs.nr_open=20000500
ulimit -n 20000500
sysctl -w net.ipv4.tcp_mem='10000000 10000000 10000000'
sysctl -w net.ipv4.tcp_rmem='1024 4096 16384'
sysctl -w net.ipv4.tcp_wmem='1024 4096 16384'
sysctl -w net.core.rmem_max=16384
sysctl -w net.core.wmem_max=16384
但是,我的应用程序在达到 469219 个连接后就停止应用新连接了。我错过了什么?我真的认为操作系统配置中缺少了一些东西。我们的主要应用程序是用 Java 编写的(使用 Tomcat 服务器),但我使用 NodeJS 服务器也得到了非常类似的结果。
我们使用具有 16GB RAM 的 Ubuntu。
编辑:在峰值系统上使用14.7Gb中的大约12Gb。
更新型多巴胺:
所以我最终得到了 32GB 的工作站。通过增加 RAM 空间解决了问题。目前使用 18GB Java 堆,我能够处理 567K WS 连接。对于更高的数字,我需要更多的客户端 :-)
答案1
不一定是答案,但太大而无法发表评论。
tcp_mem (since Linux 2.4)
This is a vector of 3 integers: [low, pressure, high]. These bounds, measured in units of the system page size, are used by
TCP to track its memory usage. The defaults are calculated at boot time from the amount of available memory. (TCP can only
use low memory for this, which is limited to around 900 megabytes on 32-bit systems. 64-bit systems do not suffer this limi-
tation.)
low TCP doesnât regulate its memory allocation when the number of pages it has allocated globally is below this number.
pressure When the amount of memory allocated by TCP exceeds this number of pages, TCP moderates its memory consumption. This
memory pressure state is exited once the number of pages allocated falls below the low mark.
high The maximum number of pages, globally, that TCP will allocate. This value overrides any other limits imposed by the
kernel.
请注意以下几点:
这些界限以系统页面大小
将该值设置为10000000 10000000 10000000
意味着内核将使用 39062 MiB 内存用于 TCP。几乎是现有内存的三倍。
第二个问题是 TCP 的 3 个值rmem
,wmem
您设置了最小值、默认值和最大值。鉴于您的 tcp_mem 配置表明您永远不会进入“节省内存”模式,我猜想您实际上为每个套接字分配了 4-16k 之间的内存。
所以,如果我是内核,看到如此疯狂的设置,我可能也不会做出如此可预测的行为。
尝试将该值降低到您实际可以使用的值,然后重试。
最后,我要指出的是,如果你真的相信以下说法,那你就生活在梦幻世界中:
- 内核将轻松支持 200 万个连接。
- Node 或 java 将轻松支持 200 万个连接。
即使在最佳情况下(使用 epoll 集),epoll 集中的 200 万个条目也非常昂贵。使用 worker 或 prefork 模型永远不会发生这种情况。
您需要更均匀地分配负载。您可能至少需要另外 10 个节点才能获得用户所称的服务。