1. 摘要
一個基於 Linux 操作系統的服務器運行的同時,也會表征出各種各樣參數信息。通常來說運維人員、系統管理員會對這些數據會極為敏感,但是這些參數對於開發者來說也十分重要,尤其當程序非正常工作的時候,這些蛛絲馬跡往往會幫助快速定位跟蹤問題。
這里只是一些簡單的工具查看系統的相關參數,當然很多工具也是通過分析加工 /proc、/sys 下的數據來工作的,而那些更加細致、專業的性能監測和調優,可能還需要更加專業的工具(perf、systemtap 等)和技術才能完成哦。畢竟來說,系統性能監控本身就是個大學問。
影響Linux服務器性能的主要因素:
- CPU
- 內存
- 磁盤I/O
- 網絡I/O
2. 系統性能評估標准
其中:
%user:表示CPU處在用戶模式下的時間百分比。
%sys:表示CPU處在系統模式下的時間百分比。
%iowait:表示CPU等待輸入輸出完成時間的百分比。
swap in:即si,表示虛擬內存的頁導入,即從SWAP DISK交換到RAM
swap out:即so,表示虛擬內存的頁導出,即從RAM交換到SWAP DISK。
3. 系統性能分析工具
3.1. 常用系統命令
Vmstat、sar、iostat、netstat、free、ps、top等
3.2. 常用組合方式
用vmstat、sar、iostat檢測是否是CPU瓶頸
用free、vmstat檢測是否是內存瓶頸
用iostat檢測是否是磁盤I/O瓶頸
用netstat檢測是否是網絡帶寬瓶頸
4. 系統整體性能評估
執行top命令
[root@mail ~]# top
第一行后面的三個load average值是系統在之前 1、5、15分鍾的平均負載,也可以看出系統負載是上升、平穩、下降的趨勢,當這個值超過 CP可執行單元的數目,則表示 CP的性能已經飽和成為瓶頸了。
第二行統計了系統的任務狀態信息。running 很自然不必多說,包括正在 CP上運行的和將要被調度運行的;sleeping 通常是等待事件(比如 IO 操作)完成的任務,細分可以包括 interruptible 和 uninterruptible 的類型;stopped 是一些被暫停的任務,通常發送 SIGSTOP 或者對一個前台任務操作 Ctrl-Z 可以將其暫停;zombie 僵屍任務,雖然進程終止資源會被自動回收,但是含有退出任務的 task descriptor 需要父進程訪問后才能釋放,這種進程顯示為 defunct 狀態,無論是因為父進程提前退出還是未 wait 調用,出現這種進程都應該格外注意程序是否設計有誤。
第三行 CP占用率根據類型有以下幾種情況:
(us) user:CP在低 nice 值(高優先級)用戶態所占用的時間(nice<=0)。正常情況下只要服務器不是很閑,那么大部分的 CP時間應該都在此執行這類程序
(sy) system:CP處於內核態所占用的時間,操作系統通過系統調用(system call)從用戶態陷入內核態,以執行特定的服務;通常情況下該值會比較小,但是當服務器執行的 IO 比較密集的時候,該值會比較大
(ni) nice:CP在高 nice 值(低優先級)用戶態以低優先級運行占用的時間(nice>0)。默認新啟動的進程 nice=0,是不會計入這里的,除非手動通過 renice 或者 setpriority() 的方式修改程序的nice值
(id) idle:CP在空閑狀態(執行 kernel idle handler )所占用的時間
(wa) iowait:等待 IO 完成做占用的時間
(hi) irq:系統處理硬件中斷所消耗的時間
(si) softirq:系統處理軟中斷所消耗的時間,記住軟中斷分為 softirqs、tasklets (其實是前者的特例)、work queues,不知道這里是統計的是哪些的時間,畢竟 work queues 的執行已經不是中斷上下文了
(st) steal:在虛擬機情況下才有意義,因為虛擬機下 CP也是共享物理 CP的,所以這段時間表明虛擬機等待 hypervisor 調度 CP的時間,也意味着這段時間 hypervisor 將 CP調度給別的 CP執行,這個時段的 CP資源被“stolen”了。
第四行和第五行是物理內存和虛擬內存(交換分區)的信息:
total = free + used + buff/cache,現在buffers和cached Mem信息總和到一起了,但是buffers和cached Mem 的關系很多地方都沒說清楚。其實通過對比數據,這兩個值就是 /proc/meminfo 中的 Buffers 和 Cached 字段:Buffers 是針對 raw disk 的塊緩存,主要是以 raw block 的方式緩存文件系統的元數據(比如超級塊信息等),這個值一般比較小(20M左右);而 Cached 是針對於某些具體的文件進行讀緩存,以增加文件的訪問效率而使用的,可以說是用於文件系統中文件緩存使用。
而 avail Mem 是一個新的參數值,用於指示在不進行交換的情況下,可以給新開啟的程序多少內存空間,大致和 free + buff/cached 相當,而這也印證了上面的說法,free + buffers + cached Mem才是真正可用的物理內存。並且,使用交換分區不見得是壞事情,所以交換分區使用率不是什么嚴重的參數,但是頻繁的 swap in/out 就不是好事情了,這種情況需要注意,通常表示物理內存緊缺的情況。
最后是每個程序的資源占用列表,其中 CP的使用率是所有 CPcore 占用率的總和。通常執行 top 的時候,本身該程序會大量的讀取 /proc 操作,所以基本該 top 程序本身也會是名列前茅的。
top 雖然非常強大,但是通常用於控制台實時監測系統信息,不適合長時間(幾天、幾個月)監測系統的負載信息,同時對於短命的進程也會遺漏無法給出統計信息。
5. CPU性能評估
5.1. 利用vmstat命令監控系統CPU
該命令可以顯示關於系統各種資源之間相關性能的簡要信息,這里我們主要用它來看CPU一個負載情況。下面是vmstat命令在某個系統的輸出結果:
結果分析:
Procs:
r列表示運行和等待cpu時間片的進程數,這個值如果長期大於系統CPU的個數,說明CPU不足,需要增加CPU。
b列表示在等待資源的進程數,比如正在等待I/O、或者內存交換等。
Cpu:
us列顯示了用戶進程消耗的CP時間百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期大於50%,就需要考慮優化程序或算法。
sy列顯示了內核進程消耗的CPU時間百分比。Sy的值較高時,說明內核消耗的CPU資源很多。
根據經驗,us+sy的參考值為80%,如果us+sy大於 80%說明可能存在CPU資源不足。
5.2. 利用sar命令監控系統CPU
結果分析:
%user列顯示了用戶進程消耗的CP時間百分比。
%nice列顯示了運行正常進程所消耗的CP時間百分比。
%system列顯示了系統進程消耗的CPU時間百分比。
%iowait列顯示了IO等待所占用的CPU時間百分比
%steal列顯示了在內存相對緊張的環境下pagein強制對不同的頁面進行的steal操作 。
%idle列顯示了CPU處在空閑狀態的時間百分比。
6. 內存性能評估
6.1. 利用vmstat命令監控內存
該命令可以顯示關於系統各種資源之間相關性能的簡要信息,這里我們主要用它來看內存情況。下面是vmstat命令在某個系統的輸出結果:
結果分析:
Memory:
swpd列表示切換到內存交換區的內存數量(以k為單位)。如果swpd的值不為0,或者比較大,只要si、so的值長期為0,這種情況下一般不用擔心,不會影響系統性能。
free列表示當前空閑的物理內存數量(以k為單位)
buff列表示buffers cache的內存數量,一般對塊設備的讀寫才需要緩沖。
cache列表示page cached的內存數量,一般作為文件系統cached,頻繁訪問的文件都會被cached,如果cache值較大,說明cached的文件數較多,如果此時IO中bi比較小,說明文件系統效率比較好。
Swap:
si列表示由磁盤調入內存,也就是內存進入內存交換區的數量。
so列表示由內存調入磁盤,也就是內存交換區進入內存的數量。
一般情況下,si、so的值都為0,如果si、so的值長期不為0,則表示系統內存不足。需要增加系統內存。
6.2. 利用free指令監控內存
一般有這樣一個經驗公式:應用程序可用內存/系統物理內存>70%時,表示系統內存資源非常充足,不影響系統性能,應用程序可用內存/系統物理內存<20%時,表示系統內存資源緊缺,需要增加系統內存,20%<應用程序可用內存/系統物理內存<70%時,表示系統內存資源基本能滿足應用需求,暫時不影響系統性能。
7. 磁盤I/O性能評估
7.1. 利用iostat評估磁盤性能
結果分析:
KB_read/s表示每秒讀取的數據塊數。
KB_wrtn/s表示每秒寫入的數據塊數。
KB_read表示讀取的所有塊數。
KB_wrtn表示寫入的所有塊數。
可以通過KB_read/s和KB_wrtn/s的值對磁盤的讀寫性能有一個基本的了解,如果KB_wrtn/s值很大,表示磁盤的寫操作很頻繁,可以考慮優化磁盤或者優化程序,如果KB_read/s值很大,表示磁盤直接讀取操作很多,可以將讀取的數據放入內存中進行操作。
對於這兩個選項的值沒有一個固定的大小,根據系統應用的不同,會有不同的值,但是有一個規則還是可以遵循的:長期的、超大的數據讀寫,肯定是不正常的,這種情況一定會影響系統性能。
7.2. 利用sar評估磁盤性能
結果分析:
await表示平均每次設備I/O操作的等待時間(以毫秒為單位)。
svctm表示平均每次設備I/O操作的服務時間(以毫秒為單位)。
%util表示一秒中有百分之幾的時間用於I/O操作。
對以磁盤IO性能,一般有如下評判標准:
正常情況下svctm應該是小於await值的,而svctm的大小和磁盤性能有關,CPU、內存的負荷也會對svctm值造成影響,過多的請求也會間接的導致svctm值的增加。
await值的大小一般取決與svctm的值和I/O隊列長度以及I/O請求模式,如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高於svctm的值,則表示I/O隊列等待太長,系統上運行的應用程序將變慢,此時可以通過更換更快的硬盤來解決問題。
%util項的值也是衡量磁盤I/O的一個重要指標,如果%util接近100%,表示磁盤產生的I/O請求太多,I/O系統已經滿負荷的在工作,該磁盤可能存在瓶頸。長期下去,勢必影響系統的性能,可以通過優化程序或者通過更換更高、更快的磁盤來解決此問題。
8. 網絡I/O性能評估
網絡性能對於服務器的重要性不言而喻,工具 iptraf 可以直觀的現實網卡的收發速度信息,比較的簡潔方便通過 sar -n DEV 1 也可以得到類似的吞吐量信息,而網卡都標配了最大速率信息,比如百兆網卡千兆網卡,很容易查看設備的利用率。
通常,網卡的傳輸速率並不是網絡開發中最為關切的,而是針對特定的 UDP、TCP 連接的丟包率、重傳率,以及網絡延時等信息。
8.1. 利用netstat評估網絡性能
8.1.1. netstat -s
顯示自從系統啟動以來,各個協議的總體數據信息。雖然參數信息比較豐富有用,但是累計值,除非兩次運行做差才能得出當前系統的網絡狀態信息,亦或者使用 眼睛直觀其數值變化趨勢。所以netstat通常用來檢測端口和連接信息的。
8.1.2. netstat -antp
列出所有TCP的連接:
8.1.3. netstat -nltp
列出本地所有TCP偵聽套接字,不要加-a參數
8.2. 利用TCP評估網絡性能
結果分析:
active/s:本地發起的 TCP 連接,比如通過 connect(),TCP 的狀態從CLOSED -> SYN-SENT。
passive/s:由遠程發起的 TCP 連接,比如通過 accept(),TCP 的狀態從LISTEN -> SYN-RCVD。
retrans/s(tcpRetransSegs):每秒鍾 TCP 重傳數目,通常在網絡質量差,或者服務器過載后丟包的情況下,根據 TCP 的確認重傳機制會發生重傳操作。
isegerr/s(tcpInErrs):每秒鍾接收到出錯的數據包(比如 checksum 失敗)。
8.3. 利用UDP評估網絡性能
結果分析:
noport/s(udpNoPorts):每秒鍾接收到的但是卻沒有應用程序在指定目的端口的數據報個數。
idgmerr/s(udpInErrors):除了上面原因之外的本機接收到但卻無法派發的數據報個數。
當然,這些數據一定程度上可以說明網絡可靠性,但也只有同具體的業務需求場景結合起來才具有意義
8.4. 利用iperf評估網絡性能
iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具,能夠提供網絡吞吐率信息,以及震動、丟包率、最大段和最大傳輸單元大小等統計信息;從而能夠幫助我們測試網絡性能,定位網絡瓶頸。
8.4.1. 常用公共參數
-i 2 #表示每2秒顯示一次報告
-w 80k #對於TCP方式,此設置為TCP窗口大小。對於UDP方式,此設置為接受UDP數據包的緩沖區大小,限制可以接受數據包的最大值
-B 192.168.122.1
#綁定到主機的多個地址中的一個。對於客戶端來說,這個參數設置了出棧接口。對於服務器端來說,這個參數設置入棧接口。這個參數只用於具有多網絡接口的主機。
#在Iperf的UDP模式下,此參數用於綁 定和加入一個多播組。使用范圍在224.0.0.0至239.255.255.255的多播地址
8.4.2. 常用客戶端參數
-b 100m #用於udp測試時,設置測試發送的帶寬,單位:bit/秒,不設置時默認為:1Mbit/秒
-c #指定服務端ip地址
-d #同時測試上行和下行
-t 10 #設置傳輸時間,為10秒
-P 5 #指定發起5個線程
8.4.3. TCP模式下網絡測試
服務端:
iperf3 -p 8000 -s -i 1
參數說明: -p : 端口號 -s : 標示服務端 -: 標示udp協議 -i : 檢測的時間間隔(單位:秒)絡測試
客戶端:
iperf3 -c 113.54.158.252 -p 8000 -i 1 -b 10M
客戶端
iperf -c 192.168.122.1 -t 60 #在tcp模式下,客戶端到服務器192.168.1.1上傳帶寬測試,測試時間為60秒。
iperf -c 192.168.122.1 -P 30 -t 60 #客戶端同時向服務器端發起30個連接線程。
iperf -c 192.168.122.1 -d -t 60 -i 2 #進行上下行帶寬測試。
8.4.4. UDP模式下網絡測試
服務器端:
iperf3 -p 8000 -s -i 1
參數說明: -p : 端口號 -s : 標示服務端 -: 標示udp協議 -i : 檢測的時間間隔(單位:秒)
客戶端:
iperf3 - -c 113.54.158.252 -p 8000 -i 1 -b 10M
參數說明: -c : 服務端的ip地址 -p : 端口號 -: 標示udp協議 -b : 每一次發送的數據大小 -t : 總的發送時間(單位:秒) -i : 發送數據的時間間隔(單位:秒) -P : 表示線程個數,不指定則默認單線程