电竞比分网-中国电竞赛事及体育赛事平台

分享

10條命令,一分鐘分析Linux性能問(wèn)題

 昵稱28748685 2015-12-11

當(dāng)你登錄到一臺(tái)存在性能問(wèn)題的Linux服務(wù)器上時(shí),在頭一分鐘,你會(huì)檢查什么?


我們看看Netflix的性能工程師是怎么做的。


Netflix大量使用EC2 Linux服務(wù)器,很多時(shí)候是用一些較為高層的工具做云或?qū)嵗龑哟蔚姆治?。不過(guò)有時(shí)仍然需要登錄到某個(gè)實(shí)例上,運(yùn)行一些標(biāo)準(zhǔn)的Linux性能工具。


在最開(kāi)始的一分鐘內(nèi),可以先利用手頭的標(biāo)準(zhǔn)Linux工具大致了解性能狀況。借助如下10條命令(有些命令需要安裝sysstat包),了解系統(tǒng)資源使用狀況和正在運(yùn)行的進(jìn)程。先檢查錯(cuò)誤(errors)和飽和度(saturation),再檢查資源利用率(resource utilization)。飽和度指的是負(fù)載已經(jīng)超過(guò)處理能力,像請(qǐng)求隊(duì)列的長(zhǎng)度,等待時(shí)間等。


uptime

dmesg | tail

vmstat 1

mpstat -P ALL 1

pidstat 1

iostat -xz 1

free -m

sar -n DEV 1

sar -n TCP,ETCP 1

top


這里要提一下定位性能瓶頸的USE方法。在Brendan Gregg的《System Performance: Enterprise and the Cloud》(中譯本:《性能之巔:洞悉系統(tǒng)、企業(yè)與云計(jì)算》)一書中有具體的描述。


如果手頭有這本書的中譯本,可以看一下36頁(yè):


USE方法(utilization、utilization、errors)應(yīng)用于性能研究,用來(lái)識(shí)別系統(tǒng)瓶頸。一言以蔽之,就是:


對(duì)于所有的資源,查看它的使用率、飽和度和錯(cuò)誤。


這些術(shù)語(yǔ)定義如下。


  • 資源:所有服務(wù)器物理元器件(CPU、總線……)。某些軟件資源也能算在內(nèi),提供有用的指標(biāo)。

  • 使用率:在規(guī)定的時(shí)間間隔內(nèi),資源用于服務(wù)工作的時(shí)間百分比。雖然資源繁忙,但是資源還有能力接受更多的工作,不能接受更多工作的程度被視為飽和度。

  • 飽和度:資源不能再服務(wù)更多額外工作的程度,通常有等待隊(duì)列。

  • 錯(cuò)誤:錯(cuò)誤事件的個(gè)數(shù)。


……


USE方法會(huì)將分析引導(dǎo)到一定數(shù)量的關(guān)鍵指標(biāo)上,這樣可以盡快地核實(shí)所有的系統(tǒng)資源。在此之后,如果還沒(méi)有找到問(wèn)題,那么可以考慮采用其他的方法。


下面具體看一下這10條命令。


  1. uptime





快速查看平均負(fù)載(任務(wù)對(duì)CPU資源的需求)。輸出中的“l(fā)oad average:”后面的三個(gè)數(shù)字,是系統(tǒng)在1分鐘、5分鐘和15分鐘內(nèi)的平均負(fù)載。表示負(fù)載隨時(shí)間的變化情況。


它給出的只是一個(gè)較為高層的情況,往往需要借助其他工具進(jìn)一步確認(rèn)性能問(wèn)題,有時(shí)候需要通過(guò)其他一些指標(biāo)來(lái)了解CPU負(fù)載,例如vmstat或mpstat。


2. dmesg | tail





查看最后10條系統(tǒng)消息。查找可能會(huì)引發(fā)性能問(wèn)題的錯(cuò)誤。千萬(wàn)不要漏掉這一步。


3. vmstat 1





統(tǒng)計(jì)虛擬內(nèi)存信息。參數(shù)1指的是打印1秒內(nèi)的統(tǒng)計(jì)信息。


要檢查的列:


  • r:運(yùn)行隊(duì)列的長(zhǎng)度(這個(gè)參數(shù)的解釋,建議參考《性能之巔》一書)??梢愿玫卮_定CPU的飽和度?!皉”值大于CPU數(shù)則為飽和。

  • free:以kb為單位的空閑內(nèi)存。如果這個(gè)值很大,說(shuō)明有足夠的空閑內(nèi)存。下面將介紹的第7條命令——“free -m”,可以更好地解釋空閑內(nèi)存的狀態(tài)。

  • si, so:換入的內(nèi)存和換出的內(nèi)存。如果它們不為0,說(shuō)明內(nèi)存已經(jīng)耗盡。

  • us, sy, id, wa, st:CPU時(shí)間的不同組成部分,是所有CPU的平均數(shù)。分別表示用戶態(tài)時(shí)間、系統(tǒng)態(tài)時(shí)間(內(nèi)核)、空閑、等待I/O以及竊取時(shí)間(stolen time,虛擬化環(huán)境下,CPU在其他租戶上的開(kāi)銷)。


將用戶態(tài)時(shí)間和系統(tǒng)態(tài)時(shí)間相加,可以判斷CPU是否忙碌。如果一直有等待I/O,表明存在磁盤瓶頸。因?yàn)槿蝿?wù)阻塞等待磁盤I/O,此時(shí)CPU是空閑的??梢詫⒌却?/span>I/O看作另一種形式的CPU空閑。


