kvm-clock: KVM guest machine 的計時機制
在雲端的架構中,
虛擬機 (virtual machine, or guest machine)
透過hypervisor取得實體機 (physical machine, or host machine) 的硬體資源,
其中, 有根據虛擬化的程度又分為許多不同的虛擬化技術,
像是virtualbox和VMWare的全虛擬化, 虛擬化完整的作業系統,
docker或是LXC的container技術, 虛擬機像是一隻程式, 沒有獨立的作業系統,
另外, 還有一種辦虛擬化技術, host machine和guest machine共享Linux Kernel,
例如: KVM (Kernel-based Virtual Machine)
http://www.linux-kvm.org/page/Main_Page
在本篇文章中, 我們將討論KVM架構下,
host machine和guest machine之間的同步關係.
在一般Linux架構下, 時間是由tsc (Time Stamp Counter) 管理,
tsc會從CPU硬體取得中斷, 並完成Linux系統中的計時功能,
然而, 在虛擬機的架構下, CPU的硬體中斷若不是無法取得, 就是要耗費大量資源,
因此, 在KVM架構下, 使用kvm-clock作為計時的裝置,
我們可以進去一台任意的虛擬機中, 藉由下列指令查詢clock source:
kvm-clock的實作方法相當簡單,
guest machine會宣告一段記憶體區間,
而KVM使用MSR (model-specific register) 的方式將host machine的時間寫入,
理論上, KVM可以在每一次系統更新時間時更新kvm-clock,
但是考量到大量的存取需求, KVM只在某些VM事件後才更新kvm-clock.
其中, kvm-clock的structure如下:
guest host可以藉由kvm-clock更新系統的local時間資訊,
並且藉由NTP (Network Time Protocol) 的方式同步絕對時間,
考慮到kvm-clock是半虛擬的tsc,
其精確度應該和由硬體中斷驅動的tsc有所差別,
如果要實作精確地同步功能在雲端的guest machine中,
這或許會是一個要解決的問題...
參考資料:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/chap-Virtualization_Host_Configuration_and_Guest_Installation_Guide-KVM_guest_timing_management.html
https://rwmj.wordpress.com/2010/10/15/kvm-pvclock/
http://blog.csdn.net/defeattroy/article/details/8849701
虛擬機 (virtual machine, or guest machine)
透過hypervisor取得實體機 (physical machine, or host machine) 的硬體資源,
其中, 有根據虛擬化的程度又分為許多不同的虛擬化技術,
像是virtualbox和VMWare的全虛擬化, 虛擬化完整的作業系統,
docker或是LXC的container技術, 虛擬機像是一隻程式, 沒有獨立的作業系統,
另外, 還有一種辦虛擬化技術, host machine和guest machine共享Linux Kernel,
例如: KVM (Kernel-based Virtual Machine)
http://www.linux-kvm.org/page/Main_Page
在本篇文章中, 我們將討論KVM架構下,
host machine和guest machine之間的同步關係.
在一般Linux架構下, 時間是由tsc (Time Stamp Counter) 管理,
# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc
tsc會從CPU硬體取得中斷, 並完成Linux系統中的計時功能,
然而, 在虛擬機的架構下, CPU的硬體中斷若不是無法取得, 就是要耗費大量資源,
因此, 在KVM架構下, 使用kvm-clock作為計時的裝置,
我們可以進去一台任意的虛擬機中, 藉由下列指令查詢clock source:
# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock
kvm-clock的實作方法相當簡單,
guest machine會宣告一段記憶體區間,
而KVM使用MSR (model-specific register) 的方式將host machine的時間寫入,
理論上, KVM可以在每一次系統更新時間時更新kvm-clock,
但是考量到大量的存取需求, KVM只在某些VM事件後才更新kvm-clock.
其中, kvm-clock的structure如下:
struct pvclock_vcpu_time_info {
u32 version;
u32 pad0;
u64 tsc_timestamp;
u64 system_time;
u32 tsc_to_system_mul;
s8 tsc_shift;
u8 flags;
u8 pad[2];
} __attribute__((__packed__));
guest host可以藉由kvm-clock更新系統的local時間資訊,
並且藉由NTP (Network Time Protocol) 的方式同步絕對時間,
考慮到kvm-clock是半虛擬的tsc,
其精確度應該和由硬體中斷驅動的tsc有所差別,
如果要實作精確地同步功能在雲端的guest machine中,
這或許會是一個要解決的問題...
參考資料:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/chap-Virtualization_Host_Configuration_and_Guest_Installation_Guide-KVM_guest_timing_management.html
https://rwmj.wordpress.com/2010/10/15/kvm-pvclock/
http://blog.csdn.net/defeattroy/article/details/8849701
留言
張貼留言