1. 程式人生 > >linux效能分析常用命令詳解

linux效能分析常用命令詳解

當你登入到一臺存在效能問題的Linux伺服器上時,在頭一分鐘,你會檢查什麼?

我們看看Netflix的效能工程師是怎麼做的。

Netflix大量使用EC2 Linux伺服器,很多時候是用一些較為高層的工具做雲或例項層次的分析。不過有時仍然需要登入到某個例項上,執行一些標準的Linux效能工具。

在最開始的一分鐘內,可以先利用手頭的標準Linux工具大致瞭解效能狀況。藉助如下10條命令(有些命令需要安裝sysstat包),瞭解系統資源使用狀況和正在執行的程序。先檢查錯誤(errors)和飽和度(saturation),再檢查資源利用率(resource utilization)。飽和度指的是負載已經超過處理能力,像請求佇列的長度,等待時間等。

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》(中譯本:《效能之巔:洞悉系統、企業與雲端計算》)一書中有具體的描述。

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

USE方法(utilization、utilization、errors)應用於效能研究,用來識別系統瓶頸。一言以蔽之,就是:

對於所有的資源,檢視它的使用率、飽和度和錯誤。

這些術語定義如下。

資源:所有伺服器物理元器件(CPU、匯流排……)。某些軟體資源也能算在內,提供有用的指標。
使用率:在規定的時間間隔內,資源用於服務工作的時間百分比。雖然資源繁忙,但是資源還有能力接受更多的工作,不能接受更多工作的程度被視為飽和度。
飽和度:資源不能再服務更多額外工作的程度,通常有等待佇列。
錯誤:錯誤事件的個數。

……

USE方法會將分析引導到一定數量的關鍵指標上,這樣可以儘快地核實所有的系統資源。在此之後,如果還沒有找到問題,那麼可以考慮採用其他的方法。

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

uptime

12:05
:14 up 25 days, 22:28, 1 user, load average: 0.00, 0.01, 0.05

快速檢視平均負載(任務對CPU資源的需求)。輸出中的“load average:”後面的三個數字,是系統在1分鐘、5分鐘和15分鐘內的平均負載。表示負載隨時間的變化情況。

它給出的只是一個較為高層的情況,往往需要藉助其他工具進一步確認效能問題,有時候需要通過其他一些指標來了解CPU負載,例如vmstat或mpstat。

  1. dmesg | tail
[    7.027092] input: Xen Virtual Keyboard as /devices/virtual/input/input6
[    7.027154] input: Xen Virtual Pointer as /devices/virtual/input/input7
[    7.045185] ppdev: user-space parallel port driver
[    7.137679] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[   12.054020] xenbus_probe_frontend: Waiting for devices to initialise: 25s...20s...15s...10s...5s...0s...

[   37.079248] xenbus_probe_frontend: Timeout connecting to device: device/vkbd/0 (local state 3, remote state 1)
[   37.126790] device-mapper: uevent: version 1.0.3
[   37.126990] device-mapper: ioctl: 4.33.0-ioctl (2015-8-18) initialised: [email protected]
[1136140.265842] UDP: bad checksum. From 120.42.91.41:51069 to 101.200.235.90:137 ulen 58

檢視最後10條系統訊息。查詢可能會引發效能問題的錯誤。千萬不要漏掉這一步。

  1. vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1918624 232612 2483068    0    0     0    17    3    9  9  0 91  0  0
 0  0      0 1918656 232612 2483068    0    0     0     0  296  686  0  0 100  0  1
 0  0      0 1918656 232612 2483068    0    0     0     0  353  721  0  0 100  0  0

統計虛擬記憶體資訊。引數1指的是列印1秒內的統計資訊。

要檢查的列:

r:執行佇列的長度(這個引數的解釋,建議參考《效能之巔》一書)。可以更好地確定CPU的飽和度。“r”值大於CPU數則為飽和。
free:以kb為單位的空閒記憶體。如果這個值很大,說明有足夠的空閒記憶體。下面將介紹的第7條命令——“free -m”,可以更好地解釋空閒記憶體的狀態。
si, so:換入的記憶體和換出的記憶體。如果它們不為0,說明記憶體已經耗盡。
us, sy, id, wa, st:CPU時間的不同組成部分,是所有CPU的平均數。分別表示使用者態時間、系統態時間(核心)、空閒、等待I/O以及竊取時間(stolen time,虛擬化環境下,CPU在其他租戶上的開銷)。

