據說有些雲廠商會超賣,宿主有 96 個核心,結果賣出去 100 多個 vCPU,如果這些虛機負載都不高,大家相安無事,如果這些虛機同時執行一些高負載的任務,相互之間就會搶佔 CPU,對應用程式有較大影響,我應該如何檢視我的 CPU 是否被搶佔了呢?
什麼是 cpu steal time?
如果你在物理機上檢視這個指標,這個指標必然是 0,只有虛擬機器才需要關注這個指標。我們看一下 CPU steal time 的定義(來自 ibm.com):
Steal time is the percentage of time a virtual CPU waits for a real CPU while the hypervisor is servicing another virtual processor.
虛擬機器畢竟是被虛擬出來的,虛擬機器要用到 CPU,最終還是要透過宿主機的 CPU 來完成,如果宿主機的 CPU 正在為其他虛擬機器服務,那麼當前虛擬機器就會等待,這個等待的時間就是 steal time。
CPU 跟記憶體不一樣,記憶體是可以做到硬限制的,如果雲廠商超賣,CPU 搶佔確實有可能會影響到你的應用程式,所以,我們需要關注這個指標。具體如何檢視呢?
如何檢視 cpu steal time?
使用 top
命令即可:
上圖中,st
就是 steal time,這個指標是百分比,如果是 10,就是 10%。我這個環境是 0%,說明非常健康。
何時需要關注 cpu steal time?
如果這個值長時間(比如連續 20 分鐘)超過 10%,就需要介入處理。
如何應對 cpu steal time 過高?
有兩種情況,可能都會引起這個值變高,一個是你自己的程式本身負載比較高,你需要最佳化程式或升配,一個是雲廠商超賣,需要遷移虛機到空閒宿主機上(重啟虛機,或者直接聯絡雲廠商解決)。如何區分這兩種情況呢?
比如你有個 web 程式,部署在 4 臺虛機上,4 臺虛機負載都高,那大概就是情況一,如果只有一臺虛機 st 高,其他虛機都很低,那就是情況二。
這個問題最初來自社群某使用者的疑問,大家如果想討論 SRE、監控、可觀測性相關話題,歡迎免費加入知識星球: