Linux服務(wù)器工具查看系統(tǒng)的相關(guān)參數(shù)
這里只是一些簡單的工具查看系統(tǒng)的相關(guān)參數(shù),當(dāng)然很多工具也是通過分析加工 /proc、/sys 下的數(shù)據(jù)來工作的,而那些更加細(xì)致、專業(yè)的性能監(jiān)測和調(diào)優(yōu),可能還需要更加專業(yè)的工具(perf、systemtap 等)和技術(shù)才能完成哦。
一個基于 Linux 操作系統(tǒng)的服務(wù)器運(yùn)行的同時,也會表征出各種各樣參數(shù)信息。通常來說運(yùn)維人員、系統(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 上運(yùn)行的和將要被調(diào)度運(yùn)行的;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),無論是因?yàn)楦高M(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)先級運(yùn)行占用的時間(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 (其實(shí)是前者的特例)、work queues,不知道這里是統(tǒng)計的是哪些的時間,畢竟 work queues 的執(zhí)行已經(jīng)不是中斷上下文了
√ (st) steal:在虛擬機(jī)情況下才有意義,因?yàn)樘摂M機(jī)下 CPU 也是共享物理 CPU 的,所以這段時間表明虛擬機(jī)等待 hypervisor 調(diào)度 CPU 的時間,也意味著這段時間 hypervisor 將 CPU 調(diào)度給別的 CPU 執(zhí)行,這個時段的 CPU 資源被“stolen”了。這個值在我 KVM 的 VPS 機(jī)器上是不為 0 的,但也只有 0.1 這個數(shù)量級,是不是可以用來判斷 VPS 超售的情況?
CPU 占用率高很多情況下意味著一些東西,這也給服務(wù)器 CPU 使用率過高情況下指明了相應(yīng)地排查思路:
√ 當(dāng) user 占用率過高的時候,通常是某些個別的進(jìn)程占用了大量的 CPU,這時候很容易通過 top 找到該程序;此時如果懷疑程序異常,可以通過 perf 等思路找出熱點(diǎn)調(diào)用函數(shù)來進(jìn)一步排查;
√ 當(dāng) system 占用率過高的時候,如果 IO 操作(包括終端 IO)比較多,可能會造成這部分的 CPU 占用率高,比如在 file server、database server 等類型的服務(wù)器上,否則(比如>20%)很可能有些部分的內(nèi)核、驅(qū)動模塊有問題;
√ 當(dāng) nice 占用率過高的時候,通常是有意行為,當(dāng)進(jìn)程的發(fā)起者知道某些進(jìn)程占用較高的 CPU,會設(shè)置其 nice 值確保不會淹沒其他進(jìn)程對 CPU 的使用請求;
√ 當(dāng) iowait 占用率過高的時候,通常意味著某些程序的 IO 操作效率很低,或者 IO 對應(yīng)設(shè)備的性能很低以至于讀寫操作需要很長的時間來完成;
√ 當(dāng) irq/softirq 占用率過高的時候,很可能某些外設(shè)出現(xiàn)問題,導(dǎo)致產(chǎn)生大量的irq請求,這時候通過檢查 /proc/interrupts 文件來深究問題所在;
√ 當(dāng) steal 占用率過高的時候,黑心廠商虛擬機(jī)超售了吧!
第四行和第五行是物理內(nèi)存和虛擬內(nèi)存(交換分區(qū))的信息:
total = free + used + buff/cache,現(xiàn)在buffers和cached Mem信息總和到一起了,但是buffers和cached Mem 的關(guān)系很多地方都沒說清楚。其實(shí)通過對比數(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 雖然非常強(qiáng)大,但是通常用于控制臺實(shí)時監(jiān)測系統(tǒng)信息,不適合長時間(幾天、幾個月)監(jiān)測系統(tǒng)的負(fù)載信息,同時對于短命的進(jìn)程也會遺漏無法給出統(tǒng)計信息。