I/O處理一定會(huì)消耗系統(tǒng)態(tài)時(shí)間。如果系統(tǒng)時(shí)間平均占比很高,比如說(shuō)超過(guò)20%,或許可以深入研究一下:可能是內(nèi)核處理I/O的效率不高。


4. mpstat -P ALL 1





打印每個(gè)CPU的狀況??梢詸z查各CPU的負(fù)載是否均衡。比如,如果一個(gè)CPU很熱,可能是單線程應(yīng)用造成的。


5. pidstat 1





pidstat按進(jìn)程打印CPU的使用情況。循環(huán)輸出活動(dòng)進(jìn)程的信息??捎糜谟^察模式隨時(shí)間的變化情況。用戶也可以把觀察到的信息記錄下來(lái),以供分析研究。


像圖中的例子,可以看到有2個(gè)Java進(jìn)程消耗了大部分CPU時(shí)間。“%CPU”這一列是所有CPU的整體情況,“1591%”這個(gè)值表明這2個(gè)Java進(jìn)程幾乎占用了16個(gè)CPU。


6. iostat -xz 1





這是了解塊設(shè)備的一個(gè)極佳工具,能看到實(shí)際負(fù)載和性能信息。


  • r/s, w/s, rkB/s, wkB/s:分別表示每秒發(fā)給磁盤設(shè)備的讀請(qǐng)求數(shù),每秒發(fā)給磁盤設(shè)備的寫請(qǐng)求數(shù),每秒從磁盤設(shè)備讀取的KB數(shù),每秒向磁盤設(shè)備寫入的KB數(shù)??梢允褂盟鼈儽硎矩?fù)載特性。性能問(wèn)題可能就是由過(guò)多的負(fù)載造成的。

  • await:平均I/O響應(yīng)時(shí)間,單位為毫秒。包括排隊(duì)時(shí)間和服務(wù)時(shí)間。如果它大于預(yù)期的平均時(shí)間,可能是設(shè)備已經(jīng)飽和,也可能是設(shè)備存在問(wèn)題。

  • avgqu-sz:提交到設(shè)備的平均請(qǐng)求數(shù)。如果大于1,設(shè)備可能已經(jīng)飽和。

  • %util:設(shè)備使用率。設(shè)備忙于處理請(qǐng)求的百分比。如果大于60%,通常會(huì)導(dǎo)致較差的性能(可以在await中看出來(lái)),不過(guò)也與具體的設(shè)備有關(guān)。如果接近100%,通常意味著設(shè)備已經(jīng)飽和。


如果存儲(chǔ)設(shè)備是后面有多塊磁盤支撐的邏輯磁盤,即使設(shè)備使用率是100%,后端磁盤也可能遠(yuǎn)沒(méi)有飽和,而是還能處理更多工作。


7. free -m





主要看最右邊的兩列:


  • buffers:用于塊設(shè)備I/O的緩沖區(qū)高速緩存的大小。

  • cached:文件系統(tǒng)使用的頁(yè)緩存大小。


我們只需要檢查這兩個(gè)值,如果它們接近0,則會(huì)導(dǎo)致更高的磁盤I/O(可以使用iostat確認(rèn)),性能更糟。圖中的例子,這個(gè)狀況看上去還不錯(cuò)。


8. sar -n DEV 1





使用該工具檢查網(wǎng)絡(luò)接口的吞吐量,以rxkB/s和txkB/s為手段測(cè)量負(fù)載


9. sar -n TCP,ETCP 1





這是一些關(guān)鍵TCP指標(biāo)的總結(jié)。其中包括:


  • active/s:每秒本地發(fā)起的TCP連接數(shù)(比如通過(guò)connect())。

  • passive/s:每秒遠(yuǎn)端發(fā)起的TCP連接數(shù)(比如通過(guò)accept())。

  • retrans/s:每秒TCP重傳數(shù)。


active和passive連接數(shù)通常用于粗略地測(cè)量服務(wù)器負(fù)載。方便起見(jiàn),可以把a(bǔ)ctive看作向外的連接,把passive看作向內(nèi)的連接;不過(guò)也有不嚴(yán)格之處,比如考慮從localhost到localhost的連接。


重傳數(shù)是網(wǎng)絡(luò)或服務(wù)器問(wèn)題的一個(gè)信號(hào):可能是網(wǎng)絡(luò)不可靠;也可能是服務(wù)器過(guò)載和丟包。像圖中的例子,每秒只有一個(gè)新的TCP連接。


10. top





top命令包含很多前面檢查過(guò)的指標(biāo)??梢杂脗€(gè)命令來(lái)檢查是不是有指標(biāo)和之前命令的輸出差距很大。


top命令有個(gè)缺點(diǎn),很難看出某個(gè)指標(biāo)隨時(shí)間的變化模式,這種情況下用像vmstat和pidstat這樣的命令可能更清楚,它們能提供滾動(dòng)輸出。間歇性問(wèn)題的一些跡象,如果不能足夠快地暫停輸出(Ctrl-S暫停,Ctrl-Q繼續(xù)),可能會(huì)錯(cuò)過(guò)。


后續(xù)分析


可以借助更多命令繼續(xù)深入挖掘。重點(diǎn)推薦Brendan Gregg的《性能之巔:洞悉系統(tǒng)、企業(yè)與云計(jì)算》)一書。


本文根據(jù)Netflix的技術(shù)博客編譯整理,結(jié)合自己讀書的一些心得寫就。更多細(xì)節(jié),可以點(diǎn)擊閱讀原文,查看相關(guān)博客,或者閱讀《性能之巔》一書。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多