管控 LXC 虛擬電腦使用 CPU 資源

大部分虛擬系統內的虛擬電腦,在虛擬電腦建立的時候,就已經設定好了虛擬電腦所有的(虛擬)硬體設定組態,例如虛擬電腦能使用多少顆 CPU(或核心)、可以使用多少記憶體,以及有多大的硬碟空間可以使用等,且虛擬電腦在實際開機的狀態下,也並不是每一套虛擬系統都有辦法動態處理(異動)硬體資源的設定值(如記憶體大小),另外,即使是關機修改(虛擬)硬體的設定,也不見得可以完全掌控(獨佔)實體硬體資源的使用權,例如,提供(設定)特定編號的 CPU 給虛擬電腦使用,這在大部分的虛擬系統上就做不到了。

在之前的介紹當中,有提到 LXC(Linux Container)有兩個系統管理工具,就是 Cgroup 與 App Armer,其可以有效的管理、控制,並隔離虛擬電腦與實體電腦的資源運用,而就運算資源來說,CPU 的資源如何有效的控制與分配,以及如何將虛擬與實體電腦的 CPU 資源完整隔離開來,以達到相互運作使用而互不干擾,對效能來說,就顯得格外重要。

檢視與線上設定可用的 CPU 資源

要了解與管控 LXC 使用的 CPU 資源,就先來了解一下目前 LXC 虛擬電腦上可用的 CPU(核心)的數量(要先啟動 LXC 虛擬電腦),開啟虛擬電腦的終端機,輸入〝top〞並按下 Enter 鍵之後,接著再按一下〝1〞,就可以看到目前虛擬電腦上可用的 CPU 核心數目:

由上圖可以明顯看到筆者測試電腦的環境中,目前有兩顆 CPU 核心,也就是〝Cpu0〞與〝Cpu1〞可以提供給虛擬電腦來使用,而這也代表實體電腦上也是使用這兩顆 CPU 核心來進行各種運算與處理。

回到實體電腦的終端機,輸入以下指令,來查看虛擬電腦所使用的 CPU 編號:

$ sudo lxc-cgroup -n myUS1204 cpuset.cpus

由查詢結果,就可以看到此兩顆 CPU 核心的編號,而核心編號是由 0 開始,那此指令除了可以查詢虛擬電腦所使用的 CPU 核心編號之外,也可以直接線上指定 (限定)LXC 虛擬電腦可以使用的 CPU 核心,指令如下:

$ sudo lxc-cgroup -n myUS1204 cpuset.cpus “1”

不過,此指令輸入完成,按下 Enter 鍵之後,並不會有任何的訊息,可以再利用〝sudo lxc-cgroup -n myUS1204 cpuset.cpus〞的指令,來查看設定之後,LXC 虛擬電腦所使用的 CPU 編號為何:

由系統回應的訊息,就可以清楚知道 LXC 虛擬電腦目前被指定(限定)使用編號為〝1〞的 CPU 核心,不過,如果這時在虛擬電腦的終端機內,使用〝top〞的指令(之後還要輸入〝1〞),卻還是會看到兩顆 CPU 在運作,而這並不是剛剛設定的指令沒有套用,而是因為就 LXC 虛擬電腦來說,大部分實體電腦的資源都可以看到,並不會因為做了某些設定,就看不到這些資源,差別只在於有沒有權限可以使用,所以,就上述的狀況來說,即使我們限定 LXC 虛擬電腦對於 CPU 運算資源的使用,卻無法利用一般的方式來檢測資源的使用是否真的收到限制,而至於怎樣檢測,等一下會有說明的。

利用組態檔來設定 CPU 資源的使用

利用指令直接線上指定(限定)CPU 核心資源的方式,雖然可以馬上針對實際狀況調整 CPU 資源的分配, 但是只要系統重新開機,所有的設定值就會回覆原狀,因此,若是有長期或永久設定的需求,就需要透過 LXC 虛擬電腦的設定組態檔來進行 CPU 核心資源的設定。

先將 LXC 虛擬電腦關機之後,在實體電腦的終端機上,利用任一編輯器直接開啟 LXC 虛擬電腦的設定檔:

$ sudo vim /var/lib/lxc/myUS1204/config

