在虛擬化環境 XenServer / ‘FreeBSD jails’ 上處理 fork 炸彈
我習慣使用 FreeBSD 監獄,但我想嘗試 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,但仍然沒有找到防止可以殺死主機伺服器的分叉炸彈,使用 XenServer 並沒有多大幫助。Vmware 看起來很有希望,但由於成本原因,這是不可能的。
那麼,關於如何微調 Xenserver 或 Freebsd 以處理分叉繁榮的任何想法?
限制 VCPU 有所幫助,但現在我面臨另一個問題:
如何在 XenServer 下強制停止/刪除 VirtualMachine(可能的錯誤)
我無法刪除/停止/重新啟動包含自定義 FreeBSD 核心(xen 選項)的實例,一些 XenServer 在啟動此核心時會失去對實例的控制。
更新
這解決了問題:rctl – 顯示和更新資源限制數據庫
即使在有使用者限制的物理機上,您也可以有效地防止分叉炸彈。在 FreeBSD 上,一種配置方法是在
/etc/login.conf
, 中使用maxproc
參數。有關更多資訊,請參閱此處的文件。
編輯:如果這還不夠,您至少應該能夠保持 XenServer 執行,同時限制任何 VM 可以獲得的 CPU 時間。請參閱此處的 Xen CLI 文件中有關 VCPU 參數的部分。