{eval=Array;=+count(Array);}
當遇到一個系統性能問題時,如何利用登錄的前60秒對系統的性能情況做一個快速瀏覽和分析,主要包括如下10個工具,這是一個非常有用且有效的命工具列表。本文將詳細介紹這些命令及其擴展選項的意義,及其在實踐中的作用。并利用一個實際出現問題的例子,來驗證這些套路是不是可行,下面工具的屏幕輸出結果都來自這個出現題的系統。
# 系統負載概覽uptime
# 系統日志dmesg | tail
# CPUvmstat 1mpstat -P ALL 1pidstat 1
# Diskiostat -xz 1
# 內存free -m
# 網絡sar -n DEV 1sar -n TCP,ETCP 1
# 系統概覽top
上面的工具都基于內核提供給用戶態的統計,并以計數器形式展示,是快速排查時的利器。對于應用和系統的進一步跟蹤(tracing),則需要利用strace和systemtap,不在本文的范疇。
注意:
1. uptime[root@nginx1 ~]# uptime 15:38:10 up 43 days, 3:54, 1 user, load average: 1.13, 0.41, 0.18
uptime是快速查看load average的方法,在Linux中load average包括處于runnable和uninterruptable狀態的進程總數,runnable狀態的進程包括在CPU上運行的進程和已經ready to run在等待CPU時間的進程;uninterruptable狀態的進程是在等待一些I/O訪問,比如等待disk的返回。Load average沒有根據系統的CPU數量做格式化,所以load average 1表示單CPU系統在對應時間段內(1分鐘, 5分鐘, 15分鐘)一直負載飽和,而在4 CPU的系統中,load average 1表示有75%的時間在idle。
Load average體現了一個high level的負載概覽,但是可能需要和別的工具一起來使用以了解更多信息,比如處于runable和uninterruptable的實時進程數量分別是多少,可以用下面將介紹到的vmstat來查看。1分鐘,5分鐘,15分鐘的負載平均值同時能體現系統負載的變化情況。例如,如果你要檢查一個問題服務器,當你看到1分鐘的平均負載值已經遠小于15分鐘的平均負載值,則意味這也許你登錄晚了點,錯過了現場。用top或者w命令,也可以看到load average信息。
上面示例中最近1分鐘內的負載比15分鐘內的負載高了不少 (因為是個測試的例子,1.13可以看作明顯大于0.18,但是在生產系統上這不能說明什么)。
2. dmesg | tail
[root@nginx1 ~]# dmesg | tail [3128052.929139] device eth0 left promiscuous mode [3128104.794514] device eth0 entered promiscuous mode [3128526.750271] device eth0 left promiscuous mode [3537292.096991] device eth0 entered promiscuous mode [3537295.941952] device eth0 left promiscuous mode [3537306.450497] device eth0 entered promiscuous mode [3537307.884028] device eth0 left promiscuous mode [3668025.020351] bash (8290): drop_caches: 1 [3674191.126305] bash (8290): drop_caches: 2 [3675304.139734] bash (8290): drop_caches: 1
dmesg用于查看內核緩沖區存放的系統信息。另外查看/var/log/messages也可能查看出服務器系統方面的某些問題。
上面示例中的dmesg沒有特別的值得注意的錯誤。
3. vmstat 1
vmstat簡介:
結果中列的含義:
Procs(進程)
r: The number of runnable processes (running or waiting for run time).b: The number of processes in uninterruptible sleep.
注釋:r表示在CPU上運行的進程和ready等待運行的進程總數,相比load average, 這個值更能判斷CPU是否飽和(saturation),因為它沒有包括I/O。如果r的值大于CPU數目,即達到飽和。
Memory
swpd: the amount of virtual memory used.free: the amount of idle memory.buff: the amount of memory used as buffers.cache: the amount of memory used as cache.
Swap
si: Amount of memory swapped in from disk (/s).so: Amount of memory swapped to disk (/s).
注釋:swap-in和swap-out的內存。如果是非零,說明主存中的內存耗盡。
IO
bi: Blocks received from a block device (blocks/s).bo: Blocks sent to a block device (blocks/s).
System (中斷和進程上下文切換)
in: The number of interrupts per second, including the clock.cs: The number of context switches per second.
CPU
These are percentages of total CPU time.us: Time spent running non-kernel code. (user time, including nice time)sy: Time spent running kernel code. (system time)id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.
根據user+system時間,可以判斷CPUs是否繁忙。如果wait I/O一直維持一定程度,說明disk有瓶頸,這時CPUs是"idle"的,因為任務都被block在等待disk I/O中。wait I/O可以被視為另一種形式的CPU idle,并且說明idle的原因就是在等待disk I/O的完成。
處理I/O需要花費system time,在將I/O提交到disk driver之前可能要經過remap, split和merge等操作,并被I/O scheduler調度到request queue。如果處理I/O時平均system time比較高,超過20%,則要進一步分析下,是不是內核處理I/O時的效率有問題。
如果用戶空間的CPU使用率接近100%,不一定就代表有問題,可以結合r列的進程總數量看下CPU的飽和程度。
上面示例可以看到在CPU方面有一個明顯的問題。user+system的CPU一直維持在50%左右,并且system消耗了大部分的CPU。
4. mpstat -P ALL 1
mpstat可以打印按照CPU的分解,可以用來檢查不不均衡的情況。
上面示例結果可以印證vmstat中觀察到的結論,并且可以看到服務器有2個CPU,其中CPU 1的使用率一直維持在100%,而CPU 0并沒有什么負載。CPU 1的消耗主要在內核空間,而非用戶空間。
5. pidstat 1
默認pidstat類似于top按照進程的打印方式,不過是以滾動打印的方式,和top的清屏方式不同。利用-p可以打出指定進程的信息,-p ALL可以打出所有進程的信息。如果沒有指定任何進程默認相當于-p ALL,但是只打印活動進程的信息(統計非0的數據)。
pidstat不只可以打印進程的CPU信息,還可以打印內存,I/O等方面的信息,如下是比較有用的信息:
上面示例中可以明確得看到是nc這個進程在消耗CPU 1 100%的CPU。因為測試系統里消耗CPU的進程比較少,所以一目了然,在生產系統中pidstat應該能輸出更多正在消耗CPU的進程情況。
6. iostat -zx 1
了解塊設備(block device, 這里是disk)負載和性能的工具。主要看如下指標:
如果存儲設備是一個對應多個后端磁盤的邏輯磁盤,那么100%使用率可能僅僅表示一些I/O在處理時間占比達到100%,其他后端磁盤不一定也到達了飽和。請注意磁盤I/O的性能問題并不一定會造成應用的問題,很多技術都是使用異步I/O操作,所以應用不一定會被block或者直接受到延遲的影響。
7. free -m# free -m total used free shared buff/cache available Mem: 7822 129 214 0 7478 7371 Swap: 0 0 0
查看內存使用情況。倒數第二列:
Linux用free memory來做cache, 當應用需要時,這些cache可以被回收。比如kswapd內核進程做頁面回收時可能回收cache;另外手動寫/proc/sys/vm/drop_caches也會導致cache回收。
上面示例中free的內存只有129M,大部分memory被cache占用。但是系統并沒有問題。
8. sar -n DEV 1
輸出指標的含義如下:
這個工具可以查看網絡接口的吞吐量,特別是上面藍色高亮的rxkB/s和txkB/s,這是網絡負載,也可以看是否達到了limit。
9. sar -n TCP,ETCP 1
輸出指標的含義如下:
上述藍色高亮的3個指標:active/s, passive/s和retrans/s是比較有代表性的指標。
10. top
# top Tasks: 79 total, 2 running, 77 sleeping, 0 stopped, 0 zombie %Cpu(s): 6.0 us, 44.1 sy, 0.0 ni, 49.6 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st KiB Mem : 8010456 total, 7326348 free, 132296 used, 551812 buff/cache KiB Swap: 0 total, 0 free, 0 used. 7625940 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4617 root 20 0 44064 2076 1544 R 100.0 0.0 16:27.23 nc 13634 nginx 20 0 121192 3864 1208 S 0.3 0.0 17:59.85 nginx 1 root 20 0 125372 3740 2428 S 0.0 0.0 6:11.53 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.60 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:17.92 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:03.21 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 31:47.62 rcu_sched 10 root rt 0 0 0 0 S 0.0 0.0 0:10.00 watchdog/0
top是一個常用的命令,包括了多方面的指標。缺點是沒有滾動輸出(rolling output),不可復現問題發生時不容易保留信息。對于信息保留,用vmstat或者pidstat等能夠提供滾動輸出的工具會更好。
示例的問題?
在上面利用工具排查的過程中,我們可以在非常短的時間內快速得到如下結論:
整個排查過程把系統的問題定位到了進程級別,并且能排除一些可能性 (Disk I/O和內存)。接下來就是進一步到進程級別的排查,不屬于本文的覆蓋范圍,有時間再進一步演示。
1 cpu性能評估
Cpu是影響Linux性能的主要因素之一,下面先介紹幾個查看CPU性能的命令。
1.1 vmstat命令
該命令可以顯示關于系統各種資源之間相關性能的簡要信息,這里我們主要用它來看CPU的一個負載情況。
下面是vmstat命令在某個系統的輸出結果:
[root@node1 ~]# vmstat 2 3
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 162240 8304 67032 0 0 13 21 1007 23 0 1 98 0 0
0 0 0 162240 8304 67032 0 0 1 0 1010 20 0 1 100 0 0
0 0 0 162240 8304 67032 0 0 1 1 1009 18 0 1 99 0 0
對上面每項的輸出解釋如下:
l procs
? r列表示運行和等待cpu時間片的進程數,這個值如果長期大于系統CPU的個數,說明CPU不足,需要增加CPU。
? b列表示在等待資源的進程數,比如正在等待I/O、或者內存交換等。
l memory
? swpd列表示切換到內存交換區的內存數量(以k為單位)。如果swpd的值不為0,或者比較大,只要si、so的值長期為0,這種情況下一般不用擔心,不會影響系統性能。
? free列表示當前空閑的物理內存數量(以k為單位)
? buff列表示buffers cache的內存數量,一般對塊設備的讀寫才需要緩沖。
? cache列表示page cached的內存數量,一般作為文件系統cached,頻繁訪問的文件都會被cached,如果cache值較大,說明cached的文件數較多,如果此時IO中bi比較小,說明文件系統效率比較好。
l swap
? si列表示由磁盤調入內存,也就是內存進入內存交換區的數量。
? so列表示由內存調入磁盤,也就是內存交換區進入內存的數量。
一般情況下,si、so的值都為0,如果si、so的值長期不為0,則表示系統內存不足。需要增加系統內存。
l IO項顯示磁盤讀寫狀況
? Bi列表示從塊設備讀入數據的總量(即讀磁盤)(每秒kb)。
? Bo列表示寫入到塊設備的數據總量(即寫磁盤)(每秒kb)
這里我們設置的bi+bo參考值為1000,如果超過1000,而且wa值較大,則表示系統磁盤IO有問題,應該考慮提高磁盤的讀寫性能。
l system 顯示采集間隔內發生的中斷數
? in列表示在某一時間間隔中觀測到的每秒設備中斷數。
? cs列表示每秒產生的上下文切換次數。
上面這2個值越大,會看到由內核消耗的CPU時間會越多。
l CPU項顯示了CPU的使用狀態,此列是我們關注的重點。
? us列顯示了用戶進程消耗的CPU 時間百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期大于50%,就需要考慮優化程序或算法。
? sy列顯示了內核進程消耗的CPU時間百分比。Sy的值較高時,說明內核消耗的CPU資源很多。
根據經驗,us+sy的參考值為80%,如果us+sy大于 80%說明可能存在CPU資源不足。
? id 列顯示了CPU處在空閑狀態的時間百分比。
? wa列顯示了IO等待所占用的CPU時間百分比。wa值越高,說明IO等待越嚴重,根據經驗,wa的參考值為20%,如果wa超過20%,說明IO等待嚴重,引起IO等待的原因可能是磁盤大量隨機讀寫造成的,也可能是磁盤或者磁盤控制器的帶寬瓶頸造成的(主要是塊操作)。
綜上所述,在對CPU的評估中,需要重點注意的是procs項r列的值和CPU項中us、sy和id列的值。
1.2 sar命令
檢查CPU性能的第二個工具是sar,sar功能很強大,可以對系統的每個方面進行多帶帶的統計,但是使用sar命令會增加系統開銷,不過這些開銷是可以評估的,對系統的統計結果不會有很大影響。
下面是sar命令對某個系統的CPU統計輸出:
[root@webserver ~]# sar -u 3 5
Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)
11:41:24 AM CPU %user %nice %system %iowait %steal %idle
11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83
11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50
11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99. 45
對上面每項的輸出解釋如下:
l %user列顯示了用戶進程消耗的CPU 時間百分比。
l %nice列顯示了運行正常進程所消耗的CPU 時間百分比。
l %system列顯示了系統進程消耗的CPU時間百分比。
l %iowait列顯示了IO等待所占用的CPU時間百分比
l %steal列顯示了在內存相對緊張的環境下pagein強制對不同的頁面進行的steal操作 。
l %idle列顯示了CPU處在空閑狀態的時間百分比。
1.3 iostat命令
iostat指令主要用于統計磁盤IO狀態,但是也能查看CPU的使用信息,它的局限性是只能顯示系統所有CPU的平均信息,看下面的一個輸出:
[root@webserver ~]# iostat -c
Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.52 0.00 0.30 0.24 0.00 96.96
在這里,我們使用了“-c”參數,只顯示系統CPU的統計信息,輸出中每項代表的含義與sar命令的輸出項完全相同,不再詳述。
1.4 uptime命令
uptime是監控系統性能最常用的一個命令,主要用來統計系統當前的運行狀況,輸出的信息依次為:系統現在的時間、系統從上次開機到現在運行了多長時間、系統目前有多少登陸用戶、系統在一分鐘內、五分鐘內、十五分鐘內的平均負載。看下面的一個輸出:
[root@webserver ~]# uptime
18:52:11 up 27 days, 19:44, 2 users, load average: 0.12, 0.08, 0.08
這里需要注意的是load average這個輸出值,這三個值的大小一般不能大于系統CPU的個數,例如,本輸出中系統有8個CPU,如果load average的三個值長期大于8時,說明CPU很繁忙,負載很高,可能會影響系統性能,但是偶爾大于8時,倒不用擔心,一般不會影響系統性能。相反,如果load average的輸出值小于CPU的個數,則表示CPU還有空閑的時間片,比如本例中的輸出,CPU是非常空閑的。
1.5 本節小結
上面介紹了檢查CPU使用狀況的四個命令,通過這些命令需要了解的是:系統CPU是否出現性能瓶頸,也就是說,以上這些命令只能查看CPU是否繁忙,負載是否過大,但是無法知道CPU為何負載過大,因而,判斷系統CPU出現問題后,要結合top、ps等命令進一步檢查是由那些進程導致CPU負載過大的。引起CPU資源緊缺的原因可能是應用程序不合理造成的,也可能是硬件資源匱乏引起的,所以,要具體問題具體分析,或者優化應用程序,或者增加系統CPU資源。
2 內存性能評估
內存的管理和優化是系統性能優化的一個重要部分,內存資源的充足與否直接影響應用系統的使用性能,在進行內存優化之前,一定要熟悉linux的內存管理機制,這一點我們在前面的章節已經有深入講述,本節的重點是如何通過系統命令監控linux系統的內存使用狀況。
2.1 free 命令
free是監控linux內存使用狀況最常用的指令,看下面的一個輸出:
[root@webserver ~]# free -m
total used free shared buffers cached
Mem: 8111 7185 925 0 243 6299
-/+ buffers/cache: 643 7468
Swap: 8189 0 8189
“free –m”表示以M為單位查看內存使用情況,在這個輸出中,我們重點關注的應該是free列與cached列的輸出值,由輸出可知,此系統共8G內存,系統空閑內存還有925M,其中,Buffer Cache占用了243M,Page Cache占用了6299M,由此可知系統緩存了很多的文件和目錄,而對于應用程序來說,可以使用的內存還有7468M,當然這個7468M包含了Buffer Cache和Page Cache的值。在swap項可以看出,交換分區還未使用。所以從應用的角度來說,此系統內存資源還非常充足。
一般有這樣一個經驗公式:應用程序可用內存/系統物理內存>70%時,表示系統內存資源非常充足,不影響系統性能,應用程序可用內存/系統物理內存<20%時,表示系統內存資源緊缺,需要增加系統內存,20%< 應用程序可用內存/系統物理內存<70%時,表示系統內存資源基本能滿足應用需求,暫時不影響系統性能。
2.2 通過watch與free相結合動態監控內存狀況
watch是一個非常有用的命令,幾乎每個linux發行版都帶有這個工具,通過watch,可以動態的監控命令的運行結果,省去手動執行的麻煩。
可以在watch后面跟上需要運行的命令,watch就會自動重復去運行這個命令,默認是2秒鐘執行一次,并把執行的結果更新在屏幕上。例如:
[root@webserver ~]# watch -n 3 -d free
Every 3.0s: free Sun Nov 30 16:23:20 2008
total used free shared buffers cached
Mem: 8306544 7349548 956996 0 203296 6500024
-/+ buffers/cache: 646228 7660316
Swap: 8385888 160 8385728
其中,“-n”指定重復執行的時間,“-d”表示高亮顯示變動。
2.3 vmstat命令監控內存
vmstat命令在監控系統內存方面功能強大,請看下面的一個輸出:
procs ———–memory———- —swap– —–io—- –system– —-cpu—-
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 906440 22796 155616 1325496 340 180 2 4 1 4 80 0 10 10
0 0 906440 42796 155616 1325496 320 289 0 54 1095 287 70 15 0 15
0 0 906440 42884 155624 1325748 236 387 2 102 1064 276 78 2 5 15
對于內存的監控,在vmstat中重點關注的是swpd、si和so行,從這個輸出可以看出,此系統內存資源緊缺,swpd占用了900M左右內存,si和so占用很大,而由于系統內存的緊缺,導致出現15%左右的系統等待,此時增加系統的內存是必須要做的。
2.4 sar -r命令組合
sar命令也可以監控linux的內存使用狀況,可以通過“sar –r”組合查看系統內存和交換空間的使用率。請看下面的一個輸出:
[root@webserver ~]# sar -r 2 3
Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
09:57:33 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
09:57:35 PM 897988 7408556 89.19 249428 6496532 786556 4.71
09:57:37 PM 898564 7407980 89.18 249428 6496532 784276 4.70
09:57:39 PM 899196 7407348 89.17 249440 6496520 782132 4.69
Average: 898583 7407961 89.18 249432 6496528 784321 4.70
其中:
Kbmemfree表示空閑物理內存大小,kbmemused表示已使用的物理內存空間大小,%memused表示已使用內存占總內存大小的百分比,kbbuffers和kbcached分別表示Buffer Cache和Page Cache的大小,kbcommit和%commit分別表示應用程序當前使用的內存大小和使用百分比。
可以看出sar的輸出其實與free的輸出完全對應,不過sar更加人性化,不但給出了內存使用量,還給出了內存使用的百分比以及統計的平均值。從%commit項可知,此系統目前內存資源充足。
2.5 本節小結
上面介紹了內存監控常用的幾個指令以及一些經驗規則,其實現在的系統在內存方面出現的瓶頸已經很少,因為內存價格很低,充足的內存已經完全能滿足應用程序和系統本身的需要,如果系統在內存方面出現瓶頸,很大的可能是應用程序本身的問題造成的。
Linux服務器性能快速分析通常使用top命令,通過一個命令,就能實時查看服務器的負載、cpu、內存使用率,類似windows 系統的任務管理器。那如何使用top命令查看和分析各項性能指標呢?
只需登錄到服務器后,在命令行模式下輸入top即可,是不是很容易呢。如下圖所示:
前5行是服務器性能指標概覽。以上圖為例來詳細說明各項指標代表的含義,以便于理解。
第1行是任務隊列信息:
當前時間 22:52:45
系統運行時間 823 days
當前登錄用戶數 2 users
系統負載 load average: 0.00, 0.03, 0.06 。 三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。如果15分鐘對應的數值在升高,但1分鐘對應數值降低,則代表服務器負載呈下降趨勢,反之代表負載在升高。
第2行為進程信息:
進程總數 121
正在運行的進程數 1
睡眠的進程數 119
停止的進程數 1
僵尸進程數 0
第3行為cpu信息:
用戶空間占用CPU百分比 (us)0.3%
內核空間占用CPU百分比(sy)0.2%
用戶進程空間內改變過優先級的進程占用CPU百分比(ni)10%
空閑CPU百分比(id)89.2%
等待輸入輸出的CPU時間百分比(wa) 0.0%
硬中斷(Hardware IRQ)占用CPU的百分比(hi)0.0%
軟中斷(Software Interrupts)占用CPU的百分比(si)0.2%
虛擬 CPU 等待實際 CPU 的時間的百分比(st)0.2%
第4、5行為內存信息:
物理內存總量 6291456k
使用的物理內存總量 5760744k
空閑內存總量 530712k
用作內核緩存的內存量 209064k
交換區總量6258680k
使用的交換區總量 3132084k
空閑交換區總量 3126596k
緩沖的交換區總量 437464k
第6行開始是進程信息區,下方顯示了各個進程的詳細信息。字段含義分別為:
PID 進程id
USER 進程所有者的用戶名
PR 優先級
NI nice值。負值表示高優先級,正值表示低優先級
VIRT 進程使用的虛擬內存總量,單位kb
RES 進程使用的、未被換出的物理內存大小
SHR 共享內存大小
S 進程狀態(D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程 )
%CPU 上次更新到現在的CPU時間占用百分比,即cpu使用率
%MEM 進程使用的物理內存百分比 ,即內存使用率
TIME+ 進程使用的CPU時間總計
COMMAND 命令名/命令行
各指標含義已詳細說明,指標項很多,但我們工作中判斷服務器是否存在性能問題,通常關注以下幾項指標:
1.CPU
使用率。在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況。CPU使用率數值越高,代表服務器越繁忙。而進程信息區還會顯示各進程當前的cpu使用率,若需查詢進程下各線程cpu使用率情況,可使用top -p 進程id -H,配合使用jstack命令還可定位到具體占用cpu過高的功能。2.內存使用率。若使用的內存過高,空閑內存較低,則需注意。
3.服務器負載,若服務器負載 load average超過cpu核心數的話,則說明系統超負荷運行。如果是單核CPU,負載等于1就是滿負荷運轉了,如果是四核、甚至更多核心的CPU,負載大于1這說明系統當前負載很小,不需要過多關心。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答