什么限制了Linux服务器上的最大连接数?

什么内核参数或其他设置控制可以在Linux服务器上打开的最大TCP套接字数量? 允许更多连接的权衡是什么?

我注意到,当使用ab加载testingApache服务器时,很容易使服务器上的打开连接最大化。 如果离开ab的-k选项,允许连接重用,并且发送超过大约10,000个请求,那么Apache服务于前11,000个请求,然后停止60秒。 查看netstat输出,在TIME_WAIT状态下显示11,000个连接。 显然,这是正常的。 即使在客户端完成TCP连接可靠性原因之后,连接仍保持打开默认状态60秒。

看起来这将是一个简单的方法来做一个服务器,我想知道通常的调音和预防措施是什么。

这是我的testing结果:

# ab -c 5 -n 50000 http://localhost/ This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright 2006 The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 5000 requests Completed 10000 requests apr_poll: The timeout specified has expired (70007) Total of 11655 requests completed 

这是我在testing中运行的netstat命令:

  # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 11651 tcp 0 0 localhost:www TIME_WAIT - 1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab 1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab 1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab 1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab 1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab 

    我终于find了真正限制连接数量的设置: net.ipv4.netfilter.ip_conntrack_max 。 这被设置为11776,而我设置的任何内容都是我可以在我的testing中服务的请求数量,在等待tcp_fin_timeout秒以等待更多连接可用之前。 conntrack表是内核用来跟踪连接状态的内容,所以一旦内容被填满,内核就开始丢弃数据包并将其打印在日志中:

     Jun 2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet. 

    下一步是让内核回收处于TIME_WAIT状态的所有连接,而不是丢弃数据包。 我可以通过打开tcp_tw_recycle或将ip_conntrack_max增加到大于ip_local_port_range连接的本地端口数量来ip_local_port_range 。 我猜想一旦内核不在本地端口,它就开始回收连接。 这使用更多的内存跟踪连接,但似乎比打开tcp_tw_recycle更好的解决scheme,因为文档暗示这是危险的。

    有了这个configuration,我可以运行ab一整天,永远不会用完连接:

     net.ipv4.netfilter.ip_conntrack_max = 32768 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_orphan_retries = 1 net.ipv4.tcp_fin_timeout = 25 net.ipv4.tcp_max_orphans = 8192 net.ipv4.ip_local_port_range = 32768 61000 

    tcp_max_orphans设置对我的testing没有任何影响,我不知道为什么。 我想这会在TIME_WAIT状态下closures连接,一旦有8192个连接但是它不会为我做。

    你真的想看看/ proc文件系统在这方面提供了什么。

    • 美国能源部TCP调整指南
    • TCP调整不同操作系统的参数:
    • IBM的“即时pipe理Linux”
    • LinuxInsight.com上的文档vis-a-vis / proc / sys / net / ipv4

    在最后一页,您可能会发现以下内容对您有利:

    • / proc / sys / net / ipv4 / tcp_max_orphans ,它控制系统持有的最大套接字数量。 提高这个可以消耗多达64k字节的不可插拔内存每个孤立的sockets
    • / proc / sys / net / ipv4 / tcp_orphan_retries ,它控制套接字孤立和closures之前的重试次数。 在那个网页上有一个特别的说明,它对你有直接的兴趣。

    我不认为有一个可调的设置,直接。 这属于TCP / IP调优的范畴。 要找出你能调整的东西,试试'man 7 tcp'。 sysctl('man 8 sysctl')用来设置这些。 'sysctl -a | grep tcp'会显示你可以调整的大部分内容,但我不确定是否会显示所有的内容。 另外,除非这个改变,TCP / IP套接字打开看起来像文件描述符。 所以这和下一节中的链接可能是你在找什么。

    尝试设置以下以及设置tcp_fin_timeout。 这应该更快地closuresTIME_WAIT。

     net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 

    apache(1)预先定义的库存仅支持250个并发连接 – 如果需要更多,则需要修改一个头文件以允许更多的并发会话。 我不知道Apache 2是否仍然如此。

    此外,您还需要添加一个选项,以允许运行Apache的帐户载入更多打开的文件描述符,这是以前的注释无法指出的。

    注意你的工作者设置以及你在Apache内部存在什么样的keepalive超时,你一次运行多less个备用的服务器,以及这些额外的进程被杀的速度有多快。

    您可以减lessTIME_WAIT状态所花费的时间(Set net.ipv4.tcp_fin_timeout)。 你可以用YAWS或nginx或类似的东西replaceApache。

    权衡更多的连接通常涉及内存使用情况,如果你有一个分叉进程,大量的subprocess淹没你的CPU。

    可以在一个IP地址上打开的套接字的绝对数量是2 ^ 16,由TCP / UDP定义,而不是内核。

    2.4版本中的Apache HTTP服务器基准testing工具ab具有-s超时选项。 另请参阅ab(Apache Bench)错误:apr_poll:在Windows上指定的超时已过期(70007)

    这个选项解决了你的问题。