天天看點

初識Linux系統性能分析和調優系統調優介紹Linux性能檢測工具和系統調優參數

在實施過程中有時遇到需要對運作的系統性能進行分析,更多的是系統出現問題,需要定位問題原因或者分析系統運作瓶頸。以下是我找到的資料,記錄并學習。

系統調優介紹

我們可以在文章的開始就列出一個清單,列出可能影響Linux作業系統性能的一些調優參數,但這樣做其實并沒有什麼價值。因為性能調優是一個非常困難的任務,它要求對硬體、作業系統、和應用都有着相當深入的了解。如果性能調優非常簡單的話,那些我們要列出的調優參數早就寫入硬體的微碼或者作業系統中了。正如下圖所示,伺服器性能受到多方面原因的影響:

初識Linux系統性能分析和調優系統調優介紹Linux性能檢測工具和系統調優參數

系統性能是受到多方面因素的影響的,了解作業系統管理系統資源的方法将幫助我們在面對問題時更好的判斷應該對哪個子系統進行調整。

CPU排程

關于CPU排程政策,這是個很複雜的課題,這裡我隻是簡單的了解下些基本的知識。

任何計算機的基本功能都十分簡單,那就是計算。為了實作計算的功能就必須有一個方法去管理計算資源、處理器和計算任務(也被叫做線程或者程序)。非常感謝Ingo Molnar,他為Linux核心帶來了O(1)CPU排程器,差別于舊有的O(n)排程器,新的排程器是動态的,可以支援負載均衡,并以恒定的速度進行操作。

新排程器的可擴充性非常好,無論程序數量或者處理器數量,并且排程器本身的系統開銷更少。新調取器的算法使用兩個優先級隊列:活動運作隊列和過期運作隊列。

排程器的一個重要目标是根據優先級權限有效地為程序配置設定CPU 時間片,當配置設定完成後它被列在CPU的運作隊列中,除了 CPU 的運作隊列之外,還有一個過期運作隊列。當活動運作隊列中的一個任務用光自己的時間片之後,它就被移動到過期運作隊列中。在移動過程中,會對其時間片重新進行計算。如果活動運作隊列中已經沒有某個給定優先級的任務了,那麼指向活動運作隊列和過期運作隊列的指針就會交換,這樣就可以讓過期優先級清單變成活動優先級的清單。通常互動式程序(相對與實時程序而言)都有一個較高的優先級,它占有更長的時間片,比低優先級的程序獲得更多的計算時間,但通過排程器自身的調整并不會使低優先級的程序完全被餓死。新排程器的優勢是顯著的改變Linux核心的可擴充性,使新核心可以更好的處理一些有大量程序、大量處理器組成的企業級應用。

linux記憶體架構

今天我們面對選擇32位作業系統還是64位作業系統的情況。對企業級使用者它們之間最大的差別是64位作業系統可以支援大于4GB的記憶體尋址。從性能角度來講,我們需要了解32位和64位作業系統都是如何進行實體記憶體和虛拟記憶體的映射的。

初識Linux系統性能分析和調優系統調優介紹Linux性能檢測工具和系統調優參數

在上面圖示中我們可以看到64位和32位Linux核心在尋址上有着顯著的不同。

在32位架構中,比如IA-32,Linux核心可以直接尋址的範圍隻有實體記憶體的第一個GB(如果去掉保留部分還剩下896MB),通路記憶體必須被映射到這小于1GB的所謂ZONE_NORMAL空間中,這個操作是由應用程式完成的。但是配置設定在ZONE_HIGHMEM中的記憶體頁将導緻性能的降低。

在另一方面,64位架構比如x86-64(也稱作EM64T或者AMD64)。ZONE_NORMAL空間将擴充到64GB或者128GB(實際上可以更多,但是這個數值受到作業系統本身支援記憶體容量的限制)。正如我們看到的,使用64位作業系統我們排除了因ZONE_HIGHMEM部分記憶體對性能的影響的情況。

實際中,在32位架構下,由于上面所描述的記憶體尋址問題,對于大記憶體,高負載應用,會導緻當機或嚴重緩慢等問題。雖然使用hugemen核心可緩解,但采取x86_64架構是最佳的解決辦法。

虛拟記憶體管理

因為作業系統将記憶體都映射為虛拟記憶體,是以作業系統的實體記憶體結構對使用者和應用來說通常都是不可見的。如果想要了解Linux系統記憶體的調優,我們必須了解Linux的虛拟記憶體機制。應用程式并不配置設定實體記憶體,而是向Linux核心請求一部分映射為虛拟記憶體的記憶體空間。如下圖所示虛拟記憶體并不一定是映射實體記憶體中的空間,如果應用程式有一個大容量的請求,也可能會被映射到在磁盤子系統中的swap空間中。

