一个 48 GB RAM 的虚拟服务器维持大约 25k 的 TCP 连接(现场设备登录以建立 SSH 隧道)用完 RAM 并开始交换,速度变慢等。我们升级并重新启动。即使在 25k 连接恢复并处理了最初的 DDOS 风暴之后,服务器现在也显示出大量的软中断使用。我如何找到原因?
在这里你可以看到事件:
令人惊讶的是,过去没有很多软中断。现在,有 8 个内核线程在处理大约 60% 的 CPU(ksoftirqd
线程)。
查看 Munin 图表,我看到 的中断PCI-MSI 49153-edge virtio0-input.0
增加了很多(注意 log y 标度):
机器必须处理的网络流量并没有真正改变。
我写了一个快速的 python 脚本,它显示每秒的中断,从/proc/interrupts
from 开始PCI-MSI 49153-edge virtio0-input.0
,它主要是每秒 50-100 次,但每隔一段时间,就会有 5000 到 10000 次爆发。
因为在升级过程中,VM主机的控制面板提示需要将VM迁移到另一台服务器。我推测该服务器具有不同的以太网控制器,不同的模拟中断控制器或其他任何东西,但他们甚至将虚拟机迁移回来,并且没有区别。
另一个区别是 VM 从vmlinuz-4.15.0-45-generic
到/boot/vmlinuz-4.15.0-72-generic
. 随着最近所有的英特尔 CPU 补丁,我可以想象有什么东西偷偷溜进去了。
最大的问题是,我如何找到根本原因,或者获取更多信息这些中断来自何处?将服务器重新启动到旧内核是可能的,但不可取。
原来有人安装在上面,它有一个收集进程会计信息的 systemd 服务。删除它修复它。