將使用者態時間和系統態時間相加,可以判斷CPU是否忙碌。如果一直有等待I/O,表明存在磁碟瓶頸。因為任務阻塞等待磁碟I/O,此時CPU是空閒的。可以將等待I/O看作另一種形式的CPU空閒。

I/O處理一定會消耗系統態時間。如果系統時間平均佔比很高,比如說超過20%,或許可以深入研究一下:可能是核心處理I/O的效率不高。

  1. mpstat -P ALL 1
Linux 3.10.0-327.18.2.el7.x86_64 (iZ25y9r4qw9Z)         08/02/2016      _x86_64_        (2 CPU)

12:06:57 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
12:06:58 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
12:06:58 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.99    0.00    0.00   99.01
12:06:58 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

列印每個CPU的狀況。可以檢查各CPU的負載是否均衡。比如,如果一個CPU很熱,可能是單執行緒應用造成的。

  1. pidstat 1
Linux 3.10.0-327.18.2.el7.x86_64 (iZ25y9r4qw9Z)         08/02/2016      _x86_64_        (2 CPU)

12:07:42 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
12:07:43 PM     0      2811    1.00    1.00    0.00    2.00     1  java

12:07:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
12:07:44 PM     0     13550    0.00    1.00    0.00    1.00     1  pidstat

pidstat按程序列印CPU的使用情況。迴圈輸出活動程序的資訊。可用於觀察模式隨時間的變化情況。使用者也可以把觀察到的資訊記錄下來,以供分析研究。

像圖中的例子,可以看到有2個Java程序消耗了大部分CPU時間。“%CPU”這一列是所有CPU的整體情況,“1591%”這個值表明這2個Java程序幾乎佔用了16個CPU。

  1. iostat -xz 1
Linux 3.10.0-327.18.2.el7.x86_64 (iZ25y9r4qw9Z)         08/02/2016      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.71    0.00    0.05    0.18    0.06   90.99

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     1.09    0.02    3.80     0.28    34.62    18.27     0.02    5.55    5.20    5.55   1.25   0.48
xvdb              0.00     0.00    0.00    0.00     0.00     0.00    14.09     0.00    0.51    0.51    0.00   0.46   0.00

這是瞭解塊裝置的一個極佳工具,能看到實際負載和效能資訊。

r/s, w/s, rkB/s, wkB/s:分別表示每秒發給磁碟裝置的讀請求數,每秒發給磁碟裝置的寫請求數,每秒從磁碟裝置讀取的KB數,每秒向磁碟裝置寫入的KB數。可以使用它們表示負載特性。效能問題可能就是由過多的負載造成的。
await:平均I/O響應時間,單位為毫秒。包括排隊時間和服務時間。如果它大於預期的平均時間,可能是裝置已經飽和,也可能是裝置存在問題。
avgqu-sz:提交到裝置的平均請求數。如果大於1,裝置可能已經飽和。
%util:裝置使用率。裝置忙於處理請求的百分比。如果大於60%,通常會導致較差的效能(可以在await中看出來),不過也與具體的裝置有關。如果接近100%,通常意味著裝置已經飽和。

如果儲存裝置是後面有多塊磁碟支撐的邏輯磁碟,即使裝置使用率是100%,後端磁碟也可能遠沒有飽和,而是還能處理更多工作。

  1. free -m
              total        used        free      shared  buff/cache   available
Mem:           7566        3039        1874         120        2652        4145
Swap:             0           0           0

主要看最右邊的兩列:

buffers:用於塊裝置I/O的緩衝區快取記憶體的大小。
cached:檔案系統使用的頁快取大小。

我們只需要檢查這兩個值,如果它們接近0,則會導致更高的磁碟I/O(可以使用iostat確認),效能更糟。圖中的例子,這個狀況看上去還不錯。

  1. sar -n DEV 1
Linux 3.10.0-327.18.2.el7.x86_64 (iZ25y9r4qw9Z)         08/02/2016      _x86_64_        (2 CPU)

12:09:34 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:09:35 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:09:35 PM      eth1      3.00      3.00      0.20      0.33      0.00      0.00      0.00
12:09:35 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00

12:09:35 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
12:09:36 PM      eth0     18.00     11.00      2.17      1.23      0.00      0.00      0.00
12:09:36 PM      eth1      4.00      6.00      0.84      6.65      0.00      0.00      0.00
12:09:36 PM        lo     62.00     62.00     29.83     29.83      0.00      0.00      0.00

