具有 2 个 vCPU 的 VPS,配备 Ubuntu 20.04 和 nginx。
日志记录方面没有任何变化:无论是 nginx、rsyslogd 还是 journald。
我从附近的 VPS 启动 ab (apache-benchmark),如下所示:
ab -k -c 300 -n 3000000 'https://example.com'
然后,在提供商图表中,我可以看到网络中断(吞吐量和每秒数据包数)磁盘写入增加. 这种情况每隔每 30 秒。
磁盘写入吞吐量增加了,但磁盘 iops 保持在较低水平,在整个基准测试期间都为 1 或 2 IOPS,系统中没有其他内容,但是我的 SSH 在内部接口中,使用 nginx 日志的 tail -f。
所以我怀疑这可能是 nginx 将日志写入磁盘的方式,或者可能是默认的 sysctl,以及内核正在同步对磁盘的更改(?)
在 30 秒内我没有看到太多 sysctl 设置:
# sysctl -a | grep '30$'
kernel.acct = 4 2 30
net.core.xfrm_acq_expires = 30
net.ipv4.ipfrag_time = 30
net.ipv4.neigh.default.gc_interval = 30
net.ipv6.neigh.default.gc_interval = 30
net.ipv6.route.gc_interval = 30
vm.max_map_count = 65530
但是在 3000 厘秒时有这样的情况:
# sysctl -a | grep '3000$'
vm.dirty_expire_centisecs = 3000
可能是那一个吗?
dirty_expire_centisecs 此可调参数用于定义脏数据何时足够旧,可供内核刷新线程写出。以百分之一秒表示。内存中脏数据超过此间隔的时间将在下次刷新线程唤醒时写出。
我担心的是流量每 30 秒从 7K pps 降至零,并在磁盘写入完成时返回。
什么可以做到以避免这种行为?
以下是图表,显示了所述问题:VPS 性能图表
编辑:sysctl 发现
更新
和nginx日志没关系。
根据@berndbausch 的指示,确实查看了客户端,并且有相同的网络故障图表。
重复练习:
access_log /var/log/nginx/access.log combined buffer=64K flush=5s;
和:
sysctl -w vm.dirty_expire_centisecs=500
磁盘 IOP 增加到 1 到 +/- 10,磁盘吞吐量图每 5 秒达到峰值,但无论是在服务器还是客户端,网络图仍然以 30 秒为间隔“降至 0”。
更有趣的是,重复基准测试:
access_log off;
磁盘图保持在 0,但网络图也是如此。
在该图中,可以看到两个基准测试都如所述,让一侧每 5 秒刷新一次,而右侧没有访问日志:
更新 2
在端口 443 上执行 iperf 双重测试...服务器图表以 1 Gbps 的速度清晰可见,但是 iperf 客户端具有相同的行为,网络输出图表每 30 秒下降到 0。
将尝试使用不同的客户端,或者稍微调整客户端操作系统、限制和 sysctl,让我们看看。
更新 3
这看起来像是控制面板中的一个监控错误。
确实从其他 VPS 作为客户端以及从专用服务器(裸机)重复了基准测试,总是相同的图表......
但是,如果我在测试期间在两侧启动 bmon……它看起来很简单:
接收方和发送方相同。两个 VPS 之间为 10 Gbps,专用服务器到 VPS 为 1 Gbps。始终以 1 秒的分辨率进行传输。
那么...谜团解开了。
答案1
看起来我的评论/问题就是答案:
(1)如何测量网络输入/输出?
(2) 我没看到磁盘 IO 和网络输出之间有如此大的相关性,
(3) 与 CPU 利用率没有相关性。然而,
(4)网络输入和网络输出相互关联。
如果在 NIC 上测量网络输入/输出(甚至在其他地方测量),我会怀疑问题是否在侧面ab
。也就是说,运行的 VPSab
可能每 30 秒出现一次呼吸问题。