控實(shí)戰(zhàn):從安裝采集到Excel圖表分析瓶頸)
服務(wù)器性能出問(wèn)題的時(shí)候大多數(shù)人第一反應(yīng)是跑一把top看一眼CPU是不是爆了然后就沒(méi)有然后了。真正要定位一個(gè)問(wèn)題光有這幾秒的瞬時(shí)數(shù)據(jù)完全不夠需要的是連續(xù)幾個(gè)小時(shí)的監(jiān)控曲線CPU到底在哪個(gè)時(shí)間點(diǎn)飆升內(nèi)存是逐步被吃光還是突然跳變磁盤(pán)I/O高峰和業(yè)務(wù)高峰是否重疊。nmon這套工具恰恰就是為這種場(chǎng)景設(shè)計(jì)的而且它天生適合離線環(huán)境——單個(gè)可執(zhí)行文件不依賴(lài)重型環(huán)境采集完的數(shù)據(jù)還能直接落成文件帶回本地用Excel分析。這篇文章就完整走一遍在CentOS 7內(nèi)網(wǎng)機(jī)器上離線安裝nmon配置后臺(tái)定時(shí)采集再把nmon數(shù)據(jù)轉(zhuǎn)換成Excel能用的格式最后做成圖表來(lái)定位性能瓶頸?;A(chǔ)判斷先說(shuō)一下這套方案適合誰(shuí)搞運(yùn)維的、做系統(tǒng)交付的、還有在做壓測(cè)和性能調(diào)優(yōu)的開(kāi)發(fā)特別是那些服務(wù)器在隔離內(nèi)網(wǎng)、既不能隨便外聯(lián)也沒(méi)法用軟件源的場(chǎng)景??赐赀@篇文章你至少能解決兩件事一是知道怎么在沒(méi)有網(wǎng)的環(huán)境里把nmon跑起來(lái)二是知道采集到的那些看起來(lái)亂糟糟的文本數(shù)據(jù)怎么變成一張直觀的Excel圖表。1. 方案選型與總體思路1.1 為什么偏偏選 nmon 而不是其它監(jiān)控命令Linux下的性能監(jiān)控命令不少top、vmstat、iostat、sar各個(gè)都能輸出指標(biāo)但它們?cè)陔x線、需要長(zhǎng)期采集的場(chǎng)景里各有各的別扭。top適合臨時(shí)瞄一眼數(shù)據(jù)不落盤(pán)想回放歷史趨勢(shì)基本靠截圖vmstat和iostat能看實(shí)時(shí)信息也可以定時(shí)輸出但是指標(biāo)維度偏單一CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)要湊齊得同時(shí)開(kāi)好幾個(gè)終端還得自己手工對(duì)齊時(shí)間軸sar相對(duì)完整但默認(rèn)依賴(lài)sysstat包離線環(huán)境下裝依賴(lài)本身就是個(gè)麻煩事而且默認(rèn)配置未必覆蓋你要監(jiān)控的維度。nmon不一樣它在設(shè)計(jì)上就很貼合“一個(gè)工具管到底”的思路。安裝包本身是一個(gè)二進(jìn)制文件拷過(guò)去就能執(zhí)行交互模式下按幾個(gè)快捷鍵就能看到CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)、進(jìn)程等十幾類(lèi)信息采集模式下可以后臺(tái)連續(xù)記錄輸出一個(gè)自描述格式的.nmon文件里面把每類(lèi)指標(biāo)按區(qū)塊組織好后續(xù)拿到辦公機(jī)上用表格軟件打開(kāi)或者交給第三方分析器全鏈路都是通的。我實(shí)測(cè)下來(lái)nmon的采集對(duì)系統(tǒng)本身的影響也比較小默認(rèn)2秒一個(gè)采樣點(diǎn)只增加極小的CPU開(kāi)銷(xiāo)在性能問(wèn)題排查的場(chǎng)景下可以接受。我把常見(jiàn)的監(jiān)控工具做了一個(gè)簡(jiǎn)單對(duì)比方便你判斷自己的場(chǎng)景到底選誰(shuí)。工具實(shí)時(shí)查看長(zhǎng)期采集指標(biāo)維度離線部署難度數(shù)據(jù)后續(xù)處理top強(qiáng)弱CPU、內(nèi)存、進(jìn)程為主低差vmstat中中CPU、內(nèi)存、IO低中iostat中中磁盤(pán)IO低中sar中強(qiáng)覆蓋面廣高依賴(lài)sysstat中nmon強(qiáng)強(qiáng)CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)、進(jìn)程等極低強(qiáng)適合Excel如果你的需求是“某一個(gè)時(shí)間窗口內(nèi)發(fā)生了什么、當(dāng)時(shí)各維度資源是啥狀態(tài)”nmon的綜合成本最低。它不僅在采集階段省心在數(shù)據(jù)分析階段也少折騰這一點(diǎn)到后面講Excel處理時(shí)體會(huì)會(huì)更明顯。1.2 離線場(chǎng)景下的完整落地鏈路離線環(huán)境做監(jiān)控最容易卡住的地方不是工具本身而是“怎么把工具弄進(jìn)去”和“怎么把數(shù)據(jù)弄出來(lái)”。內(nèi)網(wǎng)服務(wù)器出于安全考慮通常不開(kāi)放外網(wǎng)訪問(wèn)也沒(méi)有配可用的軟件源鏡像這時(shí)候直接執(zhí)行yum install是不現(xiàn)實(shí)的你需要先在能聯(lián)網(wǎng)的機(jī)器上把安裝包準(zhǔn)備好再通過(guò)運(yùn)維通道傳進(jìn)去。整個(gè)方案的鏈路我分成五步第一步在聯(lián)網(wǎng)主機(jī)上獲取nmon的二進(jìn)制包同時(shí)確認(rèn)它依賴(lài)的動(dòng)態(tài)庫(kù)有哪些第二步把二進(jìn)制包傳到離線服務(wù)器的指定目錄賦予可執(zhí)行權(quán)限并做一次干凈運(yùn)行驗(yàn)證第三步根據(jù)監(jiān)控需求計(jì)算采樣間隔和采樣次數(shù)用nmon的后臺(tái)采集模式輸出數(shù)據(jù)文件第四步把.nmon文件傳回本地辦公機(jī)做格式轉(zhuǎn)換得到Excel可以直接識(shí)別的表格第五步在Excel里繪制趨勢(shì)圖結(jié)合業(yè)務(wù)時(shí)間點(diǎn)分析瓶頸。這里面每一步都有能踩的坑比如64位系統(tǒng)和32位二進(jìn)制不兼容、缺少動(dòng)態(tài)庫(kù)導(dǎo)致執(zhí)行時(shí)報(bào)錯(cuò)、crontab里寫(xiě)相對(duì)路徑導(dǎo)致定時(shí)任務(wù)跑不起來(lái)、采集文件積攢太多把磁盤(pán)寫(xiě)滿(mǎn)等等。文章主體部分我會(huì)把每一個(gè)環(huán)節(jié)的做法和替代方案都講透盡量讓你照著操作一遍就能完整跑通。2. 離線安裝包準(zhǔn)備與安裝驗(yàn)證2.1 在聯(lián)網(wǎng)主機(jī)上準(zhǔn)備安裝包nmon的發(fā)布形式有幾種最常見(jiàn)的是直接提供各個(gè)平臺(tái)編譯好的二進(jìn)制壓縮包里面已經(jīng)包含了多種CPU架構(gòu)和系統(tǒng)版本對(duì)應(yīng)的可執(zhí)行文件另一種是打包成rpm適合通過(guò)包管理工具安裝。離線環(huán)境下我更推薦直接拿二進(jìn)制因?yàn)樗灰蕾?lài)系統(tǒng)的包管理數(shù)據(jù)庫(kù)拷過(guò)去就能當(dāng)綠色工具用rpm方式反而多一步依賴(lài)檢查。在聯(lián)通的臨時(shí)主機(jī)上最簡(jiǎn)單的獲取方式是用yumdownloader把rpm包拉下來(lái)。這個(gè)命令本身來(lái)自yum-utils如果機(jī)器上沒(méi)有可以先裝上然后執(zhí)行下面這段yum install -y yum-utils mkdir -p /tmp/nmon_pkg yumdownloader nmon --resolve --destdir/tmp/nmon_pkg執(zhí)行完以后/tmp/nmon_pkg目錄下會(huì)出現(xiàn)nmon的rpm包以及它依賴(lài)的其它包比如ncurses-libs。--resolve這個(gè)參數(shù)很關(guān)鍵它會(huì)把nmon運(yùn)行所需的動(dòng)態(tài)庫(kù)依賴(lài)一起拉下來(lái)省得你在離線服務(wù)器上裝到一半發(fā)現(xiàn)缺庫(kù)。如果機(jī)器能訪問(wèn)軟件源里的所有擴(kuò)展倉(cāng)庫(kù)也可以直接把整個(gè)依賴(lài)樹(shù)打包。實(shí)際生產(chǎn)環(huán)境中大量服務(wù)器是連軟件源都不通的。這種情況下我的做法是找一臺(tái)和離線服務(wù)器操作系統(tǒng)版本相同、且能聯(lián)機(jī)的跳板機(jī)在跳板機(jī)上執(zhí)行上面的命令然后用scp把rpm包推到內(nèi)網(wǎng)服務(wù)器上。操作系統(tǒng)版本盡量一致因?yàn)椴煌姹緦?duì)glibc和ncurses的版本要求有差異跨大版本容易翻車(chē)。如果你拿到的不是rpm包而是一個(gè)zip格式的壓縮包解壓以后會(huì)看到一堆帶系統(tǒng)后綴的二進(jìn)制文件比如帶_x86_64_centos7后綴的那個(gè)就是CentOS 7 64位對(duì)應(yīng)的版本。選定的文件單獨(dú)抽出來(lái)剩下的一概不管。2.2 上傳、安裝與快速驗(yàn)證先把準(zhǔn)備好的二進(jìn)制文件傳到目標(biāo)服務(wù)器。內(nèi)網(wǎng)環(huán)境常見(jiàn)的通道是堡壘機(jī)加跳板或者直接通過(guò)運(yùn)維網(wǎng)絡(luò)傳文件。上傳完成后放到一個(gè)約定好的目錄比如/opt/nmon方便統(tǒng)一管理。如果是rpm形式安裝命令很簡(jiǎn)單rpm -ivh /tmp/nmon_pkg/nmon*.rpmrpm裝完以后可執(zhí)行文件一般會(huì)放到/usr/bin/nmon下面直接用nmon命令就能啟動(dòng)。如果是綠色二進(jìn)制方式需要手動(dòng)賦予執(zhí)行權(quán)限chmod x /opt/nmon/nmon_x86_64_centos7 ln -s /opt/nmon/nmon_x86_64_centos7 /usr/bin/nmon做完軟鏈接以后nmon命令在任何目錄下都能直接調(diào)用后面寫(xiě)crontab也就省心。下一步做驗(yàn)證直接在終端敲nmon如果屏幕上出現(xiàn)了從上到下的實(shí)時(shí)數(shù)據(jù)面板說(shuō)明二進(jìn)制能跑動(dòng)態(tài)庫(kù)也都齊了。提示如果執(zhí)行時(shí)提示找不到共享庫(kù)文件最常見(jiàn)的原因是ncurses庫(kù)缺失或版本不對(duì)。CentOS 7離線環(huán)境里可以先嘗試rpm -qa | grep ncurses看看已安裝的版本正常情況下系統(tǒng)自帶的ncurses-libs就能滿(mǎn)足要求只有那種被極度裁剪過(guò)的基礎(chǔ)鏡像才需要手動(dòng)補(bǔ)裝。驗(yàn)證結(jié)束時(shí)按q退出交互界面就能回到命令行。到這里離線安裝環(huán)節(jié)就算收尾了后面要做的所有采集和分析都建立在這個(gè)能正常運(yùn)行的二進(jìn)制之上。3. nmon 數(shù)據(jù)采集實(shí)操3.1 交互模式快速查看系統(tǒng)狀態(tài)啟動(dòng)nmon之后它是一個(gè)全屏交互界面底層按鍵控制顯示哪些數(shù)據(jù)。剛進(jìn)去默認(rèn)只顯示基礎(chǔ)信息這時(shí)候可以按下面的常用鍵來(lái)切換視圖按c顯示CPU的每核心使用率以及整體匯總按m顯示物理內(nèi)存和交換分區(qū)的使用情況按d顯示磁盤(pán)組的讀寫(xiě)速率和繁忙度按n顯示各網(wǎng)卡的收發(fā)包和速率按t顯示系統(tǒng)最耗CPU的進(jìn)程列表按V顯示虛擬內(nèi)存相關(guān)統(tǒng)計(jì)。交互模式適合在線排查比如接到報(bào)警說(shuō)某臺(tái)機(jī)器CPU滿(mǎn)載登上去敲nmon按c和t一秒鐘之內(nèi)就能看到是哪個(gè)進(jìn)程在吃CPU非常直接。不過(guò)它有一個(gè)局限一旦退出nmon數(shù)據(jù)就全沒(méi)了沒(méi)法回溯之前十分鐘發(fā)生了什么。所以但凡要做周期性觀測(cè)或者事后分析就必須切換到后臺(tái)采集模式。真正到性能分析的時(shí)候我習(xí)慣的流程是先在交互模式下快速看一眼當(dāng)前狀態(tài)然后立刻啟動(dòng)后臺(tái)采集讓它連續(xù)記錄一段時(shí)間這樣既有現(xiàn)場(chǎng)快照又有完整曲線兩邊信息互相印證。3.2 后臺(tái)采集模式的參數(shù)設(shè)計(jì)與原理解讀nmon的后臺(tái)采集模式核心就一句話定期把各項(xiàng)指標(biāo)追加寫(xiě)入文件跑夠指定次數(shù)后自動(dòng)退出。命令格式如下nmon -f -s 5 -c 720 -m /var/log/nmon這里-f表示后臺(tái)寫(xiě)文件模式輸出文件會(huì)自動(dòng)按主機(jī)名和時(shí)間戳命名比如xxx_220601_1530.nmon-s 5表示每5秒采集一次-c 720表示總共采集720次-m指定輸出目錄。5秒乘以720次正好是3600秒也就是一小時(shí)。如果你想要不同的采集時(shí)長(zhǎng)記住這個(gè)公式采集間隔秒數(shù)乘以采集次數(shù)等于總時(shí)長(zhǎng)秒數(shù)。參數(shù)選型沒(méi)有絕對(duì)標(biāo)準(zhǔn)主要看你的分析粒度。如果是排查偶發(fā)性問(wèn)題間隔定為10秒或30秒就夠了太密的采樣點(diǎn)除了讓文件變大、分析時(shí)圖表?yè)頂D并沒(méi)有額外價(jià)值如果是壓測(cè)現(xiàn)場(chǎng)需要看秒級(jí)抖動(dòng)那就用2到5秒的間隔。內(nèi)存和磁盤(pán)這類(lèi)指標(biāo)變化相對(duì)平滑不需要過(guò)密采樣而CPU占比突發(fā)性很強(qiáng)想抓住瞬態(tài)峰值就最好用5秒以?xún)?nèi)的間隔。實(shí)際使用中nmon采集進(jìn)程會(huì)常駐在前臺(tái)即使-f也不能真正后臺(tái)化。如果你希望它完全脫離終端運(yùn)行可以在命令前加nohup讓它轉(zhuǎn)向后臺(tái)執(zhí)行?,F(xiàn)在的系統(tǒng)服務(wù)里很多人會(huì)把它做成systemd服務(wù)來(lái)托管但離線二進(jìn)制配合nohup已經(jīng)足夠應(yīng)付大多數(shù)臨時(shí)采集需求不需要把復(fù)雜度提得太高。采集文件的大小也和采樣頻率成正比。按5秒間隔采集一天文件大概在幾十MB上下按1秒間隔會(huì)大得多。對(duì)長(zhǎng)期監(jiān)控來(lái)說(shuō)我的建議是先算一下磁盤(pán)余量再把輸出目錄掛到有獨(dú)立空間的分區(qū)避免把根目錄撐爆。3.3 定時(shí)采集與文件管理策略很多場(chǎng)景下監(jiān)控不是一次性任務(wù)而是一天24小時(shí)、連續(xù)一周甚至更久的例行工作。比如你想觀察業(yè)務(wù)高峰期的資源變化提前預(yù)判擴(kuò)容時(shí)機(jī)就需要每天固定時(shí)段采集。這時(shí)候crontab是比手工執(zhí)行更靠譜的選擇。在crontab里加一行比如每天早8點(diǎn)開(kāi)始采集8小時(shí)每10秒一個(gè)采樣點(diǎn)0 8 * * * /usr/bin/nmon -f -s 10 -c 2880 -m /var/log/nmon /dev/null 2110秒乘以2880次就是28800秒正好8小時(shí)。注意crontab里的執(zhí)行命令最好寫(xiě)絕對(duì)路徑包括nmon路徑和輸出目錄路徑否則容易出現(xiàn)任務(wù)執(zhí)行了但文件不知道寫(xiě)到哪去的情況這類(lèi)問(wèn)題一會(huì)兒到常見(jiàn)問(wèn)題部分細(xì)說(shuō)。長(zhǎng)期跑下來(lái)/var/log/nmon目錄會(huì)積累大量文件。我建議寫(xiě)一個(gè)簡(jiǎn)單的清理腳本配合crontab執(zhí)行比如只保留最近30天的.nmon文件。腳本不復(fù)雜核心就是把超過(guò)保留天數(shù)的文件刪掉find /var/log/nmon -name *.nmon -mtime 30 -delete運(yùn)維實(shí)踐里還有一個(gè)很多人忽略的點(diǎn)監(jiān)控文件本身也要有統(tǒng)一的命名和歸檔習(xí)慣。nmon默認(rèn)按主機(jī)名和時(shí)間命名如果你的服務(wù)器命名混亂建議在采集腳本里對(duì)生成文件做一次重命名加上環(huán)境和業(yè)務(wù)標(biāo)簽比如帶上應(yīng)用名縮寫(xiě)和內(nèi)網(wǎng)IP的最后一段這樣后續(xù)從幾十臺(tái)機(jī)器收集來(lái)的數(shù)據(jù)放到一起時(shí)一眼就能分辨出是哪臺(tái)機(jī)器哪天的采集結(jié)果。4. nmon 數(shù)據(jù)解析與 Excel 化處理4.1 nmon 文件格式到底長(zhǎng)什么樣拿到.nmon文件以后直接用文本編輯器打開(kāi)你會(huì)發(fā)現(xiàn)它不是二進(jìn)制亂碼而是結(jié)構(gòu)化的文本里面每一行以AAA開(kāi)頭后面跟著指標(biāo)區(qū)塊名和數(shù)據(jù)。這種設(shè)計(jì)的精妙之處在于它把不同類(lèi)型的數(shù)據(jù)用區(qū)塊隔離開(kāi)解析的時(shí)候只要按區(qū)塊名取值就行后續(xù)無(wú)論是寫(xiě)腳本轉(zhuǎn)換還是交給現(xiàn)成工具成本都很低。舉個(gè)最典型的結(jié)構(gòu)AAA,procx,Linux,221201,1530,09,3.10.0-957.el7.x86_64 AAA,CPU001,12,6,80,2 AAA,CPU_ALL,5,3,90,2 AAA,MEM,MemoryMB,2048000,2048000,0,0,0,0,1274374,... AAA,NET,eth0,0,0,0,0,0,0,0,0,... AAA,DISKBUSY,sda,12.5第一行是元數(shù)據(jù)包含主機(jī)名、系統(tǒng)版本、采集起始時(shí)間和內(nèi)核版本CPU_ALL后面的數(shù)字分別是用戶(hù)態(tài)占比、系統(tǒng)態(tài)占比、空閑占比等MEM后面是各種內(nèi)存總量、可用量NET后面跟著收發(fā)包字節(jié)數(shù)DISKBUSY那類(lèi)行則是磁盤(pán)繁忙度。字段順序在不同版本的nmon里會(huì)有細(xì)微差異所以做轉(zhuǎn)換腳本的時(shí)候不能硬編碼列序號(hào)我后面給出的腳本會(huì)更穩(wěn)健地按區(qū)塊處理。用Excel直接打開(kāi)這個(gè)文件不是不行但體驗(yàn)很差因?yàn)槲谋纠锎罅吭畔⑿小⒉煌笜?biāo)的列寬不齊而且時(shí)間戳格式對(duì)Excel不友好做圖表時(shí)軸上的時(shí)間點(diǎn)會(huì)對(duì)不齊。所以中間必須經(jīng)過(guò)一個(gè)轉(zhuǎn)換環(huán)節(jié)。4.2 用腳本把 nmon 轉(zhuǎn)成規(guī)整的 CSV轉(zhuǎn)換的思路并不復(fù)雜讀原始文件按行區(qū)分區(qū)塊把每個(gè)區(qū)塊內(nèi)相同指標(biāo)的行攢起來(lái)最后輸出成若干列。為了實(shí)用性重點(diǎn)提取CPU_ALL、MEM、DISKBUSY、NET這幾個(gè)最常見(jiàn)區(qū)塊就夠了其它細(xì)節(jié)指標(biāo)可以按需擴(kuò)展。下面這個(gè)腳本是我在實(shí)際項(xiàng)目中用過(guò)的簡(jiǎn)化版用Python3編寫(xiě)核心邏輯做了幾處穩(wěn)健性處理比如不管區(qū)塊行首是否有空格都先strip把各種字段保留為文本防止Excel把前導(dǎo)零吞掉。import csv import sys def parse_nmon(path): # 收集各區(qū)塊的全部行 blocks {} with open(path, r, encodingutf-8, errorsignore) as f: for line in f: line line.strip() if line.startswith(AAA): parts line.split(,) tag parts[1] blocks.setdefault(tag, []).append(parts) return blocks def convert(input_path, output_path): blocks parse_nmon(input_path) # 只處理關(guān)心的幾個(gè)核心區(qū)塊 wanted (CPU_ALL, MEM, DISKBUSY, NET) selected {tag: blocks[tag] for tag in wanted if tag in blocks} times [] col_data {} for tag, rows in selected.items(): for parts in rows: if len(parts) 5: continue ts parts[2] times.append(ts) col_data.setdefault(tag, []).append(parts[3:]) # 按時(shí)間點(diǎn)對(duì)齊輸出 with open(output_path, w, newline) as f: w csv.writer(f) header [time] for tag in selected: sample_len len(col_data[tag][0]) if col_data[tag] else 0 header.extend([{}_{}.format(tag, idx) for idx in range(sample_len)]) w.writerow(header) row_count len(times) for i in range(row_count): row [times[i]] for tag in selected: if i len(col_data[tag]): row.extend(col_data[tag][i]) w.writerow(row) if __name__ __main__: source sys.argv[1] target source.replace(.nmon, .csv) convert(source, target)運(yùn)行方式也很簡(jiǎn)單python3 nmon2csv.py server_221201_1530.nmon運(yùn)行完以后Excel打開(kāi)這個(gè)CSV就能看到規(guī)整的表第一列是時(shí)間后面每一列對(duì)應(yīng)一個(gè)采集指標(biāo)。如果覺(jué)得指標(biāo)列還是太雜可以在腳本里把需要的列單獨(dú)挑出來(lái)只留CPU用戶(hù)態(tài)、系統(tǒng)態(tài)、空閑率、內(nèi)存總量、可用量、磁盤(pán)總線忙綠比這些核心指標(biāo)。注意如果.nmon文件是從Windows環(huán)境傳輸過(guò)來(lái)的文本行尾可能帶了\r回車(chē)符打開(kāi)前最好用dos2unix轉(zhuǎn)換成LF否則CSV的表格會(huì)被弄出多余空行。站點(diǎn)上還有一些現(xiàn)成的第三方Excel分析宏原理上就是替你做了解析和制圖導(dǎo)出的圖表更豐富。但我個(gè)人體驗(yàn)是自己手握一個(gè)轉(zhuǎn)換腳本更靈活起碼可以按自己的口徑去定義指標(biāo)也不會(huì)被宏的安全設(shè)置卡住。5. Excel 圖表制作與性能瓶頸分析5.1 核心指標(biāo)怎么選才不會(huì)看花眼一個(gè).nmon文件轉(zhuǎn)換出來(lái)指標(biāo)列可能有幾十列如果全部丟進(jìn)Excel做折線圖結(jié)果就是一坨毛線什么也解讀不出來(lái)。實(shí)際分析時(shí)我的習(xí)慣是先明確問(wèn)題域再挑重點(diǎn)維度通常從四個(gè)方向入手。CPU維度只看兩個(gè)指標(biāo)CPU_ALL里的用戶(hù)態(tài)占比和系統(tǒng)態(tài)占比。用戶(hù)態(tài)高說(shuō)明應(yīng)用或者計(jì)算任務(wù)吃CPU系統(tǒng)態(tài)高往往意味著系統(tǒng)調(diào)用頻繁、鎖競(jìng)爭(zhēng)或者內(nèi)核態(tài)模塊在消耗資源兩類(lèi)原因?qū)?yīng)的排查方向完全不同。內(nèi)存維度優(yōu)先看可用內(nèi)存的絕對(duì)值以及swap的讀寫(xiě)量這兩個(gè)指標(biāo)能反映內(nèi)存是否真的吃緊。磁盤(pán)維度看DISKBUSY的百分比配合CPU的等待占比能夠區(qū)分磁盤(pán)I/O瓶頸和純CPU計(jì)算瓶頸。網(wǎng)絡(luò)維度看收發(fā)包速率和錯(cuò)誤包數(shù)量判斷是否存在流量異常。選指標(biāo)時(shí)還有一個(gè)容易被忽略的地方字段單位。內(nèi)存的原始值在nmon里是MB網(wǎng)絡(luò)速率可能是KB/s如果混在一張圖里數(shù)量級(jí)差著上千倍小塊數(shù)據(jù)會(huì)被大塊數(shù)據(jù)直接壓成一條直線。遇到這種情況要么分開(kāi)成兩張圖要么用Excel的次坐標(biāo)軸讓兩條曲線各用各的刻度。5.2 Excel 折線圖制作與坐標(biāo)軸對(duì)齊技巧轉(zhuǎn)換出來(lái)的CSV文件用Excel打開(kāi)后做圖表的步驟并不復(fù)雜。先選中時(shí)間列和你想看的指標(biāo)列插入折線圖然后調(diào)整X軸格式。這里有一個(gè)實(shí)戰(zhàn)小技巧如果時(shí)間列是1530這種HHMMSS文本格式不要直接當(dāng)坐標(biāo)軸用先把它轉(zhuǎn)成常規(guī)時(shí)間格式否則圖表橫軸要么出現(xiàn)1800這種超大的數(shù)要么被錯(cuò)誤當(dāng)作文本排序。最簡(jiǎn)單的處理方式是在CSV轉(zhuǎn)換腳本里就把時(shí)間格式化成Excel認(rèn)識(shí)的HH:MM:SS字符串再在Excel里把該列設(shè)置為時(shí)間格式。插入圖表時(shí)橫軸選擇該列生成的折線就會(huì)按采集時(shí)間均勻鋪開(kāi)。如果中間有斷點(diǎn)檢查原始.nmon文件里是不是某一次采集沒(méi)寫(xiě)進(jìn)去這種斷點(diǎn)往往對(duì)應(yīng)操作系統(tǒng)負(fù)載過(guò)高導(dǎo)致nmon進(jìn)程短暫卡死。多指標(biāo)對(duì)比時(shí)建議先做一張“總覽圖”把CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)的關(guān)鍵指標(biāo)都放上去用次坐標(biāo)軸區(qū)分量級(jí)發(fā)現(xiàn)哪個(gè)維度有異常趨勢(shì)再單獨(dú)抽出來(lái)做局部放大。分析長(zhǎng)期數(shù)據(jù)的時(shí)候可以用數(shù)據(jù)透視表把小時(shí)數(shù)據(jù)聚合觀察是否存在每天固定時(shí)間重復(fù)出現(xiàn)的高峰這比盯著原始秒級(jí)數(shù)據(jù)看更抓重點(diǎn)。5.3 從一個(gè)異常曲線反推瓶頸的分析方法有一次我處理過(guò)一個(gè)典型場(chǎng)景某個(gè)業(yè)務(wù)系統(tǒng)每天下午兩點(diǎn)左右響應(yīng)變慢應(yīng)用日志里沒(méi)有明顯報(bào)錯(cuò)但用戶(hù)端感覺(jué)明顯延遲。運(yùn)維同事在服務(wù)器上臨時(shí)起了nmon采集頻率30秒一次連續(xù)跑了三天。把Excel圖表拉出來(lái)以后每天下午兩點(diǎn)這條時(shí)間軸附近CPU的用戶(hù)態(tài)占比并不高但等待占比從5%一下跳到40%以上對(duì)應(yīng)的磁盤(pán)繁忙度也同步?jīng)_高到90%左右。這個(gè)匹配關(guān)系說(shuō)明瓶頸不在CPU計(jì)算而在磁盤(pán)I/O。再往下深挖發(fā)現(xiàn)那個(gè)時(shí)間點(diǎn)正好是定時(shí)數(shù)據(jù)備份任務(wù)啟動(dòng)的窗口備份任務(wù)對(duì)大目錄做全量掃描并寫(xiě)盤(pán)把I/O帶寬基本吃滿(mǎn)。后來(lái)把備份任務(wù)挪到業(yè)務(wù)低峰期響應(yīng)時(shí)間的報(bào)警就消失了。這個(gè)過(guò)程里Excel圖表的作用就是把三個(gè)獨(dú)立的指標(biāo)按照同一時(shí)間軸擺在一起讓相關(guān)性一目了然。如果只看實(shí)時(shí)top或者分段日志很難把磁盤(pán)繁忙和系統(tǒng)卡頓這兩件事關(guān)聯(lián)起來(lái)。所以做分析的時(shí)候不要只畫(huà)一張孤立的指標(biāo)曲線而是盡量把CPU等待、磁盤(pán)IO、網(wǎng)絡(luò)速率放在同一個(gè)時(shí)間窗口里對(duì)照這樣才更容易找出真正的因果鏈。6. 常見(jiàn)問(wèn)題與避坑指南6.1 現(xiàn)場(chǎng)高頻問(wèn)題速查表離線環(huán)境安裝和后續(xù)采集踩坑的密集程度遠(yuǎn)比想象中高。下面這張表匯總了我見(jiàn)過(guò)的大多數(shù)問(wèn)題每一行都對(duì)應(yīng)一個(gè)真實(shí)發(fā)生過(guò)的場(chǎng)景?,F(xiàn)象常見(jiàn)原因解決辦法執(zhí)行nmon提示Permission denied二進(jìn)制文件沒(méi)有可執(zhí)行權(quán)限chmod x 對(duì)應(yīng)二進(jìn)制提示error while loading shared libraries: libncurses.so.5ncurses動(dòng)態(tài)庫(kù)缺失或版本不匹配檢查ncurses-libs是否已安裝rpm -q ncurses-libs界面能打開(kāi)但數(shù)字不刷新終端類(lèi)型不對(duì)部分SSH客戶(hù)端對(duì)全屏刷新支持差換用標(biāo)準(zhǔn)終端或xterm重新連接后啟動(dòng)nmon找不到輸出文件crontab看起來(lái)沒(méi)執(zhí)行cron環(huán)境變量PATH里沒(méi)有nmon路徑crontab中寫(xiě)完整路徑 /usr/bin/nmon采集文件內(nèi)容正常但Excel打開(kāi)亂序文本行尾回車(chē)符來(lái)自Windows批量傳輸用dos2unix處理后再轉(zhuǎn)換或改傳輸模式為binarynmon運(yùn)行報(bào)date相關(guān)的錯(cuò)誤服務(wù)器系統(tǒng)時(shí)間異?;驎r(shí)間同步服務(wù)未工作先校準(zhǔn)系統(tǒng)時(shí)間再重啟nmon采集采集文件越積越大磁盤(pán)空間告急沒(méi)有配置清理策略用find按mtime定期清理并評(píng)估采集頻率兩個(gè)不同平臺(tái)的二進(jìn)制傳錯(cuò)下載包里面對(duì)應(yīng)的是另一個(gè)架構(gòu)的版本確認(rèn)uname -m結(jié)果選擇匹配的二進(jìn)制這張表里最容易被忽略的是crontab路徑問(wèn)題。crontab啟動(dòng)時(shí)加載的PATH很精簡(jiǎn)并不包含/opt/nmon這類(lèi)自定義目錄。之前有人把nmon放在/opt/nmon下crontab里只寫(xiě)了nmon -f -s 30 -c 120任務(wù)確實(shí)在跑但系統(tǒng)找不到命令文件一個(gè)都沒(méi)有生成。改成寫(xiě)全絕對(duì)路徑以后問(wèn)題立刻解決。6.2 長(zhǎng)期監(jiān)控的幾條實(shí)操心得在做長(zhǎng)期nmon監(jiān)控的時(shí)候我總結(jié)了幾條經(jīng)驗(yàn)未必在官方文檔里看得到但實(shí)際幫過(guò)我不少忙。第一條正式部署前先做短周期小批量驗(yàn)證。不管你計(jì)劃用30秒還是5秒的采樣間隔先跑個(gè)兩分鐘的測(cè)試采集確認(rèn)文件能正常生成再用Excel打開(kāi)確認(rèn)格式對(duì)最后才掛到crontab里長(zhǎng)期跑。每次調(diào)整參數(shù)都這樣來(lái)一遍能省掉大量來(lái)回排查的時(shí)間。第二條命名規(guī)范要提前定好。nmon默認(rèn)的文件名帶主機(jī)名但如果你的服務(wù)器命名沒(méi)有業(yè)務(wù)含義數(shù)據(jù)混在一起根本分不清。我的做法是把采集腳本里加上環(huán)境名前綴比如在腳本里執(zhí)行一次重命名把文件統(tǒng)一整理為app_web01_20220601.nmon這種格式這樣后續(xù)歸檔和檢索都高效。第三條采集目錄要和系統(tǒng)根目錄分離。長(zhǎng)期監(jiān)控必然產(chǎn)生文件如果/var/log所在分區(qū)本來(lái)就緊張監(jiān)控?cái)?shù)據(jù)會(huì)在不知不覺(jué)中把磁盤(pán)吃出一塊隱患。把采集目錄掛到獨(dú)立分區(qū)或者至少給/var/log單獨(dú)留足空間這是成本極低但收益明顯的一條。第四條數(shù)據(jù)傳回本地時(shí)盡量壓縮傳輸。一個(gè)高頻率采集的nmon文件可能幾十MB如果每天都要從幾十臺(tái)服務(wù)器拉回來(lái)帶寬開(kāi)銷(xiāo)不小。先gzip或使用壓縮工具壓一遍再傳能減少大半體積本地解壓后再分析流程完全不受影響。最后再說(shuō)點(diǎn)實(shí)在的按上面這套流程走下來(lái)從離線安裝到Excel圖表分析工具鏈其實(shí)非常輕一個(gè)可執(zhí)行文件、一個(gè)轉(zhuǎn)換腳本、一個(gè)Excel模板就構(gòu)成了一條完整的性能排查流水線。我個(gè)人在使用中的一個(gè)體會(huì)是nmon的價(jià)值不止在于“能看到實(shí)時(shí)狀態(tài)”更在于“采集成本足夠低、數(shù)據(jù)形態(tài)足夠開(kāi)放”讓后續(xù)分析有充分的自由度。你完全可以先把這套流程跑通再根據(jù)自己服務(wù)器的實(shí)際情況去定義指標(biāo)口徑和制圖模板時(shí)間長(zhǎng)了甚至可以沉淀出一套適合自己團(tuán)隊(duì)的性能分析套路。真到了線上出故障、需要快速翻歷史曲線的時(shí)候你會(huì)發(fā)現(xiàn)提前布置nmon絕對(duì)是一件高性?xún)r(jià)比的事。