2011/05/21

libvirt指令同步、非同步問題

簡介:libvirt是一個對各品牌hypervisor(如Xen、VMWare、KVM等)抽象化的wrapper,比如xen可以透過xm指令來操作hypervisor,但是一旦底層hypervisor從xen改變成其他品牌(如:KVM),那xm指令就不再適用,所以使用libvirt就可以達到抽象畫的目的。

rhel5-virt

libvirt提供一套介面操作各種hypervisor ()

如果我們透過直接使用virsh(libvirt的shell)分成2個視窗執行create/destroy和list的結果,認為virsh command是使用同步執行的方式,也就是動作執行完畢才會返回。

我們先執行create後,馬上執行list,發現create domain-U的結束時間,還比list晚1秒鐘,因使可以推論create時會建立好vm後,就可以讓list去取得列表,但create domain-U後可能還會做一些其他事情,所以回來的時間稍微比list晚一點。因此,可以判斷virsh command應該是同步執行完後才返回。

[root@hyperimagestoreageweb tmp]# virsh create centos1.xml && date

Domain centos1 created from centos1.xml

Fri May 20 16:35:30 UTC 2011

[root@hyperimagestoreageweb ~]# virsh list && date

Id Name State

----------------------------------------------------

0 Domain-0 running

59 centos1 paused

Fri May 20 16:35:29 UTC 2011

但是如果我們使用Python-libvirt這個binding,就會發現有些指令如delete,在指令下去後,馬上就會返回,但是Python-libvirt卻沒有馬上做delete的動作,這是因為我們馬上做list的動作,還是可以看到預計被delete的domain-U一樣存在,所以可以判斷Python-libvirt有些動作是非同步執行,所以要獲得最新的domain-U資料,就必須使用polling反覆詢問。

Xen狀態running/blocked跳動問題

問題:在使用xen建立好一個domain-U後,使用virsh list (或xm list)指令觀察其狀態,可以發現domain-U的狀態常常在running/blocked切換。有些人可能誤以為這是底層xen的bug,但是這是正常現象。

我們可以從man看到xen定義了6個狀態(r - running 、b - blocked 、p - paused 、s - shutdown 、c - crashed 、d - dying),其中的

r - running:

The domain is currently running on a CPU

b - blocked:

The domain is blocked, and not running or runnable. This can be caused because the domain is waiting on IO (a traditional wait state) or has gone to sleep because there was nothing else for it to do.

也就是說running是系統有在執行工作,而blocked則是沒有工作可以做。我做了一個試驗,使用vnc登入domain-U,執行一個無限回圈的程式,在透過觀察後確認那台domain-U會一值處於running狀態。所以blocked和running頻繁的跳動是正常現象,這是因為OS本身的背景服務被執行時就會處於running狀態,隨後又處於blocked狀態。

Buddhism and Software Developer

In today's fast-paced society, we are often surrounded by work, goals, and external pressures. However, the wisdom found in Buddhism off...