net.core.somaxconn 的上限是多少?

net.core.somaxconn 的上限是多少?

我想增加 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 和内存。

相关内容