概述前端
經過執行如下命令,能夠在1分鐘內對系統資源使用狀況有個大體的瞭解。java
其中一些命令須要安裝sysstat包,有一些由procps包提供。這些命令的輸出,有助於快速定位性能瓶頸,檢查出全部資源(CPU、內存、磁盤IO 等)的利用率(utilization)、飽和度(saturation)和錯誤(error)度量,也就是所謂的USE方法。ios
下面咱們來逐一介紹下這些命令,有關這些命令更多的參數和說明,請參照命令的手冊。docker
uptime後端
$ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
這個命令能夠快速查看機器的負載狀況。緩存
在Linux系統中,這些數據表示等待CPU資源的進程和阻塞在不可中斷IO進程(進程狀態爲D)的數量。這些數據可讓咱們對系統資源使用有一個宏觀的瞭解。服務器
命令的輸出分別表示1分鐘、5分鐘、15分鐘的平均負載狀況。經過這三個數據,能夠了解服務器負載是在趨於緊張仍是區域緩解。若是1分鐘平均負載很高,而 15分鐘平均負載很低,說明服務器正在命令高負載狀況,須要進一步排查CPU資源都消耗在了哪裏。反之,若是15分鐘平均負載很高,1分鐘平均負載較低, 則有多是CPU資源緊張時刻已通過去。網絡
上面例子中的輸出,能夠看見最近1分鐘的平均負載很是高,且遠高於最近15分鐘負載,所以咱們須要繼續排查當前系統中有什麼進程消耗了大量的資源。能夠經過下文將會介紹的vmstat、mpstat等命令進一步排查。工具
dmesg | tail性能
$ dmesg | tail [1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0 [...] [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB,
file-rss:0kB [2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.
Check SNMP counters.
該命令會輸出系統日誌的最後10行。示例中的輸出,能夠看見一次內核的oom kill和一次TCP丟包。這些日誌能夠幫助排查性能問題。千萬不要忘了這一步。
vmstat 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 34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0 32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0 32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0 32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0 32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0
vmstat命令,每行會輸出一些系統核心指標,這些指標可讓咱們更詳細的瞭解系統狀態。後面跟的參數1,表示每秒輸出一次統計信息,表頭提示了每一列的含義,這幾介紹一些和性能調優相關的列:
r: 等待在CPU資源的進程數。這個數據比平均負載更加可以體現CPU負載狀況,數據中不包含等待IO的進程。若是這個數值大於機器CPU核數,那麼機器的 CPU資源已經飽和。 free:系統可用內存數(以千字節爲單位),若是剩餘內存不足,也會致使系統性能問題。下文介紹到的free命令,能夠更詳細的瞭解系統內存的使用情 況。
si, so:交換區寫入和讀取的數量。若是這個數據不爲0,說明系統已經在使用交換區(swap),機器物理內存已經不足。
us, sy, id, wa, st:這些都表明了CPU時間的消耗,它們分別表示用戶時間(user)、系統(內核)時間(sys)、空閒時間(idle)、IO等待時間(wait) 和被偷走的時間(stolen,通常被其餘虛擬機消耗)。
上述這些CPU時間,可讓咱們很快了解CPU是否出於繁忙狀態。通常狀況下,若是用戶時間和系統時間相加很是大,CPU出於忙於執行指令。若是IO等待時間很長,那麼系統的瓶頸可能在磁盤IO。
示例命令的輸出能夠看見,大量CPU時間消耗在用戶態,也就是用戶應用程序消耗了CPU時間。這不必定是性能問題,須要結合r隊列,一塊兒分析。
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輸出來分析。
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處在空閒狀態的時間百分比
mpstat -P ALL 1
$ mpstat -P ALL 1 Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) 07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78 07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99 07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00 07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03
該命令能夠顯示每一個CPU的佔用狀況,若是有一個CPU佔用率特別高,那麼有多是一個單線程應用程序引發的。
pidstat 1
$ pidstat 1 Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) 07:41:02 PM UID PID %usr %system %guest %CPU CPU Command 07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0 07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave 07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java 07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java 07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java 07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat
07:41:03 PM UID PID %usr %system %guest %CPU CPU Command 07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave 07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java 07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java 07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass 07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat
pidstat命令輸出進程的CPU佔用率,該命令會持續輸出,而且不會覆蓋以前的數據,能夠方便觀察系統動態。如上的輸出,能夠看見兩個JAVA進程佔用了將近1600%的CPU時間,既消耗了大約16個CPU核心的運算資源。
iostat -xz 1
輸入iostat -x 1 10命令,表示開始監控輸入輸出狀態,-x表示顯示全部參數信息,1表示每隔1秒監控一次,10表示共監控10次。
其中rsec/s表示讀入,wsec/s表示每秒寫入,這兩個參數某一個特別高的時候就表示磁盤IO有很大壓力,util表示IO使用率,若是接近100%,說明IO滿負荷運轉
$ iostat -xz 1 Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 73.96 0.00 3.73 0.03 0.06 22.21 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 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09 xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0
iostat命令主要用於查看機器磁盤IO狀況。該命令輸出的列,主要含義是:
- r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引發性能問題。
- await:IO操做的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,須要消耗的時間,包括IO等待和實際操做的耗時。若是這個數值過大,多是硬件設備遇到了瓶頸或者出現故障。
- avgqu-sz:向設備發出的請求平均數量。若是這個數值大於1,多是硬件設備已經飽和(部分前端硬件設備支持並行寫入)。
- %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是若是超過60,可能會影響IO性能(能夠參照IO操做平均等待時間)。若是到達100%,說明硬件設備已經飽和。
在第2行系統發行版本下面的第四、5行,能夠看到與top命令中CPU使用狀況相似的信息,
第7行,能夠看到一些IO指標:
tps: 每秒I/O傳輸請求量;
kB_read/s:每秒讀取多少KB;
kB_wrtn/s:每秒寫多少KB;
kB_read:一共讀了多少KB;
kB_wrtn:一共寫了多少KB。
iostat命令屬於sysstat工具包,因爲咱們的機器只掛載了一塊硬盤,所以不能體現不一樣設備的I/O區別。
若是顯示的是邏輯設備的數據,那麼設備利用率不表明後端實際的硬件設備已經飽和。值得注意的是,即便IO性能不理想,也不必定意味這應用程序性能會很差,能夠利用諸如預讀取、寫緩存等策略提高應用性能。
free –m
$ free -m total used free shared buffers cached Mem: 245998 24545 221453 83 59 541 -/+ buffers/cache: 23944 222053 Swap: 0 0 0
free 命令能夠查看系統內存的使用狀況,-m參數表示按照兆字節展現。最後兩列分別表示用於IO緩存的內存數,和用於文件系統頁緩存的內存數。須要注意的是,第 二行-/+ buffers/cache,看上去緩存佔用了大量內存空間。這是Linux系統的內存使用策略,儘量的利用內存,若是應用程序須要內存,這部份內存會 當即被回收並分配給應用程序。所以,這部份內存通常也被當成是可用內存。
若是可用內存很是少,系統可能會動用交換區(若是配置了的話),這樣會增長IO開銷(能夠在iostat命令中提現),下降系統性能。
sar -n DEV 1
$ sar -n DEV 1 Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) 12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00 12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00 12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00 12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00 12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sar命令在這裏能夠查看網絡設備的吞吐率。在排查性能問題時,能夠經過網絡設備的吞吐量,判斷網絡設備是否已經飽和。如示例輸出中,eth0網卡設備,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,沒有達到1Gbit/sec的硬件上限。
sar -b 1
sar命令查看當天IO統計記錄
sar -n TCP,ETCP 1
sar命令在這裏用於查看TCP鏈接狀態,其中包括:
- active/s:每秒本地發起的TCP鏈接數,既經過connect調用建立的TCP鏈接;
- passive/s:每秒遠程發起的TCP鏈接數,即經過accept調用建立的TCP鏈接;
- retrans/s:每秒TCP重傳數量;
TCP鏈接數能夠用來判斷性能問題是否因爲創建了過多的鏈接,進一步能夠判斷是主動發起的鏈接,仍是被動接受的鏈接。TCP重傳多是由於網絡環境惡劣,或者服務器壓力過大致使丟包。
iotop
iotop命令相似於top命令,可是顯示的是各個進程的I/O狀況,對於定位I/O操做較重的進程有比較大的做用。
例5. iotop命令與進程的IO情況
top
top命令下按數字"1"
dstat
top命令包 含了前面好幾個命令的檢查的內容。好比系統負載狀況(uptime)、系統內存使用狀況(free)、系統CPU使用狀況(vmstat)等。所以經過這 個命令,能夠相對全面的查看系統負載的來源。同時,top命令支持排序,能夠按照不一樣的列排序,方便查找出諸如內存佔用最多的進程、CPU佔用率最高的進 程等。
可是,top命令相對於前面一些命令,輸出是一個瞬間值,若是不持續盯着,可能會錯過一些線索。這時可能須要暫停top命令刷新,來記錄和比對數據。
總結
排查Linux服務器性能問題還有不少工具,上面介紹的一些命令,能夠幫助咱們快速的定位問題。例如前面的示例輸出,多個證據證實有JAVA進程佔用了大量CPU資源,以後的性能調優就能夠針對應用程序進行。