檔案開啟之後,直接在檔案的最後面加入〝lxc.cgroup.cpuset.cpus = 0〞(這邊限定 LXC 虛擬電腦使用編號為 0 的 CPU 核心),如下圖:

設定值輸入完成之後,將設定檔存檔後關閉,再啟動 LXC 虛擬電腦,接著回到實體電腦的終端機,輸入以下指令來確認 LXC 虛擬電腦 CPU 資源的使用狀況:

$ sudo lxc-cgroup -n myUS1204 cpuset.cpus

檢測 LXC 虛擬電腦 CPU 資源的使用狀況

前面提到無法使用〝top〞的指令來檢測 CPU 資源設定異動後的使用狀況,若是要確實了解 LXC 虛擬電腦 CPU 資源異動的狀態,則需要透過以下兩個步驟:

  1. 營造 CPU 使用的狀態
  2. 利用 mpstat 查看 CPU 資源的使用狀況

而要營造 CPU 使用的狀態,最直接的方式,就是執行一個類似無窮迴圈的程式,在 LXC 虛擬電腦的終端機利用任一編輯器開啟新檔,檔名可以自定,只要附檔名設定為〝.sh〞即可,而這邊將程式名稱定為〝counter.sh〞:

$ vim counter.sh

檔案開啟之後,輸入以下內容:

#!/bin/bash
c=0; echo "" >/tmp/counter
while [ true ]
do
   echo "$c" >> /tmp/counter
   let "c=$c+1"
done

輸入完成,存檔後就可以退出,接著利用以下指令,來賦予檔案可以執行的權限:

$ chmod +x counter.sh

程式轉寫與設定完成之後,不要馬上執行,還要先安裝一個套件來相互配合,才能達到檢測 CPU 資源運作的目的,利用以下指令,就可以安裝所需的套件,記住,是安裝在 LXC 虛擬電腦內喔:

$ sudo apt-get install sysstat

接著系統會詢問是否要安裝套件,確認無誤之後,輸入〝y〞後,再按下 Enter 鍵即可:

上圖內的相依性套件,會因為電腦系統內的狀況不同而有所差異,只要確認〝sysstat〞套件有安裝到即可。

sysstat 套件安裝完成之後,接著執行剛剛撰寫的程式(counter.sh),並連續執行三次:

$ ./counter.sh

程式執行之後(三次),再利用以下指令,就可以看到 CPU 核心執行的狀況:

$ mpstat -P ALL 2

上圖就是 CPU 核心執行的狀況,在圖中可以明顯看到不同編號 CPU 核心的執行狀況(%usr),而由於我們剛剛執行了三個程式,所以可以清楚發現到每一顆 CPU 核心的運算資源都有在使用。

接下來就要來測試 LXC 虛擬系統是否真的能夠限制虛擬電腦對於 CPU 核心運算資源的使用,在實體電腦的終端機內輸入以下指令,來限制 LXC 虛擬電腦使用特定編號的 CPU 核心(這邊限制 LXC 虛擬電腦使用 Cpu1):

$ sudo lxc-cgroup -n myUS1204 cpuset.cpus “1”

設定完成之後,利用指令確認 LXC 虛擬電腦是否已被限制使用特定編號的 CPU 核心:

$ sudo lxc-cgroup -n myUS1204 cpuset.cpus

CPU 資源限制完成,一樣利用〝mpstat -P ALL 2〞的指令來查看 CPU 核心運算資源的使用狀況:

由指令輸出的結果,就可以明顯看到編號為 0 的 CPU 核心資源的使用量一直下降,表示 LXC 虛擬電腦現在只有在使用 Cpu1 的運算資源,成功的讓 LXC 虛擬電腦限制使用特定編號的 CPU 核心。

然而,可能有人會疑惑,為何 Cpu0 的使用量(%usr)不會是 0 呢? LXC 虛擬電腦不是沒有在使用嗎?Cpu0 的使用量當然不會是 0,因為 LXC 虛擬電腦沒有在使用,並不代表實體電腦就不會使用到 Cpu0 的運算資源,也因此,會看到 Cpu0 有在使用,是正常的,只是因為沒有被 LXC 虛擬電腦所使用,因此使用量會大幅下降。

以上就是 LXC 管控虛擬電腦使用 CPU 資源的方式,方便我們可以更有效率的使用 CPU 的運算資源,而不會受到初始虛擬電腦設定值的影響。