处理虚拟化环境 XenServer / “FreeBSD jails” 上的 fork 炸弹

处理虚拟化环境 XenServer / “FreeBSD jails” 上的 fork 炸弹

我习惯使用 FreeBSD jails,但我想尝试一下 XenServer 5.5 / Vmware ESXI 5,希望它真的可以限制每个 VM 的资源,在安装了几个虚拟机后,我尝试在一台小型 VM(512RAM,1 VCPU)上执行以下代码(服务器有 8GB RAM 2 个处理器):

$ cat > fork.c    
#include <stdio.h> 
int main() { while(1) fork(); }
$ gcc fork.c -o bomb
$ ./bomb

在没有虚拟化(没有 Xenserver/Vmware)的 FreeBSD 服务器上,该代码将杀死机器并需要进行硬重置,但令我惊讶的是,在 XenServer 上,行为“几乎”类似,并造成一些损害。

XenServer 开始消耗所有可用的 CPU,而其他 FreeBSD VM 开始性能不佳。

另一方面,使用最新版本的 Vmware Exi,炸弹仅影响触发 fork 炸弹的虚拟机,整个服务器的 CPU 并未开始消耗所有资源,仅消耗了大约 40%,此时我允许创建第二个 VM 并在其上运行第二个炸弹,而不会注意到 VM 其余部分的性能。同时运行 2 个炸弹时,CPU 的总使用率为 90%。

就我而言,我只使用 FreeBSD,但仍然没有找到防止可能杀死主机服务器的 fork 炸弹的方法,使用 XenServer 也没有多大帮助。Vmware 看起来很有前途,但由于成本原因,无法考虑。

那么,您知道如何微调 Xenserver 或 Freebsd 来处理 fork boom 吗?

答案1

即使在有用户限制的物理机上,您也可以有效地防止 fork 炸弹。在 FreeBSD 上,一种配置方法是在 中/etc/login.conf使用maxproc参数。

欲了解更多信息,请参阅文档这里

编辑:如果这还不够,您应该能够至少让 XenServer 保持运行,同时限制任何 VM 可以获得的 CPU 时间。请参阅 Xen CLI 文档中有关 VCPU 参数的部分这里

答案2

限制 VCPU 有所帮助,但现在我面临另一个问题:

如何强制停止/删除 XenServer 下的虚拟机(可能有错误)

我无法删除/停止/重新启动包含自定义 FreeBSD 内核(xen 选项)的实例,因为 XenServer 在启动此内核时会失去对该实例的控制。

更新

这解决了问题:rctl-- 显示和更新资源限制数据库

相关内容