天天看點

Windows雲伺服器CPU使用率高的問題一例問題症狀問題分析結論

作者:聲東

大家好,今天跟大家分享一例Windows雲伺服器CPU使用率高的問題。

客戶購買了一台Windows 2016雲伺服器,登入之後發現這台伺服器的CPU使用率一直保持在90%以上。

首先登入到伺服器,打開任務管理器,切換到性能頁面,确認問題确實存在。從下圖可以看出,這台伺服器有非常明顯的CPU使用率高的症狀。

Windows雲伺服器CPU使用率高的問題一例問題症狀問題分析結論

然後,我們切換到任務管理器,詳細資訊頁面,點選CPU使得程序以CPU使用率高低排序。我們看到CPU使用率最高的程序是svchost.exe。這個程序是Windows作業系統裡的服務宿主程序,即service host程序。

Windows雲伺服器CPU使用率高的問題一例問題症狀問題分析結論

接下來,我們打開資料總管,切換到CPU頁面,根據上邊找到的程序PID,勾選對應的svchost.exe程序。我們發現使用CPU最高的服務是Schedule,也就是微軟的計劃任務服務。

Windows雲伺服器CPU使用率高的問題一例問題症狀問題分析結論

總結上邊發現的所有資訊,我們可以确認,這台伺服器中,計劃任務這個服務,占用了系統大量的CPU資源,一般情況下,這是不合理的。進一步調試這個問題,我們需要抓取這個程序的轉儲檔案。Windows裡,轉儲檔案可以簡單分為兩大類,一類是系統的轉儲檔案,一類是某個程序的。系統的轉儲檔案(有可能)包括整個系統的資訊,而程序的轉儲檔案,一般隻包含這個特定程序的使用者控件的資訊。在Windows上,我們可以用任務管理器簡單的抓取程序轉儲檔案。

Windows雲伺服器CPU使用率高的問題一例問題症狀問題分析結論

然後,我們用windbg打開轉儲檔案。另外我這邊推薦大家使用一個windbg的擴充,這個擴充在微軟技術支援團隊普遍使用,非常好用。這個擴充叫做mex。安裝這個擴充很簡單,隻需要根據作業系統是x86或者amd64,把對應的dll拷貝到windbg安裝目錄下邊winext子目錄中即可。

我們使用!mex.us (unique stack)指令在指令行輸出程序中所有的call stacks,發現正在運作的線程,基本都在處理 LRPC調用。LRPC調用在接到消息之後,喚起計劃任務去查詢某個任務相關的資訊。

LRPC機制是一種用戶端伺服器機制,也就是說,為了了解為什麼作為LRPC的伺服器端,計劃任務會接到LRPC消息。我們可以嘗試找出發送消息的用戶端程序。下邊這個微軟官方部落格中,提到了怎麼在LRPC堆棧上找出用戶端程序PID的方法。

具體的原理和方法請參考這篇文章。我們用同樣的方式,在不同的調用棧上去找出用戶端程序的PID。發現這個程序的PID是一緻的。

也就是說,LRPC用戶端對應的程序PID是4424,可以看到它是客戶在另外一個登入會話裡的explorer程序。

Windows雲伺服器CPU使用率高的問題一例問題症狀問題分析結論

為了了解explorer的行為,我們繼續抓explorer的轉儲檔案,我們發現所有與計劃任務有關的線程,都來自msctf子產品的調用,這個子產品跟Text Framework Serivce相關。觀察線程行為,可以大概看出,這個子產品在通過task schedule去查詢資訊。

基于以上資訊,很難在沒有微軟msctf子產品private symbol和代碼的情況下,進一步深入研究這個子產品的行為,建議客戶把系統更新到最新的Rollup,之後問題不能重制。

基本上來說,微軟會很快修複Windows中明顯的問題,是以強烈建議經常保持Windows系統安裝了最新的更新檔,這樣可以避免很多問題。

繼續閱讀