使用該工具檢查網路介面的吞吐量,以rxkB/s和txkB/s為手段測量負載。

  1. sar -n TCP,ETCP 1
Linux 3.10.0-327.18.2.el7.x86_64 (iZ25y9r4qw9Z)         08/02/2016      _x86_64_        (2 CPU)

12:09:57 PM  active/s passive/s    iseg/s    oseg/s
12:09:58 PM      1.00      1.00     77.00     64.00

12:09:57 PM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:09:58 PM      0.00      0.00      0.00      0.00      0.00

12:09:58 PM  active/s passive/s    iseg/s    oseg/s
12:09:59 PM      0.00      0.00      1.00      2.00

這是一些關鍵TCP指標的總結。其中包括:

active/s:每秒本地發起的TCP連線數(比如通過connect())。
passive/s:每秒遠端發起的TCP連線數(比如通過accept())。
retrans/s:每秒TCP重傳數。

active和passive連線數通常用於粗略地測量伺服器負載。方便起見,可以把active看作向外的連線,把passive看作向內的連線;不過也有不嚴格之處,比如考慮從localhost到localhost的連線。

重傳數是網路或伺服器問題的一個訊號:可能是網路不可靠;也可能是伺服器過載和丟包。像圖中的例子,每秒只有一個新的TCP連線。

  1. top
top - 12:10:24 up 25 days, 22:34,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 121 total,   1 running, 112 sleeping,   8 stopped,   0 zombie
%Cpu(s):  8.7 us,  0.1 sy,  0.0 ni, 91.0 id,  0.2 wa,  0.0 hi,  0.0 si,  0.1 st
KiB Mem :  7747772 total,  1918140 free,  3113464 used,  2716168 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4244188 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                  
    1 root      20   0  125288   5784   2420 S   0.0  0.1   0:34.01 systemd                                                                                                                  
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd                                                                                                                 
    3 root      20   0       0      0      0 S   0.0  0.0   0:01.70 ksoftirqd/0                                                                                                              
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                                                             
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.24 migration/0 

top命令包含很多前面檢查過的指標。可以用個命令來檢查是不是有指標和之前命令的輸出差距很大。

top命令有個缺點,很難看出某個指標隨時間的變化模式,這種情況下用像vmstat和pidstat這樣的命令可能更清楚,它們能提供滾動輸出。間歇性問題的一些跡象,如果不能足夠快地暫停輸出(Ctrl-S暫停,Ctrl-Q繼續),可能會錯過。

後續分析

可以藉助更多命令繼續深入挖掘。重點推薦Brendan Gregg的《效能之巔:洞悉系統、企業與雲端計算》)一書。

本文根據Netflix的技術部落格編譯整理,結合自己讀書的一些心得寫就。更多細節,可以點選閱讀原文,檢視相關部落格,或者閱讀《效能之巔》一書。

相關推薦

linux效能分析常用命令

當你登入到一臺存在效能問題的Linux伺服器上時,在頭一分鐘,你會檢查什麼? 我們看看Netflix的效能工程師是怎麼做的。 Netflix大量使用EC2 Linux伺服器,很多時候是用一些較為高層的工具做雲或例項層次的分析。不過有時仍然需要登入到某個例項上

Linux運維常用命令

zxvf disabled 組密碼 周期性 協議 風格 col lib vgs 1、ls 文件屬性: -:普通文件 d:目錄文件 b:塊設備 c:字符設備文件 l:符號連接文件 p:命令管道 s:套接字文件 文件權限: 9位數字,每3位一組 文件硬鏈接次

Linux系統下python學習筆記——Linux中檔案和目錄常用命令

