這篇博客主要總結和羅列一下,linux一些常用的性能分析指標,算是個掃盲吧。一般來說Linux系統出現了性能問題,都會有專門的運維人員去檢查,但是開發人員還是需要掌握一些基礎的命令,比如可以通過top
、iostat
、vmstat
、netstat
、sar
等命令來初步查看和定位問題。這些命令都比較基礎,很多網站上都能找到,我學習的時候也參照了很多資料,這里只列出這幾個我用過的命令,后續還會增加。
Top
作用:能夠實時顯示系統中各個進程的資源占用狀況。類似於Windows的任務管理器。
命令參數:
- d: 指定每兩次屏幕信息刷新之間的時間間隔
- p: 通過指定監控進程ID來僅僅監控某個進程的狀態
- q:該選項將使top沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那么top將以盡可能高的優先級運行
- S: 指定累計模式
- s : 使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險
- i: 使top不顯示任何閑置或者僵死進程
- c: 顯示整個命令行而不只是顯示命令名
終端輸入top
,顯示如下
下面我們來看一下上圖中這些參數的含義。
第一行:表示的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載(最近1,5,15分鍾)。
第二行:顯示的是所有啟動的進程、目前運行的、掛起(Sleeping)的和無用(Zombie)的進程。
第三行:顯示的是目前CPU的使用情況,包括系統占用的比例、用戶使用比例、閑置(Idle)比例。
第四行:顯示物理內存的使用情況,包括總的可以使用的內存、已用內存、空閑內存、緩沖區占用的內存。
第五行:顯示交換分區使用情況,包括總的交換分區、使用的、空閑的和用於高速緩存的大小。
第六行:顯示的項目最多,內容如下:
命令 | 含義 |
---|---|
PID | 進程id |
USER | 進程所有者的用戶名 |
PR | 優先級 |
NI | nice值。負值表示高優先級,正值表示低優先級 |
VIRT | 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES |
RES | 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA |
SHR | 共享內存大小,單位kb |
S | 進程狀態:D=不可中斷的睡眠狀態;R=運行;S=睡眠;T=跟蹤/停止; Z=僵屍進程 |
%CPU | 上次更新到現在的CPU時間占用百分比 |
%MEM | 進程使用的物理內存百分比 |
TIME+ | 進程使用的CPU時間總計,單位1/100秒 |
COMMAND | 命令名/命令行= |
當你輸入top之后,還可以根據你的需要進行排序,查看對應信息,如:
shift +M:按照內存使用進行排序
shift+P:按照cpu時間排序
shift+T:按照cpu累計使用時間
推薦參考資料性能優化
vmstat
作用:
虛擬內存的統計。vmstat可以實時監控cpu運行隊列和系統關鍵的性能指標,如磁盤,上下文交換,cpu使用率等。
命令參數:
- -a:顯示活躍和非活躍內存
- -f:顯示從系統啟動至今的fork數量
- -m:顯示slabinfo
- -n:只在開始時顯示一次各字段名稱
- -s:顯示內存相關統計信息及多種系統活動數量
- delay:刷新時間間隔。如果不指定,只顯示一條結果
- count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮
- -d:顯示磁盤相關統計信息
- -p:顯示指定磁盤分區統計信息
- -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位為K(1024 bytes)
- -V:顯示vmstat版本信息
例子:
輸入vmstat
可以看到如下界面:
解釋下圖中各個參數的含義:
procs
r 列表示等待cpu時間片的進程數,如果長期大於1,說明cpu不足,需要增加cpu。
b 列表示在等待資源的進程數,比如正在等待I/O、或者內存交換等。
memory
swpd 切換到內存交換區的內存數量,或者說是現在可用的交換內存(k表示)。如果swpd的值不為0,或者比較大,比如超過了100m,只要si、so的值長期為0,系統性能還是正常
free 當前的空閑頁面列表中內存數量(k表示) ,空閑內存
buff 作為buffer cache的內存數量,一般對塊設備的讀寫才需要緩沖。
cache: 作為page cache的內存數量,一般作為文件系統的cache,如果cache較大,說明用到cache的文件較多,如果此時IO中bi比較小,說明文件系統效率比較好。
swap
si 由內存進入內存交換區數量。
so由內存交換區進入內存數量。
IO
bi 從塊設備讀入數據的總量(讀磁盤)(每秒kb)。
bo 塊設備寫入數據的總量(寫磁盤)(每秒kb)
這里我們設置的bi+bo參考值為1000,如果超過1000,而且wa值較大應該考慮均衡磁盤負載,可以結合iostat輸出來分析。如果bi,bo 長期不等於0,表示物理內存容量太小。
system
顯示采集間隔內發生的中斷數
in 列表示在某一時間間隔中觀測到的每秒設備中斷數。
cs列表示每秒產生的上下文切換次數,如當 cs 比磁盤 I/O 和網絡信息包速率高得多,都應進行進一步調查。
cpu
表示cpu的使用狀態
us 列顯示了用戶方式下所花費 CPU 時間的百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期大於50%,需要考慮優化用戶的程序。
sy 列顯示了內核進程所花費的cpu時間的百分比。這里us + sy的參考值為80%,如果us+sy 大於 80%說明可能存在CPU不足。
wa 列顯示了IO等待所占用的CPU時間的百分比。這里wa的參考值為30%,如果wa超過30%,說明IO等待嚴重,這可能是磁盤大量隨機訪問造成的,也可能磁盤或者磁盤訪問控制器的帶寬瓶頸造成的(主要是塊操作)。
id 列顯示了cpu處在空閑狀態的時間百分比,如果id經常小於40,表示中央處理器的負荷很重
最好使用vmstat t [n]
命令,例如 vmstat 5 5
,表示在T(5)秒時間內進行N(5)次采樣。如果只使用vmstat
,無法反映真正的系統情況。如下:
iostat
顧名思義,iostat主要用於監控系統設備的IO負載情況。
如下:
具體參數的含義可以參見iostat,這里寫的比較詳細。
Netstat
輸入 man netstat可以看到解釋:
Netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等。
這里找了一篇參考資料,總結的還是比較詳細的:netstat
sar
sar這個命令還是比較復雜的,實際中用的還是比較廣的。在命令行輸入sar
,可以看到下圖:
解釋下參數:
%user : 用戶模式下消耗的CPU時間的比例;
%nice:通過nice改變了進程調度優先級的進程,在用戶模式下消耗的CPU時間的比例;
%system:系統模式下消耗的CPU時間的比例;
**%iowait:**CPU等待磁盤I/O而導致空閑狀態消耗時間的比例。如果過高,表示存在I/O瓶頸。
*%steal:利用Xen等操作系統虛擬化技術時,等待其他虛擬CPU計算占用的時間比例;
**%idle:**CPU沒有等待磁盤I/O等的空閑狀態消耗的時間比例。
如果 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配內存,此時應加大內存容量
如果 %idle 的值持續低於 10,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU。
Sar的命令太過復雜,我也沒有什么實際的運維經驗,所以我這里就列下參考資料吧:http://baike.baidu.com/view/2816483.htm (其實百度百科總結的還是很詳細的嘛,O(∩_∩)O哈哈~)
好了,linux性能分析命令-掃盲篇暫時就先這樣,等有了實際的例子再來分享下。平常沒事,大家可以輸入玩一玩,比較參數看多了就知道是神馬意思了。