高流量下的 nginx:日志写入磁盘时网络会中断吗?

高流量下的 nginx:日志写入磁盘时网络会中断吗?

具有 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 秒出现一次呼吸问题。

相关内容