我在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为硬性和软性限制root
和www-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的说法,所有这些错误都是“ 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缓解的结果吗?
谢谢!
net.core.netdev_max_backlog
2000个?我见过几个示例,它使千兆位(和10Gig)连接的数量级提高了一个数量级。