哪些内核参数或其他设置控制可在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


#1 楼

我终于找到了真正限制连接数量的设置: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更好的解决方案,因为文档暗示这很危险。

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状态的连接,但这对我没有帮助。

评论


我们在哪里配置这些参数?

– Codevalley
2011年11月11日9:28

@Codevalley可能与系统有关,但是在Ubuntu Server上,它们位于/etc/sysctl.conf中

–本·威廉姆斯
2011年11月11日18:46

#2 楼

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


美国能源部的TCP调整指南
不同参数的TCP调整参数操作系统:es
IBM的“即时管理Linux”
LinuxInsight.com上的文档相对于/ proc / sys / net / ipv4

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



/ proc / sys / net / ipv4 / tcp_max_orphans,它控制系统所拥有的最大套接字数不依附于某物。升高此容量可能会占用每个孤立套接字多达64kbyte的不可交换内存。

/ proc / sys / net / ipv4 / tcp_orphan_retries,它控制孤立和关闭套接字之前的重试次数。该页面上有关于Web服务器的特定注释,您直接感兴趣...



评论


tcp_max_orphans很有趣,但似乎无法正常工作。当我在测试期间尝试测量孤立的套接字时,我看到其中有11651个,而tcp_max_orphans是8092个。 #netstat --inet -p | grep“ localhost:www” | sed -e's / \ + / / g'|切-d''-f 1-4,6-7 |排序uniq -c 11651 tcp 0 0本地主机:www TIME_WAIT-

–本·威廉姆斯
09年5月21日在19:27

查看tcp_orphan_retries设置-想法是,套接字“被淘汰”的速度更快...

–艾琳·佩恩(Avery Payne)
09年5月21日在19:39

@Jauder Ho的建议+ tcp_orphan_retries听起来很适合您的情况。

–艾琳·佩恩(Avery Payne)
09年5月21日在19:41

#3 楼

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

#4 楼

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

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


评论


小心点!经历过艰辛的路。 “这可能会导致带有负载平衡和NAT的帧丢失,仅将其用于仅通过本地网络进行通信的服务器。” -wiki.archlinux.org/index.php/Sysctl

–汉克
2011年8月9日在13:23

@Henk我猜这是tcp_tw_recycle潜在的危险。 tcp_tw_reuse更安全,我看不到同时使用它们的任何理由。

–弗拉迪斯拉夫·拉斯特鲁斯尼
2012年3月17日在9:36

#5 楼

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

此外,您需要添加一个选项,以允许运行Apache的帐户加载更多打开的文件描述符-前面的评论不能指出。

请注意您的工作程序设置以及Apache本身内部有哪些keepalive超时,一次运行的备用服务器数量以及这些额外进程的运行速度如何被杀。

#6 楼

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

更多连接的权衡通常涉及内存。用法,如果您有派生进程,那么很多子进程会淹没您的CPU。

评论


tcp_fin_timeout不是用于设置TIME-WAIT到期时间,该时间在重建内核之外不可更改,而是用于FIN,顾名思义。

–亚历山大·库里林(Alexandr Kurilin)
2015年10月29日在18:28

#7 楼

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

评论


不,不是。您可以打开更多,因为只要远程地址不同,本地端口就不必唯一。此外,OP表示每个服务器,每个服务器的地址可以大于1。

– MarkR
09-09-4 22:13

#8 楼

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

此选项解决了您的问题。