天天看點

Linux性能優化2.1 CPU性能統計資訊

<b>摘要</b>

性能工具:系統cpu

本章概述了系統級的linux性能工具。這些工具是你追蹤性能問題時的第一道防線。它們能展示整個系統的性能情況和哪些部分表現不好。本章将讨論這些工具可以測量的統計資訊,以及如何使用各種工具收集這些統計結果。閱讀本章後,你将能夠:

了解系統級性能的基本名額,包括cpu的使用情況。

明白哪些工具可以檢索這些系統級性能名額。

<b></b>

<b>2.1 cpu性能統計資訊</b>

每一種系統級linux性能工具都提供了不同的方式來提取相似的統計結果。雖然沒有工具能顯示全部的資訊,但是有些工具顯示的是相同的統計資訊。為了不多次(每種工具一次)解釋統計資訊的含義,我們在描述所有工具之前對這些資訊進行一次性說明。

2.1.1 運作隊列統計

在linux中,一個程序要麼是可運作的,要麼是阻塞的(正在等待一個事件的完成)。阻塞程序可能在等待的是從i/o裝置來的資料,或者是系統調用的結果。如果程序是可運作的,那就意味着它要和其他也是可運作的程序競争cpu時間。一個可運作的程序不一定會使用cpu,但是當linux排程器決定下一個要運作的程序時,它會從可運作程序隊列中挑選。如果程序是可運作的,同時又在等待使用處理器,這些程序就構成了運作隊列。運作隊列越長,處于等待狀态的程序就越多。

性能工具通常會給出可運作的程序個數和等待i/o的阻塞程序個數。另一種常見的系統統計是平均負載。系統的負載是指正在運作和可運作的程序總數。比如,如果正在運作的程序為兩個,而可運作的程序為三個,那麼系統負載就是5。平均負載是給定時間内的負載量。一般情況下,取平均負載的時間為1分鐘、5分鐘和15分鐘。這能讓你觀察到負載是如何随時間變化的。

2.1.2 上下文切換

大部分現代處理器一次隻能運作一個程序或線程。雖然有些處理器(比如超線程處理器)實際上可以同時運作多個程序,但是linux會把它們看作多個單線程處理器。如果要制造出給定單處理器同時運作多個任務的假象,linux核心就要不斷地在不同的程序間切換。這種不同程序間的切換稱為上下文切換,因為當其發生時,cpu要儲存舊程序的所有上下文資訊,并取出新程序的所有上下文資訊。上下文中包含了linux跟蹤新程序的大量資訊,其中包括:程序正在執行的指令,配置設定給程序的記憶體,程序打開的檔案等。這些上下文切換涉及大量資訊的移動,是以,上下文切換的開銷可以是相當大的。盡量減少上下文切換的次數是個好主意。

要避免上下文切換,重要的一點是了解它們是如何發生的。首先,上下文切換可以是核心排程的結果。為了保證公平地給每個程序配置設定處理器時間,核心周期性地中斷正在運作的程序,在适當的情況下,核心排程器會決定開始另一個程序,而不是讓目前程序繼續執行。每次這種周期性中斷或定時發生時,你的系統都可能進行上下文切換。每秒定時中斷的次數與架構和核心版本有關。一個檢查中斷頻率的簡單方法是用/proc/interrupts檔案,它可以确定已知時長内發生的中斷次數。如清單2.1所示。

清單2.1

在清單2.1中,我們要求核心給出定時器啟動的次數,等待10秒後,再次請求。這就是說,在這台機器上定時器啟動頻率為(24 070 093-24 060 043)中斷/(10秒)或者約1000次中斷/秒。如果你的上下文切換明顯多于定時器中斷,那麼這些切換極有可能是由i/o請求或其他長時間運作的系統調用(如休眠)造成的。當應用請求的操作不能立即完成時,核心啟動該操作,儲存請求程序,并嘗試切換到另一個已就緒程序。這能讓處理器盡量保持忙狀态。

2.1.3 中斷

此外,處理器還周期性地從硬體裝置接收中斷。當裝置有事件需要核心處理時,它通常就會觸發這些中斷。比如,如果磁盤控制器剛剛完成從驅動器取資料塊的操作,并準備好提供給核心,那麼磁盤控制器就會觸發一個中斷。對核心收到的每個中斷,如果已經有相應的已注冊的中斷處理程式,就運作該程式,否則将忽略這個中斷。這些中斷處理程式在系統中具有很高的運作優先級,并且通常執行速度也很快。有時,中斷處理程式有工作要做,但是又不需要高優先級,是以它可以啟動“下半部”(bottom half),也就是所謂的軟中斷處理程式。如果有很多中斷,核心會花大量的時間服務這些中斷。檢視/proc/interrupts檔案可以顯示出哪些cpu上觸發了哪些中斷。

2.1.4 cpu使用率

cpu使用率是個簡單的概念。在任何給定的時間,cpu可以執行以下七件事情中的一個:

(1)cpu可以是空閑的,這意味着處理器實際上沒有做任何工作,并且等待有任務可以執行。

(2)cpu可以運作使用者代碼,即指定的“使用者”時間。

(3)cpu可以執行linux核心中的應用程式代碼,這就是“系統”時間。

(4)cpu可以執行“比較友好”的或者優先級被設定為低于一般程序的使用者代碼。

(5)cpu可以處于iowait狀态,即系統正在等待i/o(如磁盤或網絡)完成。

(6)cpu可以處于irq狀态,即它正在用高優先級代碼處理硬體中斷。

(7)cpu可以處于softirq模式,即系統正在執行同樣由中斷觸發的核心代碼,隻不過其運作于較低優先級(下半部代碼)。

此情景出現的條件為:發生裝置中斷時,而核心在将其移交給使用者空間之前必須對其進行一些處理(比如,處理網絡包)。

大多數性能工具将這些數值表示為占cpu總時間的百分比。這些時間的範圍從0%到100%,但全部三項加起來等于100%。一個具有高“系統”百分比的系統表明其大部分時間都消耗在了核心上。像oprofile一樣的工具可以幫助确定時間都消耗在了哪裡。具有高“使用者”時間的系統則将其大部分時間都用來運作應用程式。下一章展示在上述情況下,如何用性能工具追蹤問題。如果系統在應該工作的時候花費了大量的時間處于iowait狀态,那它很可能在等待來自裝置的i/o。導緻速度變慢的原因可能是磁盤、網卡或其他裝置。

繼續閱讀