it-swarm.cn

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

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

我注意到在使用 ab 对Apache服务器进行负载测试时,最大化服务器上​​的打开连接非常容易。如果不使用ab的-k选项(该选项允许连接重用)并发送大约10,000个请求,则Apache会处理大约11,000个左右的请求,然后暂停60秒钟。查看netstat输出显示TIME_WAIT状态下有11,000个连接。显然,这很正常。即使客户端出于 TCP可靠性原因 完成连接后,连接仍默认打开60秒。

看来这是一种对服务器进行DoS的简便方法,我想知道通常的调整和预防措施是什么。

这是我的测试输出:

# 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

这是我在测试期间运行的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
91
Ben Williams

我终于找到了真正限制连接数量的设置:net.ipv4.netfilter.ip_conntrack_max。设置为11,776,无论将其设置为多少,我都可以在测试中等待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来实现。我想一旦内核离开本地端口,它就会开始回收连接。这使用了更多的内存跟踪连接,但似乎比打开tcp_tw_recycle更好,因为文档暗示这很危险。

使用此配置,我可以整天运行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设置对我的测试没有任何影响,我也不知道为什么。我认为一旦有8192个连接,它将以TIME_WAIT状态关闭连接,但它对我没有作用。

66
Ben Williams

您真的很想看看/ proc文件系统在这方面可以为您提供什么。

在最后一页上,您可能会发现您感兴趣的内容:

  • / proc/sys/net/ipv4/tcp_max_orphans ,它控制系统所拥有的最大套接字数量not附加到某物上。进行此设置可能会消耗多达64kbyte的不可交换内存每个孤立套接字
  • / proc/sys/net/ipv4/tcp_Orphan_retries ,它控制孤立和关闭套接字之前的重试次数。 在该页面上有一个关于Web服务器的特别说明让您直接感兴趣...
24
Avery Payne

我认为没有直接将其设置的可调参数。这属于TCP/IP调整类别。要找出可以调整的内容,请尝试使用“ man 7 tcp”。 sysctl('man 8 sysctl')用于设置这些。 'sysctl -a | grep tcp”将向您显示您可以调整的大部分内容,但是我不确定是否会显示所有这些内容。另外,除非更改,否则打开的TCP/IP套接字看起来像文件描述符。所以 this ,该链接的下一部分可能是您想要的。

3
Kyle Brandt

尝试设置以下内容以及设置tcp_fin_timeout。这样可以更快地关闭TIME_WAIT。

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
2
Jauder Ho

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

另外,您需要添加一个选项,以允许运行Apache的帐户加载更多打开的文件描述符-以前的注释未能指出这一点。

请注意您的工作程序设置以及Apache本身内部有哪些类型的keepalive超时,一次运行多少个备用服务器以及这些多余的进程被杀死的速度。

2
rasjani

您可以减少在TIME_WAIT状态下花费的时间(设置net.ipv4.tcp_fin_timeout)。您可以用YAWS或nginx或类似的东西替换Apache。

更多连接的折衷通常涉及内存使用情况,如果您有派生进程,则许多子进程会淹没您的CPU。

1
Devdas

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

此选项解决了您的问题。

0
Dzwiedziu-nkg

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

0
Jason Tan