另外要提到的是,通常應用程式不直接将資料寫到磁盤子系統中,而是寫入緩存和緩沖區中。Bdflush守護程序将定時将緩存或者緩沖區中的資料寫到硬碟上。

Linux核心處理資料寫入磁盤子系統和管理磁盤緩存是緊密聯系在一起的。相對于其他的作業系統都是在記憶體中配置設定指定的一部分作為磁盤緩存,Linux處理記憶體更加有效,預設情況下虛拟記憶體管理器配置設定所有可用記憶體空間作為磁盤緩存,這就是為什麼有時我們觀察一個配置有數G記憶體的Linux系統可用記憶體隻有20MB的原因。

同時Linux使用swap空間的機制也是相當高效率的,如上圖所示虛拟記憶體空間是由實體記憶體和磁盤子系統中的swap空間共同組成的。如果虛拟記憶體管理器發現一個已經配置設定完成的記憶體分頁已經長時間沒有被調用,它将把這部分記憶體分頁移到swap空間中。經常我們會發現一些守護程序,比如getty,會随系統啟動但是卻很少會被應用到。這時為了釋放昂貴的主記憶體資源,系統會将這部分記憶體分頁移動到swap空間中。上述就是Linux使用swap空間的機制,當swap分區使用超過50%時,并不意味着實體記憶體的使用已經達到瓶頸了,swap空間隻是Linux核心更好的使用系統資源的一種方法。

Linux性能檢測工具和系統調優參數

以下記錄常用的檢測指令、軟體和相關的調優參數

uptime

Uptime指令的顯示結果包括伺服器已經運作了多長時間,有多少登陸使用者和對伺服器性能的總體評估(load average)。load average值分别記錄了上個1分鐘,5分鐘和15分鐘間隔的負載情況,load average不是一個百分比,而是在隊列中等待執行的程序的數量。如果程序要求CPU時間被阻塞(意味着CPU沒有時間處理它),load average值将增加。另一方面,如果每個程序都可以立刻得到通路CPU的時間,這個值将減少。

load average的最佳值是1,這說明每個程序都可以立刻被CPU處理,當然,更低不會有問題,隻說明浪費了一部分的資源。但在不同的系統間這個值也是不同的,例如一個單CPU的工作站,load average為1或者2都是可以接受的,而在一個多CPU的系統中這個值應除以實體CPU的個數,例如,一個16個核的伺服器檢測到如下内容

[[email protected] ~]# uptime 
 16:40:51 up 38 days,  1:24,  1 user,  load average: 16.00, 16.00, 16.00
           

你可以使用uptime判斷一個性能問題是出現在伺服器上還是網絡上。例如,如果一個網絡應用運作性能不理想,運作uptime檢查系統負載是否比較高,如果不是這個問題更可能出現在你的網絡上。

top

Top指令顯示了實際CPU使用情況,預設情況下,它顯示了伺服器上占用CPU的任務資訊并且每5秒鐘重新整理一次。你可以通過多種方式分類它們,包括PID、時間和記憶體使用情況。

初識Linux系統性能分析和調優系統調優介紹Linux性能檢測工具和系統調優參數

參數介紹:

PID:程序辨別
USER;程序所有者的使用者名
PRI:程序的優先級
NI:nice級别
SIZE:程序占用的記憶體數量(代碼+資料+堆棧)
RSS;程序使用的實體記憶體數量
SHARE;該程序和其他程序共享記憶體的數量
STAT:程序的狀态:S=休眠狀态,R=運作狀态,T=停止狀态,D=中斷休眠狀态,Z=僵屍狀态
%CPU:共享的CPU使用
%MEM;共享的實體記憶體
TIME:程序占用CPU的時間
COMMAND:啟動任務的指令行(包括參數)
·CPU utilization
這是一個很簡單的參數,它直覺的描述了每個CPU的使用率。在xSeries架構中,如果CPU的使用率長時間的超過%,就可能是出現了處理器的瓶頸。
·Runable processes
這個值描述了正在準備被執行的程序,在一個持續時間裡這個值不應該超過實體CPU數量的倍,否則CPU方面就可能存在瓶頸。
·Blocked
描述了那些因為等待I/O操作結束而不能被執行的程序,Blocked可能指出你正面臨I/O瓶頸。
·User time
描述了處理使用者程序的百分比,包括nice time。如果User time的值很高,說明系統性能用在處理實際的工作。
·System time
描述了CPU花費在處理核心操作包括IRQ和軟體中斷上面的百分比。如果system time很高說明系統可能存在網絡或者驅動堆棧方面的瓶頸。一個系統通常隻花費很少的時間去處理核心的操作。
·Idle time
描述了CPU空閑的百分比。
·Nice time
描述了CPU花費在處理re-nicing程序的百分比。
·Context switch
系統中線程之間進行交換的數量。
·Waiting
CPU花費在等待I/O操作上的總時間,與blocked相似,一個系統不應該花費太多的時間在等待I/O操作上,否則你應該進一步檢測I/O子系統是否存在瓶頸。
·Interrupts
Interrupts值包括硬Interrupts和軟Interrupts,硬Interrupts會對系統性能帶來更多的不利影響。高的Interrupts值指出系統可能存在一個軟體的瓶頸,可能是核心或者驅動程式。注意Interrupts值中包括CPU時鐘導緻的中斷(現代的xServer系統每秒個Interrupts值)
           

