選單

Linux入門必看:如何在60秒內分析Linux效能?

導語 | 當你登陸一臺Linux伺服器之後,因為一個問題要做效能分析時,你會在第1分鐘內做哪些檢測呢?本文將詳細為你介紹在最開始的60秒,如何在命令列模式下,使用已有的Linux標準工具來進行效能最佳化檢測。

(本文譯自Linux文獻:Linux Performance Analysis in 60,000 Milliseconds。

原文:https://netflixtechblog。com/linux-performance-analysis-in-60-000-milliseconds-accc10403c55)

在Netflix,我們有很多EC2的Linux機器,並且也需要很多效能分析工具來監控和檢查它們的效能。包括有針對雲上的監控工具Atlas和按需要進行例項分析的Vector。雖然這些工具能幫助我們解決大多數問題,但是我們有時候還需要登陸機器例項去執行一些標準的Linux效能分析工具。

一、最開始的60秒:摘要

在60秒內只需要透過執行下面的10個命令就可以對系統資源使用和執行程序有一個很高程度的瞭解。尋找錯誤資訊和飽和度指標,並且可以顯示為請求佇列的長度,或者等待時長。因為它們都很容易理解,然後就是資源利用率。飽和度是指一個資源已經超過了它自己的負荷能力。

有些命令需要安裝sysstat工具包。這些命令展示的指標會幫助你完成一些USE(Utilization,Saturation,Errors)方法:定位效能瓶頸的方法論。包括了檢查使用率(Utilization),飽和度(Saturation),所有資源(比如CPU,記憶體,磁碟等)的錯誤指標(Errors)。同樣也要關注你什麼時候檢查和排除一個資源問題,因為透過排除可以縮小分析範圍,同時也指導了任何後續的檢查。

下面的章節將會透過一個生產系統中的例子來介紹這些命令。要了解更多這些工具的資訊,也可以檢視它們的幫助手冊。

(一)uptime

這是一個快速展示系統平均負載的方法,這也指出了等待執行程序的數量。在Linux系統中,這些數字包括等待CPU執行的程序數,也包括了被不可中斷I/O(通常是磁碟I/O)阻塞的程序。這給出了資源負載的很直接的展示,可以在沒有其它工具的幫助下更好的理解這些資料。它是唯一快捷的檢視系統負載的方式。

這三個數字是以遞減的方式統計了過去1分鐘,5分鐘和15分鐘常數的平均數。這三個數字給我們直觀展示了隨著時間的變化系統負載如何變化。例如,如果你被叫去檢視一個有問題的伺服器,並且1分鐘的所代表的值比15分鐘的值低很多,那麼你可能由於太遲登陸機器而錯過了問題發生的時間點。

在上面的例子中,平均負載顯示是在不斷增加的,1分鐘的值是30,相比15分鐘的值19來說是增加了。這個數字這麼大就意味著有事情發生了:可能是CPU需求;vmstat或者mpstat會幫助確認到底是什麼,這些命令會在本系列的第3和第4個命令中介紹。

(二)dmesg|tail

這裡展示的是最近10條系統訊息日誌,如果系統訊息沒有就不會展示。主要是看由於效能問題導致的錯誤。上面這個例子中包含了殺死OOM問題的程序,丟棄TCP請求的問題。

所以要記得使用這個命令,dmesg命令值得一用。

(三)

vmstat 1

對虛擬記憶體統計的簡短展示,vmstat是一個常用工具(最早是幾十年前為BSD建立的)。它每一行列印關鍵的服務資訊統計摘要。

vmstat使用引數1來執行的時候,是每1秒列印一條統計資訊。在這個版本的vmstat中,輸出的第一行展示的是自從啟動後的平均值,而不是前一秒的統計。所以現在,可以跳過第一行,除非你要看一下抬頭的欄位含義。

每列含義說明:

r: CPU上的等待執行的可執行程序數。這個指標提供了判斷CPU飽和度的資料,因為它不包含I/O等待的程序。可解釋為:“r” 的值比CPU數大的時候就是飽和的。

free:空閒記憶體,單位是k。如果這個數比較大,就說明你還有充足的空閒記憶體。“free -m” 和下面第7個命令,可以更詳細的分析空閒記憶體的狀態。

si,so:交換進來和交換出去的資料量,如果這兩個值為非值,那麼就說明沒有記憶體了。

us,sy,id,wa,st:這些是CPU時間的分解,是所有CPU的平均值。它們是使用者時間,系統時間(核心),空閒,等待I/O時間,和被偷的時間(這裡主要指其它的客戶,或者使用Xen,這些客戶有自己獨立的操作域)。

CPU時間的分解可以幫助確定CPU是不是非常忙(透過使用者時間和系統時間累加判斷)。持續的I/O等待則表明磁碟是瓶頸。這種情況下CPU是比較空閒的,因為任務都由於等待磁碟I/O而被阻塞。你可以把等待I/O看作是另外一種形式的CPU空閒,而這個命令給了為什麼它們空閒的線索。

系統時間對於I/O處理來說是必須的。比較高的平均系統時間消耗,比如超過了20%,就有必要進一步探索分析了:也有可能是核心處理I/O效率不夠高導致。

在上面的例子中,CPU時間幾乎都是使用者級別的,說明這是一個應用級別的使用情況。如果CPU的使用率平均都超過了90%。這不一定問題;可以使用 “r” 列來檢查使用飽和度。

(四)

mpstat

-P ALL 1

這個命令列印各個CPU的時間統計,可以看出整體CPU的使用是不是均衡的。有一個使用率明顯較高的CPU就可以明顯看出來這是一個單執行緒應用。

(五)

pidstat 1

pidstat命令有點像top命令中的為每個CPU統計資訊功能,但是它是以不斷滾動更新的方式列印資訊,而不是每次清屏列印。這個對於觀察隨時間變化的模式很有用,同時把你看到的資訊(複製貼上)記到你的調查記錄中。

上面的例子可以看出是2個java程序在消耗CPU。%CPU列是所有CPU的使用率;1591%是說明這個java程序消耗了幾乎16個CPU核。

(六)

iostat -xz 1

這個工具對於理解塊裝置(比如磁碟)很有用,展示了請求負載和效能資料。具體的資料看下面欄位的解釋:

r/s, w/s, rkB/s, wkB/s:這些表示裝置上每秒鐘的讀寫次數和讀寫的位元組數(單位是k位元組)。這些可以看出裝置的負載情況。效能問題可能就是簡單的因為大量的檔案載入請求。

await:I/O等待的平均時間(單位是毫秒)。這是應用程式所等待的時間,包含了等待佇列中的時間和被排程服務的時間。過大的平均等待時間就預示著裝置超負荷了或者說裝置有問題了。

avgqu-sz:裝置上請求的平均數。數值大於1可能表示裝置飽和了(雖然裝置通常都是可以支援並行請求的,特別是在背後掛了多個磁碟的虛擬裝置)。

%util:裝置利用率。是使用率的百分數,展示每秒鐘裝置工作的時間。這個數值大於60%則會導致效能很低(可以在await中看),當然這也取決於裝置特點。這個數值接近100%則表示裝置飽和了。

如果儲存裝置是一個邏輯磁碟裝置,後面掛載了多個磁碟,那麼100%的利用率則只是表示有些I/O是在100%處理,然而後端的磁碟或許遠遠沒有飽和,還可以處理更多的請求。

請記住,磁碟I/O效能低不一定是應用程式的問題。許多技術通常都被用來實現非同步執行I/O,所以應用程式不會直接阻塞和承受延時(比如:預讀取和寫緩衝技術)。

(七)

free-m

右面兩列展示的是:

buffers:用於塊裝置I/O緩衝的快取。

cached:用於檔案系統的頁快取。

我們只想檢測這些快取的數值是否接近0。不為0的可能導致較高的磁碟I/O(透過iostat命令來確認)和較差的效能問題。上面的例子看起來沒問題,都還有很多M位元組。

“-/+ buffers/cache” 這一行提供了對已使用和空閒記憶體明確的統計。Linux用空閒記憶體作為快取,如果應用程式需要,可以快速拿回去。所以應該包含空閒記憶體那一列,這裡就是這麼統計的。甚至有一個網站專門來介紹Linux記憶體消耗的問題:linuxatemyram。

如果在Linux上使用了ZFS檔案系統,則可能會更亂,因為當我們在開發一些服務的時候,ZFS有它自己的檔案系統快取,而這部分記憶體的消耗是不會在free-m這個命令中合理的反映的。顯示了系統記憶體不足,但是ZFS的這部分快取是可以被應用程式使用的。

(八)

sar-n DEV 1

使用這個工具是可以檢測網路介面的吞吐:rxkB/s和txkB/s,作為收發資料負載的度量,也是檢測是否達到收發極限。在上面這個例子中,eth0接收資料達到22M位元組/秒,也就是176Mbit/秒(網絡卡的上限是1Gbit/秒)。

這個版本的工具還有一個統計欄位: %ifutil,用於統計裝置利用率(全雙工雙向最大值),這個利用率也可以使用Brendan的nicstat工具來測量統計。在這個例子中0。00這種情況就似乎就是沒有統計,這個和nicstat一樣,這個值是比較難統計正確的。

(九)

sar-n TCP,ETCP 1

這是對TCP關鍵指標的統計,它包含了以下內容:

active/s:每秒本地發起的TCP連線數(例如透過connect()發起的連線)。

passive/s:每秒遠端發起的連線數(例如透過accept()接受的連線)。

retrans/s:每秒TCP重傳數。

負載的粗略估計:新接受連線數(被動),下游連線數(主動)。可以把主動看作是外部的,被動的是內部,但是這個通常也不是非常準確(例如:當有本地到本地的連線時)。

重傳是網路或者伺服器有問題的一個訊號;可能是一個不可靠的網路(例如:公網),或者可能是因為伺服器過載了開始丟包。上面這個例子可以看出是每秒新建一個TCP連線。

(十)top

top命令包含了很多我們前面提到的指標。這個命令可以很容易看出指標的變化表示負載的變化,這個看起來和前面的命令有很大不同。

top的一個缺陷也比較明顯,很難看出變化趨勢,其它像vmstat和pidstat這樣的工具就會很清晰,它們是以滾動的方式輸出統計資訊。所以如果你在看到有問題的資訊時沒有及時的暫停下來(Ctrl-S是暫停, Ctrl-Q是繼續),那麼這些有用的資訊就會被清屏。

二、後續分析

還有很多可以使用來深挖系統問題的命令和技術,可以看看Brendan在 2015年講的Linux效能工具介紹 ,這裡面講述了40多個命令,涵蓋了可觀測性,基準測試,調優,靜態效能調優,分析和跟蹤等多個方面。

譯者簡介

許振文

增值服務部/營銷基礎平臺中心,騰訊遊戲Gcloud雲原生服務開發平臺負責人

許振文,增值服務部/營銷基礎平臺中心,騰訊遊戲Gcloud雲原生服務開發平臺負責人。同時也是Linux核心之旅開源社群的負責人,Istio社群Member和Kubernetes社群Member,參與中國資訊通訊研究院主導的多個行業標準制定,個人主要關注大資料計算,DevOps,K8S,ServiceMesh技術等。