一、檢視目錄內容 ls命令說明: 英文單詞list的簡寫,功能為列出目錄的內容,是使用者最常用的命令字義    Linux下檔案和目錄的特點: Linux檔案或目錄名稱最長可以有256個字元 以 . 開頭的檔案為隱藏檔案,需要用-a引數才能顯示(all

Linux基礎命令複習-叢集常用命令

1.ifconfig/ip a [[email protected] ~]# ifconfig eth0 eth0      Link encap:Ethernet  HWaddr 00:0C:29:C3:C5:49     &n

[Linux] 硬碟效能測試DD命令

首先要了解兩個特殊的裝置: /dev/null:回收站、無底洞 /dev/zero:產生字元 Ø 測試磁碟寫能力 time dd if=/dev/zero of=/test.dbf bs=64k count=16k 因為/dev/zero是一個偽裝置,它只產生空

linux常用命令

就是 轉移 手冊 展開 查詢 回車 紅色 查找條件 overview 一、命令的分類用於實現某一類功能的指令或程序 命令本質就是程序 命令的執行必須依賴於shell命令解釋器程序(例如:/bin/bash) shell解釋器,是Linux系統中運行的一種特殊程序,就是作為翻

python(1) linux常用命令

一、常用目錄/檔案操作命令     1.展示目錄列表命令ls(list)       ls             展示當前目錄下的可見檔案       ls -a         展示當前目錄下所有的檔案(包括隱藏的檔案)       ls -l(ll)      展示當前

Linux常用命令(一)--技術流ken

  本節內容   基礎命令:lsmanpwdcdmkdirechotouchcpmvrmrmdircatmorelessheadtailclearpoweroffreboot進階命令(下一章節):aliasunaliasunamesuhostnamehistorywhichwcwwh

Linux常用命令(二)--技術流ken

  本節內容   aliasunaliasunamesuhostnamehistorywhichwcwwhowhoamipingkillseqdudffreedate 命令詳解   1. alias 設定、’檢視別名 例項1:檢視別名 [[email

Linux常用命令(四)_檔案過濾分割、統計、kill

grep grep(global search regular expression(RE) and print out the line,全面搜尋正則表示式並把行打印出來)是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。 格式:

Linux常用命令-目錄檔案操作命令

   現實中,伺服器(包含Linux,Unix,Windows Server)一般都擺放在機房裡,因為一個機房擺放了很多Linux機器,所有機器都運轉起來,整個室內溫度也是非常高的,所以作為一個要操作Linux的開發人員,它們通常都是通過ssh遠端連線操作Lin

linux系統常用命令(一)

遠程登錄 ring 問號 鏈接 重置 帳號 查看 tar 更新 Linux命令格式:命令選項參數 (大部分命令是這個格式) 註意: 1.命令區分大小寫 2.短選項可以合並 長選項不能合並 如 : 短選項 -l -h 可以合並為 -lh 長選項 不能合並 1

Linux常用命令—基於CentOS7

本文件是根據網路資料整理的,參考文章眾多,若有雷同,純屬巧合! Linux 目錄 - /:根目錄,一般只存放目錄,不存放檔案 - /bin -> /usr/bin:可執行二進位制檔案的目錄,也是常用命令目錄,如常用的命令 ls、cat、mv 等 - /boot:該目錄中存放系統的核心檔案,系統引導時使用

Docker常用命令

nbsp 詳解 .cn 本地 test 並且 www 更多 top docker ps 查看當前正在運行的容器 docker ps -a 查看所有容器的狀態 docker start/stop id/name 啟動/停止某個容器 docker attach id 進

LinuxLinux定時任務Crontab命令

星期幾 ima 默認 定時 最好 表示 時間 path 配置文件 linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是默認啟動的。另 外, 由於使用者自己也可以設置計劃任務,所以, Lin

yum常用命令

yum工具、解決依賴安裝 yum命令 yum使用技巧 YUM常用命令詳解 yum是一個用於管理rpm包的後臺程序,用python寫成,可以非常方便的解決rpm的依賴關系。在建立好yum服務器後,yum客戶端可以通過 http、ftp方式獲得軟件包,並使用方便的命令直接管理、更新所有的rpm包

Linux基礎進程命令

linux運維學習進程有關基礎命令一、進程定義1、進程就是CPU未完成的工作,而且它是其中運行著一個或多個線程的地址空間和這些線程所需要的系統資源。二、Linux系統進程和一些有關進程的命令1、ps命令 ps [options] 1》ps - report a snapshot of the c

【轉載】linux下的mount命令

文件的 flag 自動加載 網絡文件系統 解決問題 選項 lock home 多個參數 以下內容來自:http://blog.csdn.net/clozxy/article/details/5299054 http://linux.chinaunix.net/techdo

Linux上的free命令-收藏

cnblogs sed () 回收 dha 二維數組 版式 nbsp shared 解釋一下Linux上free命令的輸出。   下面是free的運行結果,一共有4行。為了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數組FO(Free Output)。例如

Linux crontab 定時任務命令

-1 data new ubuntu 時間間隔 服務 run back use Linux Crontab 定時任務 命令詳解 [日期:2016-02-13] 來源:Linux社區 在工作中需要數據庫在每天零點自動備份所以需要建立一個定時任務.我選擇在Linux下使用