什么内核参数或其他设置控制可以在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 / 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) 。
这个选项解决了你的问题。