Linux性能优化2.1 CPU性能统计信息
摘要
性能工具:系統(tǒng)CPU
本章概述了系統(tǒng)級的Linux性能工具。這些工具是你追蹤性能問題時(shí)的第一道防線。它們能展示整個(gè)系統(tǒng)的性能情況和哪些部分表現(xiàn)不好。本章將討論這些工具可以測量的統(tǒng)計(jì)信息,以及如何使用各種工具收集這些統(tǒng)計(jì)結(jié)果。閱讀本章后,你將能夠:
理解系統(tǒng)級性能的基本指標(biāo),包括CPU的使用情況。
明白哪些工具可以檢索這些系統(tǒng)級性能指標(biāo)。
2.1 CPU性能統(tǒng)計(jì)信息
每一種系統(tǒng)級Linux性能工具都提供了不同的方式來提取相似的統(tǒng)計(jì)結(jié)果。雖然沒有工具能顯示全部的信息,但是有些工具顯示的是相同的統(tǒng)計(jì)信息。為了不多次(每種工具一次)解釋統(tǒng)計(jì)信息的含義,我們在描述所有工具之前對這些信息進(jìn)行一次性說明。
2.1.1 運(yùn)行隊(duì)列統(tǒng)計(jì)
在Linux中,一個(gè)進(jìn)程要么是可運(yùn)行的,要么是阻塞的(正在等待一個(gè)事件的完成)。阻塞進(jìn)程可能在等待的是從I/O設(shè)備來的數(shù)據(jù),或者是系統(tǒng)調(diào)用的結(jié)果。如果進(jìn)程是可運(yùn)行的,那就意味著它要和其他也是可運(yùn)行的進(jìn)程競爭CPU時(shí)間。一個(gè)可運(yùn)行的進(jìn)程不一定會(huì)使用CPU,但是當(dāng)Linux調(diào)度器決定下一個(gè)要運(yùn)行的進(jìn)程時(shí),它會(huì)從可運(yùn)行進(jìn)程隊(duì)列中挑選。如果進(jìn)程是可運(yùn)行的,同時(shí)又在等待使用處理器,這些進(jìn)程就構(gòu)成了運(yùn)行隊(duì)列。運(yùn)行隊(duì)列越長,處于等待狀態(tài)的進(jìn)程就越多。
性能工具通常會(huì)給出可運(yùn)行的進(jìn)程個(gè)數(shù)和等待I/O的阻塞進(jìn)程個(gè)數(shù)。另一種常見的系統(tǒng)統(tǒng)計(jì)是平均負(fù)載。系統(tǒng)的負(fù)載是指正在運(yùn)行和可運(yùn)行的進(jìn)程總數(shù)。比如,如果正在運(yùn)行的進(jìn)程為兩個(gè),而可運(yùn)行的進(jìn)程為三個(gè),那么系統(tǒng)負(fù)載就是5。平均負(fù)載是給定時(shí)間內(nèi)的負(fù)載量。一般情況下,取平均負(fù)載的時(shí)間為1分鐘、5分鐘和15分鐘。這能讓你觀察到負(fù)載是如何隨時(shí)間變化的。
2.1.2 上下文切換
大部分現(xiàn)代處理器一次只能運(yùn)行一個(gè)進(jìn)程或線程。雖然有些處理器(比如超線程處理器)實(shí)際上可以同時(shí)運(yùn)行多個(gè)進(jìn)程,但是Linux會(huì)把它們看作多個(gè)單線程處理器。如果要制造出給定單處理器同時(shí)運(yùn)行多個(gè)任務(wù)的假象,Linux內(nèi)核就要不斷地在不同的進(jìn)程間切換。這種不同進(jìn)程間的切換稱為上下文切換,因?yàn)楫?dāng)其發(fā)生時(shí),CPU要保存舊進(jìn)程的所有上下文信息,并取出新進(jìn)程的所有上下文信息。上下文中包含了Linux跟蹤新進(jìn)程的大量信息,其中包括:進(jìn)程正在執(zhí)行的指令,分配給進(jìn)程的內(nèi)存,進(jìn)程打開的文件等。這些上下文切換涉及大量信息的移動(dòng),因此,上下文切換的開銷可以是相當(dāng)大的。盡量減少上下文切換的次數(shù)是個(gè)好主意。
要避免上下文切換,重要的一點(diǎn)是了解它們是如何發(fā)生的。首先,上下文切換可以是內(nèi)核調(diào)度的結(jié)果。為了保證公平地給每個(gè)進(jìn)程分配處理器時(shí)間,內(nèi)核周期性地中斷正在運(yùn)行的進(jìn)程,在適當(dāng)?shù)那闆r下,內(nèi)核調(diào)度器會(huì)決定開始另一個(gè)進(jìn)程,而不是讓當(dāng)前進(jìn)程繼續(xù)執(zhí)行。每次這種周期性中斷或定時(shí)發(fā)生時(shí),你的系統(tǒng)都可能進(jìn)行上下文切換。每秒定時(shí)中斷的次數(shù)與架構(gòu)和內(nèi)核版本有關(guān)。一個(gè)檢查中斷頻率的簡單方法是用/proc/interrupts文件,它可以確定已知時(shí)長內(nèi)發(fā)生的中斷次數(shù)。如清單2.1所示。
清單2.1
?
在清單2.1中,我們要求內(nèi)核給出定時(shí)器啟動(dòng)的次數(shù),等待10秒后,再次請求。這就是說,在這臺機(jī)器上定時(shí)器啟動(dòng)頻率為(24 070 093-24 060 043)中斷/(10秒)或者約1000次中斷/秒。如果你的上下文切換明顯多于定時(shí)器中斷,那么這些切換極有可能是由I/O請求或其他長時(shí)間運(yùn)行的系統(tǒng)調(diào)用(如休眠)造成的。當(dāng)應(yīng)用請求的操作不能立即完成時(shí),內(nèi)核啟動(dòng)該操作,保存請求進(jìn)程,并嘗試切換到另一個(gè)已就緒進(jìn)程。這能讓處理器盡量保持忙狀態(tài)。
2.1.3 中斷
此外,處理器還周期性地從硬件設(shè)備接收中斷。當(dāng)設(shè)備有事件需要內(nèi)核處理時(shí),它通常就會(huì)觸發(fā)這些中斷。比如,如果磁盤控制器剛剛完成從驅(qū)動(dòng)器取數(shù)據(jù)塊的操作,并準(zhǔn)備好提供給內(nèi)核,那么磁盤控制器就會(huì)觸發(fā)一個(gè)中斷。對內(nèi)核收到的每個(gè)中斷,如果已經(jīng)有相應(yīng)的已注冊的中斷處理程序,就運(yùn)行該程序,否則將忽略這個(gè)中斷。這些中斷處理程序在系統(tǒng)中具有很高的運(yùn)行優(yōu)先級,并且通常執(zhí)行速度也很快。有時(shí),中斷處理程序有工作要做,但是又不需要高優(yōu)先級,因此它可以啟動(dòng)“下半部”(bottom half),也就是所謂的軟中斷處理程序。如果有很多中斷,內(nèi)核會(huì)花大量的時(shí)間服務(wù)這些中斷。查看/proc/interrupts文件可以顯示出哪些CPU上觸發(fā)了哪些中斷。
2.1.4 CPU使用率
CPU使用率是個(gè)簡單的概念。在任何給定的時(shí)間,CPU可以執(zhí)行以下七件事情中的一個(gè):
(1)CPU可以是空閑的,這意味著處理器實(shí)際上沒有做任何工作,并且等待有任務(wù)可以執(zhí)行。
(2)CPU可以運(yùn)行用戶代碼,即指定的“用戶”時(shí)間。
(3)CPU可以執(zhí)行Linux內(nèi)核中的應(yīng)用程序代碼,這就是“系統(tǒng)”時(shí)間。
(4)CPU可以執(zhí)行“比較友好”的或者優(yōu)先級被設(shè)置為低于一般進(jìn)程的用戶代碼。
(5)CPU可以處于iowait狀態(tài),即系統(tǒng)正在等待I/O(如磁盤或網(wǎng)絡(luò))完成。
(6)CPU可以處于irq狀態(tài),即它正在用高優(yōu)先級代碼處理硬件中斷。
(7)CPU可以處于softirq模式,即系統(tǒng)正在執(zhí)行同樣由中斷觸發(fā)的內(nèi)核代碼,只不過其運(yùn)行于較低優(yōu)先級(下半部代碼)。
此情景出現(xiàn)的條件為:發(fā)生設(shè)備中斷時(shí),而內(nèi)核在將其移交給用戶空間之前必須對其進(jìn)行一些處理(比如,處理網(wǎng)絡(luò)包)。
大多數(shù)性能工具將這些數(shù)值表示為占CPU總時(shí)間的百分比。這些時(shí)間的范圍從0%到100%,但全部三項(xiàng)加起來等于100%。一個(gè)具有高“系統(tǒng)”百分比的系統(tǒng)表明其大部分時(shí)間都消耗在了內(nèi)核上。像oprofile一樣的工具可以幫助確定時(shí)間都消耗在了哪里。具有高“用戶”時(shí)間的系統(tǒng)則將其大部分時(shí)間都用來運(yùn)行應(yīng)用程序。下一章展示在上述情況下,如何用性能工具追蹤問題。如果系統(tǒng)在應(yīng)該工作的時(shí)候花費(fèi)了大量的時(shí)間處于iowait狀態(tài),那它很可能在等待來自設(shè)備的I/O。導(dǎo)致速度變慢的原因可能是磁盤、網(wǎng)卡或其他設(shè)備。
總結(jié)
以上是生活随笔為你收集整理的Linux性能优化2.1 CPU性能统计信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《统计会犯错——如何避免数据分析中的统计
- 下一篇: 《Unity着色器和屏幕特效开发秘笈(原