nice

程序優先級是一個決定程序被CPU執行優先順序的參數,核心會根據需要調整這個值。Nice值是一個對優先權的限制。程序優先級的值不能低于nice值。(nice值越低優先級越高)

程序優先級是無法去手動改變的,隻有通過改變nice值去間接的調整程序優先級。如果一個程序運作的太慢了,你可以通過指定一個較低的nice值去為它配置設定更多的CPU資源。當然,這意味着其他的一些程序将被配置設定更少的CPU資源,運作更慢一些。Linux支援nice值的範圍是19(低優先級)到-20(高優先級),預設的值是0。如果需要改變一個程序的nice值為負數(高優先級),必須使用su指令登陸到root使用者。下面是一些調整nice值的指令示例,

以nice值為-5執行檔案xyz

改變已經運作的程式的nice值

#renice level pid
#renice 10 2500
           

僵屍程序

當一個程序被結束,在它結束之前通常需要用一些時間去完成所有的任務(比如關閉打開的檔案),在一個很短的時間裡,這個程序的狀态為僵屍狀态。在程序完成所有關閉任務之後,會向父程序送出它關閉的資訊。有些情況下,一個僵屍程序不能關閉它自己,這時這個程序狀态就為z(zombie)。不能使用kill指令殺死僵屍程序,因為它已經标志為“dead”。如果你無法擺脫一個僵屍程序,你可以殺死它的父程序,這個僵屍程序也就消失了。然而,如果父程序是init程序,你不能殺死init程序,因為init是一個重要的系統程序,這種情況下你隻能通過一次重新啟動伺服器來擺脫僵屍程序。

iostat

iostat是sysstat包的一部分。Iostat顯示自系統啟動後的平均CPU時間(與uptime類似),它也可以顯示磁盤子系統的使用情況,iostat可以用來監測CPU使用率和磁盤使用率

初識Linux系統性能分析和調優系統調優介紹Linux性能檢測工具和系統調優參數

Device:塊裝置名

Tps:裝置每秒進行傳輸的數量(每秒的I/O請求)。多個單獨的I/O請求可以被組成一個傳輸操作,因為一個傳輸操作可以是不同的容量。

Blk_read/s, Blk_wrtn/s:該裝置每秒讀寫的塊的數量。塊可能為不同的容量。

Blk_read, lk_wrtn:自系統啟動以來讀寫的塊裝置的總量。

vmstat

Vmstat指令提供了對程序、記憶體、頁面I/O塊和CPU等資訊的監控,vmstat可以顯示檢測結果的平均值或者取樣值,取樣模式可以提供一個取樣時間段内不同頻率的監測結果

初識Linux系統性能分析和調優系統調優介紹Linux性能檢測工具和系統調優參數
·process(procs)
r:等待運作時間的程序數量
b:處在不可中斷睡眠狀态的程序
w:被交換出去但是仍然可以運作的程序,這個值是計算出來的
·memoryswpd:虛拟記憶體的數量
free:空閑記憶體的數量
buff:用做緩沖區的記憶體數量
·swap
si:從硬碟交換來的塊數量
so:交換到硬碟去的塊數量
·IO
bi:向一個塊裝置輸出的塊數量
bo:從一個塊裝置接受的塊數量
·system
in:每秒發生的中斷數量, 包括時鐘
cs:每秒發生的context switches的數量
·cpu(整個cpu運作時間的百分比)
us:非核心代碼運作的時間(使用者時間,包括nice時間)
sy:核心代碼運作的時間(系統時間)
id:空閑時間,在Linux 之前的核心版本中,這個值包括I/O等待時間;
wa:等待I/O操作的時間
           

ps、pstree

free

以上為總結的資料

繼續閱讀