为什么我的Web服务器在高负载下使用TCP重置断开连接?


10

我在Nginx上安装了小型VPS。我想从中获得尽可能多的性能,因此我一直在尝试优化和负载测试。

我正在使用Blitz.io通过获取一个小的静态文本文件来进行负载测试,并遇到一个奇怪的问题:一旦同时连接的数量达到2000个左右,服务器似乎就在发送TCP重置。数量很多,但是通过使用htop,服务器仍然有大量余下的CPU时间和内存,因此,我想弄清楚这个问题的根源,看看是否可以进一步解决。

我在2GB Linode VPS上运行Ubuntu 14.04 LTS(64位)。

我的信誉不足,无法直接发布此图,因此,这里是Blitz.io图的链接:

在此处输入图片说明

我已尝试执行以下操作来找出问题的根源:

  • Nginx配置值worker_rlimit_nofile设置为8192
  • nofile设置为64000为硬性和软性限制rootwww-data用户(什么nginx的运行为)/etc/security/limits.conf
  • 没有迹象表明出了什么问题/var/log/nginx.d/error.log(通常,如果您遇到文件描述符限制,nginx会显示错误消息,这样)

  • 我有ufw设置,但没有速率限制规则。ufw日志表明没有任何内容被阻止,并且我尝试禁用ufw,结果相同。

  • 中没有指示性错误 /var/log/kern.log
  • 中没有指示性错误 /var/log/syslog
  • 我将以下值添加到/etc/sysctl.conf并且加载了它们sysctl -p,但没有任何效果:

    net.ipv4.tcp_max_syn_backlog = 1024
    net.core.somaxconn = 1024
    net.core.netdev_max_backlog = 2000
    

有任何想法吗?

编辑:我做了一个新的测试,在一个非常小的文件(只有3个字节)上增加了3000个连接。这是Blitz.io图:

Blitz.io图

同样,根据Blitz的说法,所有这些错误都是“ TCP连接重置”错误。

这是Linode带宽图。请记住,这是5分钟的平均值,因此它的低通滤波了一下(瞬时带宽可能更高),但是,这没什么:

在此处输入图片说明

中央处理器:

在此处输入图片说明

输入/输出:

在此处输入图片说明

这里是htop附近的测试结束: 停止

我还使用tcpdump在另一个(但外观类似)测试中捕获了一些流量,并在开始出现错误时开始捕获: sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

如果有人想看一下,这里是文件(〜20MB):https : //drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view ?usp =sharing

这是Wireshark的带宽图:

在此处输入图片说明 (行是所有数据包,蓝色条是TCP错误)

根据我对捕获的解释(我也不是专家),TCP RST标志似乎来自负载测试源,而不是服务器。因此,假设负载测试服务方面没有问题,可以安全地假设这是负载测试服务与服务器之间某种网络管理或DDOS缓解的结果吗?

谢谢!


您的提供商是否正在采取某种DDoS缓解措施?这可能会干扰您的测试。
迈克尔·汉普顿

@MichaelHampton我可以肯定Linode不会那样做。
EEAA 2015年

您可以从Linode控制面板发布网络图吗?此测试实际占用多少带宽?
EEAA 2015年

我做了一些调查,并用更多的信息更新了原始帖子。我还与Linode确认他们没有执行DDOS缓解措施,尽管这并不一定意味着负载测试服务和Linode之间的网络提供商没有采取任何措施。谢谢!
埃里克·斯旺

1
有没有理由只设置net.core.netdev_max_backlog2000个?我见过几个示例,它使千兆位(和10Gig)连接的数量级提高了一个数量级。
Moshe Katz

Answers:


1

可能有许多连接重置源。负载测试器可能不在可用的临时端口中,无法从这些临时端口发起连接,沿途的设备(例如执行NAT的防火墙)可能已耗尽其NAT池,并且无法为该连接提供源端口您的负载均衡器或防火墙可能已达到连接限制?而且,如果对入站流量执行源NAT,这也可能会导致端口耗尽。

一个人真的需要从两端获取一个pcap文件。您要查找的是是否发送了连接尝试但从未到达服务器,但仍然显示为已被服务器重置。如果是这种情况,则必须重新设置连接。NAT池耗尽是此类问题的常见原因。

另外,netstat -st可能会为您提供其他信息。


1

根据我自己最近的类似调整经验,可以尝试一些想法。带有参考:

您说这是一个静态文本文件。万一发生任何上游处理,显然域套接字可以提高基于TC端口的连接上的TCP吞吐量:

https://rtcamp.com/tutorials/php/fpm-sysctl-tweaking/ https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

不管上游终止:

启用multi_accept和tcp_nodelay:http ://tweaked.io/guide/nginx/

禁用TCP慢启动:https : //stackoverflow.com/questions/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

优化TCP拥塞窗口(initcwnd):http : //www.nateware.com/linux-network-tuning-for-2013.html


1

要设置打开文件的最大数量(如果这是导致您的问题的原因),则需要在/etc/sysctl.conf中添加“ fs.file-max = 64000”


0

TIME_WAIT使用命令查看有多少个端口处于状态,netstat -patunl| grep TIME | wc -l然后更改net.ipv4.tcp_tw_reuse为1。


我将如何查看TIME_WAIT状态中有多少个端口?
Erik Swan

使用netstatss。我用完整的命令更新了答案!
fgbreel 2015年

我已经重新运行测试,并watch -n 1 'sudo netstat -patunl | grep TIME | wc -l'在整个测试中返回0。我可以肯定地说,重置是由于负载测试器和服务器之间有人减轻DDOS的结果,基于我对上面发布的PCAP文件的分析,但是如果有人可以确认那很好!
Erik Swan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.