一个 48 GB RAM 虚拟服务器维护着大约 25k TCP 连接(现场登录以设置 SSH 隧道的设备),内存耗尽,开始交换,速度变慢等。我们升级并重新启动。即使在恢复了 25k 连接并处理了最初的 DDOS 风暴之后,服务器现在仍然显示大量软中断使用。我该如何找到原因?
您可以在这里看到这些事件:
令人惊讶的是,以前没有太多的软中断。现在,有 8 个内核线程占用了大约 60% 的 CPU(ksoftirqd
线程)。
查看 Munin 图表,我发现中断PCI-MSI 49153-edge virtio0-input.0
增加了很多(请注意对数 y 尺度):
机器必须处理的网络流量实际上并没有改变。
我编写了一个简短的 python 脚本,显示每秒的中断次数,从/proc/interrupts
开始到结束PCI-MSI 49153-edge virtio0-input.0
,大多数情况下每秒约为 50-100 次,但偶尔会出现 5000 - 10000 次突发。
因为在升级过程中,虚拟机主机的控制面板宣布需要将虚拟机迁移到另一台服务器。我推测那台服务器有不同的以太网控制器、不同的模拟中断控制器或其他什么的,但他们甚至将虚拟机迁移回来了,而且没有任何区别。
另一个不同之处是 VM 从 变为vmlinuz-4.15.0-45-generic
。/boot/vmlinuz-4.15.0-72-generic
最近 Intel 发布了各种 CPU 补丁,我可以想象其中一定有漏洞。
最大的问题是,我如何找到根本原因,或者获取有关这些中断来自何处的更多信息?将服务器重新启动到旧内核是可能的,但并不可取。
答案1
原来是有人在上面安装了 systemd 服务,用于收集进程记账信息。删除它就可以解决问题。