Linux運維工程師必須掌握的服務(wù)器性能參數(shù)指標(biāo)
一個基于Linux操作系統(tǒng)的服務(wù)器運行的同時,也會表征出各種各樣參數(shù)信息。通常來說運維人員、系統(tǒng)管理員會對這些數(shù)據(jù)會極為敏感,但是這些參數(shù)對于開發(fā)者來說也十分重要,尤其當(dāng)你的程序非正常工作的時候,這些蛛絲馬跡往往會幫助快速定位跟蹤問題。
這里只是一些簡單的工具查看系統(tǒng)的相關(guān)參數(shù),當(dāng)然很多工具也是通過分析加工/proc、/sys下的數(shù)據(jù)來工作的,而那些更加細(xì)致、專業(yè)的性能監(jiān)測和調(diào)優(yōu),可能還需要更加專業(yè)的工具(perf、systemtap等)和技術(shù)才能完成哦。畢竟來說,系統(tǒng)性能監(jiān)控本身就是個大學(xué)問。
一、CPU和內(nèi)存類
1.1 top
# ~ top
第一行后面的三個值是系統(tǒng)在之前1、5、15的平均負(fù)載,也可以看出系統(tǒng)負(fù)載是上升、平穩(wěn)、下降的趨勢,當(dāng)這個值超過CPU可執(zhí)行單元的數(shù)目,則表示CPU的性能已經(jīng)飽和成為瓶頸了。
第二行統(tǒng)計了系統(tǒng)的任務(wù)狀態(tài)信息。running很自然不必多說,包括正在CPU上運行的和將要被調(diào)度運行的;sleeping通常是等待事件(比如IO操作)完成的任務(wù),細(xì)分可以包括interruptible和uninterruptible的類型;stopped是一些被暫停的任務(wù),通常發(fā)送SIGSTOP或者對一個前臺任務(wù)操作Ctrl-Z可以將其暫停;zombie僵尸任務(wù),雖然進(jìn)程終止資源會被自動回收,但是含有退出任務(wù)的task descriptor需要父進(jìn)程訪問后才能釋放,這種進(jìn)程顯示為defunct狀態(tài),無論是因為父進(jìn)程提前退出還是未wait調(diào)用,出現(xiàn)這種進(jìn)程都應(yīng)該格外注意程序是否設(shè)計有誤。
第三行CPU占用率根據(jù)類型有以下幾種情況:
-
(us) user: CPU在低nice值(高優(yōu)先級)用戶態(tài)所占用的時間(nice<=0)。正常情況下只要服務(wù)器不是很閑,那么大部分的CPU時間應(yīng)該都在此執(zhí)行這類程序
-
(sy) system: CPU處于內(nèi)核態(tài)所占用的時間,操作系統(tǒng)通過系統(tǒng)調(diào)用(system call)從用戶態(tài)陷入內(nèi)核態(tài),以執(zhí)行特定的服務(wù);通常情況下該值會比較小,但是當(dāng)服務(wù)器執(zhí)行的IO比較密集的時候,該值會比較大
-
(ni) nice: CPU在高nice值(低優(yōu)先級)用戶態(tài)以低優(yōu)先級運行占用的時間(nice>0)。默認(rèn)新啟動的進(jìn)程nice=0,是不會計入這里的,除非手動通過renice或者setpriority()的方式修改程序的nice值
-
(id) idle: CPU在空閑狀態(tài)(執(zhí)行kernel idle handler)所占用的時間
-
(wa) iowait: 等待IO完成做占用的時間
-
(hi) irq: 系統(tǒng)處理硬件中斷所消耗的時間
-
(si) softirq: 系統(tǒng)處理軟中斷所消耗的時間,記住軟中斷分為softirqs、tasklets(其實是前者的特例)、work queues,不知道這里是統(tǒng)計的是哪些的時間,畢竟work queues的執(zhí)行已經(jīng)不是中斷上下文了
-
(st) steal: 在虛擬機情況下才有意義,因為虛擬機下CPU也是共享物理CPU的,所以這段時間表明虛擬機等待hypervisor調(diào)度CPU的時間,也意味著這段時間hypervisor將CPU調(diào)度給別的CPU執(zhí)行,這個時段的CPU資源被”stolen”了。這個值在我KVM的VPS機器上是不為0的,但也只有0.1這個數(shù)量級,是不是可以用來判斷VPS超售的情況?
CPU占用率高很多情況下意味著一些東西,這也給服務(wù)器CPU使用率過高情況下指明了相應(yīng)地排查思路:
-
(a) 當(dāng)user占用率過高的時候,通常是某些個別的進(jìn)程占用了大量的CPU,這時候很容易通過top找到該程序;此時如果懷疑程序異常,可以通過perf等思路找出熱點調(diào)用函數(shù)來進(jìn)一步排查;
-
(b) 當(dāng)system占用率過高的時候,如果IO操作(包括終端IO)比較多,可能會造成這部分的CPU占用率高,比如在file server、database server等類型的服務(wù)器上,否則(比如>20%)很可能有些部分的內(nèi)核、驅(qū)動模塊有問題;
-
(c) 當(dāng)nice占用率過高的時候,通常是有意行為,當(dāng)進(jìn)程的發(fā)起者知道某些進(jìn)程占用較高的CPU,會設(shè)置其nice值確保不會淹沒其他進(jìn)程對CPU的使用請求; #p#page_title#e#
-
(d) 當(dāng)iowait占用率過高的時候,通常意味著某些程序的IO操作效率很低,或者IO對應(yīng)設(shè)備的性能很低以至于讀寫操作需要很長的時間來完成;
-
(e) 當(dāng)irq/softirq占用率過高的時候,很可能某些外設(shè)出現(xiàn)問題,導(dǎo)致產(chǎn)生大量的irq請求,這時候通過檢查/proc/interrupts文件來深究問題所在;
-
(f) 當(dāng)steal占用率過高的時候,黑心廠商虛擬機超售了吧!
第四行和第五行是物理內(nèi)存和虛擬內(nèi)存(交換分區(qū))的信息:
total = free + used + buff/cache,現(xiàn)在buffers和cached Mem信息總和到一起了,但是buffers和cached
Mem的關(guān)系很多地方都沒說清楚。其實通過對比數(shù)據(jù),這兩個值就是/proc/meminfo中的Buffers和Cached字段:Buffers是針對raw disk的塊緩存,主要是以raw block的方式緩存文件系統(tǒng)的元數(shù)據(jù)(比如超級塊信息等),這個值一般比較小(20M左右);而Cached是針對于某些具體的文件進(jìn)行讀緩存,以增加文件的訪問效率而使用的,可以說是用于文件系統(tǒng)中文件緩存使用。
而avail Mem是一個新的參數(shù)值,用于指示在不進(jìn)行交換的情況下,可以給新開啟的程序多少內(nèi)存空間,大致和free + buff/cached相當(dāng),而這也印證了上面的說法,free + buffers + cached Mem才是真正可用的物理內(nèi)存。并且,使用交換分區(qū)不見得是壞事情,所以交換分區(qū)使用率不是什么嚴(yán)重的參數(shù),但是頻繁的swap in/out就不是好事情了,這種情況需要注意,通常表示物理內(nèi)存緊缺的情況。
最后是每個程序的資源占用列表,其中CPU的使用率是所有CPU core占用率的總和。通常執(zhí)行top的時候,本身該程序會大量的讀取/proc操作,所以基本該top程序本身也會是名列前茅的。
top雖然非常強大,但是通常用于控制臺實時監(jiān)測系統(tǒng)信息,不適合長時間(幾天、幾個月)監(jiān)測系統(tǒng)的負(fù)載信息,同時對于短命的進(jìn)程也會遺漏無法給出統(tǒng)計信息。
1.2 vmstat
vmstat是除top之外另一個常用的系統(tǒng)檢測工具,下面截圖是我用-j4編譯boost的系統(tǒng)負(fù)載。
r表示可運行進(jìn)程數(shù)目,數(shù)據(jù)大致相符;而b表示的是uninterruptible睡眠的進(jìn)程數(shù)目;swpd表示使用到的虛擬內(nèi)存數(shù)量,跟top-Swap-used的數(shù)值是一個含義,而如手冊所說,通常情況下buffers數(shù)目要比cached Mem小的多,buffers一般20M這么個數(shù)量級;io域的bi、bo表明每秒鐘向磁盤接收和發(fā)送的塊數(shù)目(blocks/s);system域的in表明每秒鐘的系統(tǒng)中斷數(shù)(包括時鐘中斷),cs表明因為進(jìn)程切換導(dǎo)致上下文切換的數(shù)目。
說到這里,想到以前很多人糾結(jié)編譯linux kernel的時候-j參數(shù)究竟是CPU Core還是CPU Core+1?通過上面修改-j參數(shù)值編譯boost和linux kernel的同時開啟vmstat監(jiān)控,發(fā)現(xiàn)兩種情況下context switch基本沒有變化,且也只有顯著增加-j值后context switch才會有顯著的增加,看來不必過于糾結(jié)這個參數(shù)了,雖然具體編譯時間長度我還沒有測試。資料說如果不是在系統(tǒng)啟動或者benchmark的狀態(tài),參數(shù)context switch>100000程序肯定有問題。
1.3 pidstat
如果想對某個進(jìn)程進(jìn)行全面具體的追蹤,沒有什么比pidstat更合適的了——棧空間、缺頁情況、主被動切換等信息盡收眼底。這個命令最有用的參數(shù)是-t,可以將進(jìn)程中各個線程的詳細(xì)信息羅列出來。
-r: 顯示缺頁錯誤和內(nèi)存使用狀況,缺頁錯誤是程序需要訪問映射在虛擬內(nèi)存空間中但是還尚未被加載到物理內(nèi)存中的一個分頁,缺頁錯誤兩個主要類型是:
(a). minflt/s 指的minor faults,當(dāng)需要訪問的物理頁面因為某些原因(比如共享頁面、緩存機制等)已經(jīng)存在于物理內(nèi)存中了,只是在當(dāng)前進(jìn)程的頁表中沒有引用之,這種情況下MMU只需要設(shè)置對應(yīng)的entry就可以了,這個代價是相當(dāng)小的;
(b). majflt/s 指的major faults(hard page fault),MMU需要在當(dāng)前可用物理內(nèi)存中申請一塊空閑的物理頁面(如果沒有可用的空閑頁面,則需要將別的物理頁面切換到交換空間去以釋放得到空閑物理頁面),然后從外部低速設(shè)備加載數(shù)據(jù)到該物理頁面中,并設(shè)置好對應(yīng)的entry,這個代價是相當(dāng)高的,和前者有幾個數(shù)據(jù)級的差異;如果發(fā)生較多的major faults,雖然可以將交換分區(qū)建立在高速設(shè)備(比如PCI-E SSD)上改善性能,但主要是提示你缺物理內(nèi)存了; #p#page_title#e#
(c). 還有一種情況有人也歸結(jié)進(jìn)來,就是invalid fault,指的進(jìn)程要訪問的地址不在其虛擬空間內(nèi)部,屬于越界訪問。這是比較嚴(yán)重的錯誤,通常會報段錯誤并終止程序的執(zhí)行。
-s:棧使用狀況,包括StkSize為線程保留的??臻g,以及StkRef實際使用的??臻g。使用ulimit -s發(fā)現(xiàn)CentOS 6.x上面默認(rèn)??臻g是10240K,而CentOS 7.x、Ubuntu系列默認(rèn)棧空間大小為8196K
-u:CPU使用率情況,參數(shù)同前面類似
-w:線程上下文切換的數(shù)目,還細(xì)分為cswch/s因為等待資源等因素導(dǎo)致的主動切換,以及nvcswch/s線程CPU時間導(dǎo)致的被動切換的統(tǒng)計
如果每次都先ps得到程序的pid后再操作pidstat會顯得很麻煩,所以這個殺手锏的-C可以指定某個字符串,然后Command中如果包含這個字符串,那么該程序的信息就會被打印統(tǒng)計出來,-l可以顯示完整的程序名和參數(shù)
#~ pidstat -w -t -C “ailaw” -l
這么看來,如果查看單個尤其是多線程的任務(wù)時候,pidstat比常用的ps更好使!
1.4 其他
當(dāng)需要單獨監(jiān)測單個CPU情況的時候,除了htop還可以使用mpstat,查看在SMP處理器上各個Core的工作量是否負(fù)載均衡,是否有某些熱點線程占用Core。Linux中還有一個工具taskset,可以設(shè)置后面運行的命令的CPU affinity。
➜ ~ mpstat -P ALL 1
如果想直接監(jiān)測某個進(jìn)程占用的資源,既可以使用top -u taozj的方式過濾掉其他用戶無關(guān)進(jìn)程,也可以采用下面的方式進(jìn)行選擇,ps命令可以自定義需要打印的條目信息:
1
while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | grep ‘ailawd’; sleep 1; done
如想理清繼承關(guān)系,下面一個常用的參數(shù)可以用于顯示進(jìn)程樹結(jié)構(gòu),顯示效果比pstree詳細(xì)美觀的多
# ~ ps axjf
二、磁盤IO類
iotop可以直觀的顯示各個進(jìn)程、線程的磁盤讀取實時速率;lsof不僅可以顯示普通文件的打開信息(使用者),還可以操作/dev/sda1這類設(shè)備文件的打開信息,那么比如當(dāng)分區(qū)無法umount的時候,就可以通過lsof找出磁盤該分區(qū)的使用狀態(tài)了,而且添加+fg參數(shù)還可以額外顯示文件打開flag標(biāo)記。
2.1 iostat
#~ iostat -xz 1
其實無論使用iostat -xz 1還是使用sar -d 1,對于磁盤重要的參數(shù)是:
avgqu-sz: 發(fā)送給設(shè)備I/O請求的等待隊列平均長度,對于單個磁盤如果值>1表明設(shè)備飽和,對于多個磁盤陣列的邏輯磁盤情況除外;
await(r_await、w_await): 平均每次設(shè)備I/O請求操作的等待時間(ms),包含請求排列在隊列中和被服務(wù)的時間之和;
svctm: 發(fā)送給設(shè)備I/O請求的平均服務(wù)時間(ms),如果svctm與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,否則磁盤隊列等待時間較長,磁盤響應(yīng)較差;
%util: 設(shè)備的使用率,表明每秒中用于I/O工作時間的占比,單個磁盤當(dāng)%util>60%的時候性能就會下降(體現(xiàn)在await也會增加),當(dāng)接近100%時候就設(shè)備飽和了,但對于有多個磁盤陣列的邏輯磁盤情況除外;
還有,雖然監(jiān)測到的磁盤性能比較差,但是不一定會對應(yīng)用程序的響應(yīng)造成影響,內(nèi)核通常使用I/O asynchronously技術(shù),使用讀寫緩存技術(shù)來改善性能,不過這又跟上面的物理內(nèi)存的限制相制約了。
上面的這些參數(shù),對網(wǎng)絡(luò)文件系統(tǒng)也是受用的。
三、網(wǎng)絡(luò)類
網(wǎng)絡(luò)性能對于服務(wù)器的重要性不言而喻,工具iptraf可以直觀的現(xiàn)實網(wǎng)卡的收發(fā)速度信息,比較的簡潔方便通過sar -n DEV 1也可以得到類似的吞吐量信息,而網(wǎng)卡都標(biāo)配了最大速率信息,比如百兆網(wǎng)卡千兆網(wǎng)卡,很容易查看設(shè)備的利用率。
通常,網(wǎng)卡的傳輸速率并不是網(wǎng)絡(luò)開發(fā)中最為關(guān)切的,而是針對特定的UDP、TCP連接的丟包率、重傳率,以及網(wǎng)絡(luò)延時等信息。
3.1 netstat
# ~ netstat -s
顯示自從系統(tǒng)啟動以來,各個協(xié)議的總體數(shù)據(jù)信息。雖然參數(shù)信息比較豐富有用,但是累計值,除非兩次運行做差才能得出當(dāng)前系統(tǒng)的網(wǎng)絡(luò)狀態(tài)信息,亦或者使用watch眼睛直觀其數(shù)值變化趨勢。所以netstat通常用來檢測端口和連接信息的: #p#page_title#e#
netstat –all(a) –numeric(n) –tcp(t) –udp(u) –timers(o) –listening(l) –program(p)
–timers可以取消域名反向查詢,加快顯示速度;比較常用的有
1
2
➜ ~ netstat -antp #列出所有TCP的連接
➜ ~ netstat -nltp #列出本地所有TCP偵聽套接字,不要加-a參數(shù)
3.2 sar
sar這個工具太強大了,什么CPU、磁盤、頁面交換啥都管,這里使用-n主要用來分析網(wǎng)絡(luò)活動,雖然網(wǎng)絡(luò)中它還給細(xì)分了NFS、IP、ICMP、SOCK等各種層次各種協(xié)議的數(shù)據(jù)信息,我們只關(guān)心TCP和UDP。下面的命令除了顯示常規(guī)情況下段、數(shù)據(jù)報的收發(fā)情況,還包括
TCP
# ~ sudo sar -n TCP,ETCP 1
active/s:本地發(fā)起的TCP連接,比如通過connect(),TCP的狀態(tài)從CLOSED -> SYN-SENT
passive/s:由遠(yuǎn)程發(fā)起的TCP連接,比如通過accept(),TCP的狀態(tài)從LISTEN -> SYN-RCVD
retrans/s(tcpRetransSegs):每秒鐘TCP重傳數(shù)目,通常在網(wǎng)絡(luò)質(zhì)量差,或者服務(wù)器過載后丟包的情況下,根據(jù)TCP的確認(rèn)重傳機制會發(fā)生重傳操作
isegerr/s(tcpInErrs):每秒鐘接收到出錯的數(shù)據(jù)包(比如checksum失敗)
UDP
# ~ sudo sar -n UDP 1
noport/s(udpNoPorts):每秒鐘接收到的但是卻沒有應(yīng)用程序在指定目的端口的數(shù)據(jù)報個數(shù)
idgmerr/s(udpInErrors):除了上面原因之外的本機接收到但卻無法派發(fā)的數(shù)據(jù)報個數(shù)
當(dāng)然,這些數(shù)據(jù)一定程度上可以說明網(wǎng)絡(luò)可靠性,但也只有同具體的業(yè)務(wù)需求場景結(jié)合起來才具有意義。
3.3 tcpdump
tcpdump不得不說是個好東西。大家都知道本地調(diào)試的時候喜歡使用wireshark,但是線上服務(wù)端出現(xiàn)問題怎么弄呢?附錄的參考文獻(xiàn)給出了思路:復(fù)原環(huán)境,使用tcpdump進(jìn)行抓包,當(dāng)之前的問題復(fù)現(xiàn)(比如通過觀察日志顯示或者某個狀態(tài)顯現(xiàn))的時候,就可以結(jié)束抓包了。而且tcpdump本身帶有-C/-W參數(shù),可以限制抓取包存儲文件的大小,當(dāng)達(dá)到這個這個限制的時候保存的包數(shù)據(jù)自動rotate,所以抓取的數(shù)據(jù)包的數(shù)量總體還是可控的。此后將線上數(shù)據(jù)包拿下線來,用wireshark想怎么看就怎么看,豈不樂哉!tcpdump雖然沒有GUI界面,但是抓包的功能絲毫不弱,線上服務(wù)器的流量可能會很大,但是通過指定網(wǎng)卡、主機、端口、協(xié)議等各項過濾參數(shù),抓下來的包完整又帶有時間戳,可以結(jié)合時間點進(jìn)行推測就可以大大縮小可疑數(shù)據(jù)包的范圍,所以線上程序的數(shù)據(jù)包分析也可以這么簡單。
下面就是一個小的測試,可見Chrome啟動時候自動向Webserver發(fā)起建立了三條連接,由于這里限制了dst port參數(shù),所以服務(wù)端的應(yīng)答包被過濾掉了,拿下來用wireshark打開,SYNC、ACK建立連接的過程還是很明顯的!在使用tcpdump的時候,需要盡可能的配置抓取的過濾條件,一方面便于接下來的分析,二則tcpdump開啟后對網(wǎng)卡和系統(tǒng)的性能會有影響,進(jìn)而會影響到在線業(yè)務(wù)的性能。