为什么我的Web服务器在高负载下丢失TCP重置连接?

我有一个小的VPS设置与Nginx。 我想尽可能地挤出更多的性能,所以我一直在尝试优化和负载testing。

我使用Blitz.io通过获取一个小的静态文本文件进行负载testing,并运行到一个奇怪的问题,其中服务器似乎发送TCP重置,一旦同时连接的数量达到大约2000.我知道这是一个非常数量巨大,但是从使用htop服务器的CPU时间和内存还是有很多余地的,所以我想弄清楚这个问题的来源,看看能不能更进一步。

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

我没有足够的声望直接发布此图表,因此这里是Blitz.io图表的链接:

在这里输入图像描述

以下是我已经做的尝试,找出问题的根源:

  • nginxconfiguration值worker_rlimit_nofile被设置为8192
  • 对于rootwww-data用户(在nginx中运行的),在/etc/security/limits.conf中将nofile设置为64000
  • 没有任何迹象表明/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 

有任何想法吗?

编辑:我做了一个新的testing,斜坡到一个非常小的文件(只有3个字节)的3000个连接。 这里是Blitz.io图:

Blitz.io图表

再次,根据闪电战所有这些错误是“TCP连接重置”错误。

这是Linode带宽图。 请记住,这是一个5分钟的平均值,所以低通滤波了一下(瞬时带宽可能要高得多),但仍然没有什么:

在这里输入图像描述

中央处理器:

在这里输入图像描述

I / O:

在这里输入图像描述

接近testing结束时的htopHTOP

我还捕获了一些使用tcpdump在一个不同的(但类似的)testing的stream量,开始捕获时,错误开始进入: 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标志来自负载testing源,而不是服务器。 那么,假设负载testing服务方面没有问题,可以肯定的是,这是负载testing服务和我的服务器之间的某种networkingpipe理或DDOS缓解的结果吗?

谢谢!

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

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

可能有任何连接重置的来源。 负载testing仪可能没有可用的临时端口来启动连接,沿途的设备(如防火墙正在执行NAT)可能会耗尽其NAT池,并且无法为连接提供源端口。负载平衡器或防火墙在您的端可能达到了连接限制? 如果对入站stream量进行源NAT,那么也可能会遇到端口耗尽。

从两端真的需要一个pcap文件。 你想要查找的是如果发送连接尝试,但从来没有到达服务器,但仍然显示,如果它被重置的服务器。 如果是这样的话,那么沿线的东西就不得不重置连接。 NAT池耗尽是这类问题的常见来源。

另外,netstat -st可能会给你一些额外的信息。

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

你说这是一个静态的文本文件。 以防万一上游处理正在进行,显然域套接字通过基于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