是否有相當於 Unix 的“CPU 竊取時間”的 Windows?
為了評估虛擬化平台上的性能監控準確性,CPU 竊取時間已成為一個越來越相關的指標 - 請參閱EC2 監控:在Amazon EC2和 IBM 關於CPU時間佔概念的更深入的技術解釋(包括插圖):
竊取時間是虛擬 CPU 在管理程序為另一個虛擬處理器提供服務時等待真實 CPU 的時間百分比。
因此,它在當今大多數相關的 Unix/Linux 監控工具中都存在 - 參見例如列*%steal或st* in
sar
ortop
:st – 竊取時間
管理程序從該虛擬機“竊取”的 CPU 量用於其他任務(例如執行另一個虛擬機)。
我一直無法弄清楚如何在 Windows 上擷取相同的指標,這可能嗎?(當然,對於 EC2 上的Windows 2008 Server R2 AMI和通過相應的Windows 性能計數器來說是理想的。)
編輯:2013 年 10 月 1 日更新 - 我的一些原始答案已經過時了。
我不確定你是否仍然活躍在這個網站上,或者你會看到這個,但我想讓你知道我今天讀了這個問題,它讓我著迷,所以我花了一整天(當我應該有一直在工作)研究 Hyper-V 和 Windows 內部結構,甚至深入研究虛擬化本身的概念,希望我能準備好回答你的問題。
讓我先說一下,我是從 Hyper-V 作為虛擬化平台的角度出發的,因為那是我最有經驗的地方。儘管我們所知道的虛擬化可能存在某些不可偏離的原則,但微軟、VMware 和 Xen 對於如何設計他們的虛擬機管理程序都有不同的策略。
這是使您的問題具有挑戰性的第一件事。您提出的問題好像與管理程序無關,但實際上並非如此。例如,Amazon EC2 使用 Xen 虛擬機管理程序,您在
top
從執行在該虛擬機管理程序上的 Linux 虛擬機發出的命令的輸出中看到的“CPU Steal Time”指標是該客戶作業系統上安裝的集成服務的結果(或來賓上的虛擬化感知工具)與該特定管理程序提供的數據相結合。首先讓我直接回答你的問題:沒有辦法從執行 Windows 的虛擬機內部看到屬於執行虛擬機管理程序的物理機的處理器在做其他事情上花費了多少時間,除非特定的虛擬工具/您的特定管理程序的服務或虛擬化感知工具安裝在來賓 VM 中*,並且來賓執行的特定虛擬機管理程序將該數據公開給來賓。即使是在 Hyper-V 管理程序上執行的 Windows 來賓也無法立即訪問有關管理程序上的物理處理器執行其他操作所花費時間的資訊。(引用 voretaq7,“打破第四面牆”。)即使 Windows 客戶端和伺服器作業系統在 Hyper-V 中作為虛擬化來賓執行並安裝了正確的集成服務/工具,也會使用“啟蒙”(字面意思是核心)特別為虛擬機所做的程式碼更改)顯著提高了它們在使用物理主機資源方面的性能,底線是虛擬機管理程序沒有*向來賓作業系統提供比它想要的更多的資訊。這意味著管理程序不必告訴來賓虛擬機除了為該虛擬機提供服務之外它還在做什麼……除非它願意。而關於物理處理器正在做什麼的資訊對於從 VM 的角度得出一個指標是必要的,例如“CPU Steal Time:vCPU 等待物理 CPU 的時間百分比”。
如果客戶作業系統甚至沒有意識到它實際上是虛擬化的,它怎麼會知道呢?
換句話說,如果沒有在客戶機上安裝正確的集成工具,客戶機作業系統甚至不會知道它的 CPU 實際上是一個v CPU。它甚至不知道自身之外還有另一種力量從它“竊取” CPU 週期,因此來賓 VM 上將不存在該指標。
VMware 已開始向 Windows 客戶機以及 ESXi 5.0 公開這些數據。VMware 集成工具也需要在客戶機上更新。這是一個參考;他們將其稱為“CPU被盜時間”。
Hyper-V 等虛擬機管理程序不允許來賓直接訪問物理處理器或處理器核心等物理資源。相反,管理程序為他們提供了 vDevs - 虛擬設備 - 例如 vCPU。
原因的一個主要範例:假設虛擬機來賓作業系統呼叫刷新 TLB(翻譯備份緩衝區),它是物理 CPU 的物理組件。如果允許來賓作業系統清除物理處理器上的整個TLB,這將對所有其他也共享同一物理 TLB 的 VM 產生負面的性能影響。在 Windows 的情況下,來賓作業系統中的呼叫被轉換為由管理程序解釋的“超級呼叫”或“啟發式”呼叫,以便僅刷新與該虛擬機相關的 TLB 部分。
(有趣的是,這向我暗示,沒有適當的集成工具和/或服務的來賓虛擬機可能會影響同一主機上所有其他虛擬機的性能,但這完全超出了本主題的範圍.)
儘管如此,您仍然可以在 Hyper-V 主機中檢測到虛擬處理器花費的時間等待真正的處理器可用,以便它可以安排執行。但是您只能在 Windows Hyper-V 管理程序上查看該數據。如果可以在其他虛擬機管理程序中看到這一點,我敦促其他人告訴我們如何在該虛擬機管理程序中看到這一點,以及它是否暴露給客人。 (編輯 2013 年 10 月 1 日感謝 evilensky 這樣做!)
我的測試機器是 Hyper-V Server 2012,它是 Server 2012 的免費版本,只執行 Core 和 Hyper-V 角色。它實際上與任何執行 Hyper-V 的 Windows Server 2012 相同。
在您的父分區(即物理主機)上啟動 Perfmon。載入此計數器:
Hyper-V Hypervisor Virtual Processor\CPU Wait Time Per Dispatch\*
您會注意到,該管理程序上的每個虛擬機都會有一個該計數器的實例,以及 _Total。該 Perfmon 計數器的 Microsoft 定義是:
等待將虛擬處理器分派到邏輯處理器上的平均時間(以納秒為單位)。
顯然,您希望該數字盡可能低。對於電腦來說,等待幾乎從來都不是一件好事。
您將要調查的管理程序上的其他性能計數器是
Hyper-V Hypervisor Root Virtual Processor\% Guest Run Time
、% Hypervisor Run Time
和% Total Run Time
。這些計數器為您提供可用於確定事實的百分比,例如“真正的”處理器在服務 VM 或所有 VM 之外的工作上花費了多少時間。因此,總而言之,您在來賓虛擬機中尋找的指標取決於它正在執行的管理程序,該管理程序是否選擇提供有關它如何花費時間而不是為該 VM 提供服務的數據,以及是否來賓作業系統具有正確的虛擬化集成工具/服務/驅動程序,足以意識到虛擬機管理程序正在使該數據可用。
我不知道在 Windows 客戶機上是否安裝了集成工具,以查看虛擬機主機花費了多少時間(以秒或百分比計)為它提供服務或不為它提供服務(相對於總物理處理器時間)。 (編輯 2013 年 10 月 1 日:ESXi 5.0 或更好的版本通過集成工具將此數據公開給來賓 VM。但 Hyper-V 上仍然沒有。)