我想增加 NGINX 排队等待接受的最大连接数,为此 nginx 文档建议增加索迈斯康。
1)最小和最大限制是多少?
2)限制是否取决于系统配置,如内存、核心?
答案1
快速搜索发现,在旧内核中 net.core.somaxconn
有一个无符号的 16 位整数,因此介于 0 到 65535 之间,默认值为 128,而更高的值将被悄悄截断为 65535,但没有提及是否/何时更改以及更改为什么。
在我的内核为 3.10.0 的 CentOS 测试系统上,仍然不接受超过 65535 的值。
sysctl net.core.somaxconn=65536 sysctl: setting key "net.core.somaxconn": Invalid argument
我不知道设置较大的限制会产生什么实际影响/要求和到达。
答案2
我认为由于变量类型,您不能分配超过 65,535 的值,因此值与 C 或任何其他语言中的数据类型绑定。我同意 @HBruijn { struct socket *sock; int err, fput_needed; int somaxconn;
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock) {
somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
if ((unsigned int)backlog > somaxconn)
backlog = somaxconn;
err = security_socket_listen(sock, backlog);
if (!err)
err = sock->ops->listen(sock, backlog);
fput_light(sock->file, fput_needed);
答案3
在 Linux 4.1 中,somaxconn 限制提升至 32 位(约 20 亿)(修补)。 例如,Red Hat Enterprise Linux 8.0 允许大于 64k 的值。
但实际限制会小得多。每个未完成的套接字都会消耗内存,而接受和处理如此大量的连接也需要 CPU 和内存。