2015年2月6日 星期五

VirtualBox 的 CPU『熱插拔 (Hot-Plug)』功能之實驗

若「虛擬機」所使用的 CPU 數量,會因不同的應用需求而常常調整。以往都需要將「虛擬機」先關機、設定 CPU 數、再開機,過程相當麻煩。VirtualBox 有提供一個可動態『插』、『拔』CPU 的功能。覺得相當有趣,就試了一下。
  這次測試過程中,無論是「主機」或「虛擬機」都是使用 Fedora。其它 Linux 分支應該也適用,至於 Windows 系統,就不得而知了。當然,過程也順便整理、記錄下來,以備將來不時之需。記錄如下:

一、啟用「虛擬機」的 CPU Hot-Plug 功能

要讓「虛擬機」內的系統具有『CPU Hot-Plug (熱插拔)』的功能,在「虛擬機」關閉時要先啟動『CPU 熱插拔』功能。
[SiB@Core-i7 ~]# VBoxManage modifyvm "VM-test" --cpuhotplug on
[SiB@Core-i7 ~]# VBoxManage modifyvm "VM-test" --cpus 4
上例中,第一個命令是啟動「虛擬機」的『CPU 熱插拔』功能,第二個命令是設定「虛擬機」可使用的最多 CPU 數量。

注意:最多可使用 CPU 數,不要超過實際 CPU 數。請參考前文〝VirtualBox 「虛擬機」的最佳化設定組態〞之內容。

二、調整「虛擬機」所使用的 CPU

關於『CPU 數量』的意義有兩個的,兩者未必要相同數量,
  • 在『主機電腦』設定,供「虛擬機」使用的 CPU 數量
  • 在「虛擬機」內部,設定『客戶作業系統』可運用的 CPU 數量
在這個步驟,先討論第一項,第二項在步驟三中說明。

在「虛擬機」啟動前設定

在「虛擬機」尚未啟動時,就可以下命令更改「虛擬機」的 CPU 數量,
[SiB@Core-i7 ~]# VBoxManage modifyvm "VM-test" --plugcpu   2
[SiB@Core-i7 ~]# VBoxManage modifyvm "VM-test" --unplugcpu 3
上例中,第一個命令是加入指定(編號 2)的 CPU,第二個命令是移除指定(編號 3)的 CPU。
  在「虛擬機」啟動後,由內部的『客戶作業系統』查詢 CPU 資訊。以 Fedora 為例,事先已將 CPU 數量移除至只剩一個,可以看到類似的結果如下:
[root@VM-test ~]$ lscpu
. . . . .
CPU(s):1
On-line CPU(s) list:0
每核心執行緒數:1
每通訊端核心數:1
Socket(s):1
. . . . .
上例中,可以看到「虛擬機」只有一個 CPU,而使用中(On-line)的 CPU 編號為 0。

註一:CPU 的指定編號,由 0 開始遞增。例:4 個 CPU,則編號為 0 ~ 3,而非 1 ~ 4。
註二:編號 0 的 CPU 不可移除。

在「虛擬機」執行期間修改

通常在「虛擬機」執行時,才能查詢 CPU 使用數量的實際情形。若在「虛擬機」關機時,已經啟動過『CPU 熱插拔』的功能,就可以立即加入 CPU,增加「虛擬機」的執行效能。
[SiB@Core-i7 ~]# VBoxManage controlvm "VM-test" plugcpu   2
[SiB@Core-i7 ~]# VBoxManage controlvm "VM-test" unplugcpu 3
上例中,第一個命令是加入指定(編號 2)的 CPU,第二個命令是移除指定(編號 3)的 CPU。

:超過 CPU 設定數量的操作,會有錯誤訊息。當看到錯誤訊息請檢查所下的命令。

  在「虛擬機」啟動後,由內部的『客戶作業系統』查詢 CPU 資訊。以 Fedora 為例:事先已先將 CPU 數量加到三個,再移除至只剩兩個,可以看到類似的結果如下:或文。
[root@VM-test ~]$ lscpu
. . . . .
CPU(s):2
On-line CPU(s) list:0
Off-line CPU(s) list:1
每核心執行緒數:1
每通訊端核心數:1
Socket(s):1
. . . . .
上例中,可以看到「虛擬機」顯示有兩個 CPU,使用中(On-line)的 CPU 編號為 0,而離線中(Off-line)的 CPU 編號為 1。
  新加入的 CPU 仍處於離線狀態,尚不能由『客戶作業系統』使用。要再進行下一個步驟,將新加入且處於離線狀態的 CPU 交由『客戶作業系統』統籌運用。

三、在「虛擬機」中調整使用的 CPU

在「虛擬機」中調整所使用的 CPU 數量,必須為 root 權限才行,命令如下:
[root@VM-test ~]# echo 1 > /sys/devices/system/cpu/cpu3/online
[root@VM-test ~]# echo 0 > /sys/devices/system/cpu/cpu2/online
上述的第一個命令為將 CPU 3 設為『上線』狀態,而第二個命令則是將 CPU 2 設為『離線』狀態。
  用個例子詳細說明,假設在操作前有三個 CPU 在『上線』狀態,則將 CPU 1 及 CPU 2 依序『離線』,再將 CPU 1 『上線』的過程如下:
[root@VM-test ~]# echo 0 > /sys/devices/system/cpu/cpu1/online
[root@VM-test ~]$ lscpu
. . . . .
CPU(s):3
On-line CPU(s) list:0,2
Off-line CPU(s) list:1
每核心執行緒數:1
每通訊端核心數:1
Socket(s):1
. . . . .
[root@VM-test ~]# echo 0 > /sys/devices/system/cpu/cpu2/online
[root@VM-test ~]$ lscpu
. . . . .
CPU(s):3
On-line CPU(s) list:0
Off-line CPU(s) list:1,2
每核心執行緒數:1
每通訊端核心數:1
Socket(s):1
. . . . .
[root@VM-test ~]# echo 1 > /sys/devices/system/cpu/cpu1/online
[root@VM-test ~]$ lscpu
. . . . .
CPU(s):3
On-line CPU(s) list:0,1
Off-line CPU(s) list:2
每核心執行緒數:1
每通訊端核心數:1
Socket(s):1
. . . . .
由上面的例子中,紅色的部份可以看出這些命令的操作改變過程。

經驗分享:

  • 在不知幾個 CPU 時可用這個方法,不用重開機就可以快速測試『所需的 CPU 數量』。
  • 確認 CPU 數量後,最好將這個功能關閉。筆者使用時,保有動態調整功能會有『效能』上的損失。

已測試版本:

  • 主 機:Fedora 20, 21 + VirtualBox 4.3.20
  • 虛擬機:Fedora 20, 21

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)