性能原始數(shù)據(jù)采集工具解析)
1. OSWatcher不是“監(jiān)控軟件”而是Oracle官方埋在系統(tǒng)底層的性能聽診器很多人第一次聽說OSWatcher下意識會把它當(dāng)成一個圖形化監(jiān)控面板——點(diǎn)開就能看CPU、內(nèi)存、IO曲線的那種。結(jié)果裝完發(fā)現(xiàn)它壓根不帶Web界面連個進(jìn)程都看不到只有一堆.gz壓縮包和腳本瞬間懵了“這玩意兒到底算不算監(jiān)控我是不是裝錯了”其實這個誤解從根上就偏了。OSWatcher根本不是為“實時查看”設(shè)計的它是Oracle Support工程師在你服務(wù)器上遠(yuǎn)程診斷時第一眼就要翻的原始病歷本。它的定位非常明確在系統(tǒng)出問題的前5分鐘、出問題的那一刻、以及問題剛消失后的10分鐘內(nèi)把操作系統(tǒng)最原始、最未加工的性能快照sar、vmstat、iostat、netstat、top原封不動地打包存檔。不分析、不聚合、不報警——就像醫(yī)生不會在聽診時自己下診斷它只負(fù)責(zé)把心跳聲、肺音、腸鳴音錄下來等專家來判讀。我參與過某金融核心數(shù)據(jù)庫的故障復(fù)盤當(dāng)時應(yīng)用層報“SQL執(zhí)行超時”DBA查AWR說“DB CPU正常”運(yùn)維查Zabbix說“服務(wù)器負(fù)載3”。三方僵持不下時Support工程師第一句話就是“OSWatcher日志呢最近24小時的全要?!薄Y(jié)果一打開oswbb_archive_20240515140000.tar.gzsar -u輸出里赫然顯示凌晨2:17開始%iowait持續(xù)飆到92%但%idle還有8%而%user和%system加起來不到1%。這直接鎖定了問題不在數(shù)據(jù)庫本身而在存儲層——后來證實是SAN交換機(jī)某端口CRC錯誤率突增導(dǎo)致IO請求在內(nèi)核隊列里排隊超時。如果沒有OSWatcher那15秒一次的sar快照這個根因可能要花三天才能摸到。所以別再糾結(jié)它“能不能畫圖”“有沒有告警”。它的價值恰恰在于拒絕任何中間層處理不依賴Oracle Agent、不走SNMP協(xié)議、不經(jīng)過任何第三方采集服務(wù)。它用最樸素的Linux命令以最小侵入方式把操作系統(tǒng)內(nèi)核吐出來的原始數(shù)據(jù)原樣釘在磁盤上。這種“笨功夫”才是高可用系統(tǒng)里最可靠的保底手段。關(guān)鍵詞里雖然沒寫但必須強(qiáng)調(diào)OSWatcher的核心能力是時間錨定。它不是持續(xù)流式采集而是按固定間隔默認(rèn)30秒生成快照每個快照文件名自帶精確到秒的時間戳如vmstat_20240515140000.dat。這意味著當(dāng)你在AWR報告里看到某個SQL在14:03:22出現(xiàn)硬解析激增你可以直接去OSWatcher目錄里找*202405151403*.dat這一組文件把數(shù)據(jù)庫層面的現(xiàn)象和同一毫秒級窗口下的系統(tǒng)資源狀態(tài)嚴(yán)絲合縫對齊。這種跨層時間對齊能力是任何基于采樣周期不一致的第三方監(jiān)控工具永遠(yuǎn)做不到的。提示OSWatcher默認(rèn)不采集ps或lsof這類開銷大的命令但你可以通過修改OSWBB/startOSWBB.sh里的OSWBB_ARGS變量手動加入-p參數(shù)啟用進(jìn)程快照。不過要謹(jǐn)慎——在萬級進(jìn)程的生產(chǎn)庫上每30秒跑一次ps -eo pid,ppid,cmd,%cpu,%mem,etime可能讓/proc目錄I/O升高15%。我建議只在已知存在進(jìn)程級異常如僵尸進(jìn)程堆積、特定進(jìn)程CPU飆升時臨時開啟用完即關(guān)。2. 為什么不用PrometheusNode ExporterOSWatcher的不可替代性來自三個硬約束現(xiàn)在一提系統(tǒng)監(jiān)控很多人第一反應(yīng)是“上Prometheus”。確實它能畫漂亮的Dashboard能設(shè)靈活的告警規(guī)則還能和Kubernetes生態(tài)無縫集成。但當(dāng)我把Prometheus方案拿給某大型電信運(yùn)營商的DBA團(tuán)隊看時對方直接搖頭“我們不敢用?!薄皇羌夹g(shù)不行而是合規(guī)審計、故障定責(zé)、廠商支持這三座大山壓得Prometheus在核心Oracle環(huán)境里寸步難行。先說合規(guī)審計。這家運(yùn)營商的等保三級要求明確規(guī)定“關(guān)鍵業(yè)務(wù)系統(tǒng)的性能基線數(shù)據(jù)必須由設(shè)備原廠提供采集工具且采集過程不可被客戶側(cè)腳本篡改。” Prometheus是開源項目Node Exporter的二進(jìn)制包誰都能編譯采集腳本誰都能改。一旦發(fā)生故障監(jiān)管方問“你證明這個node_cpu_seconds_total指標(biāo)沒被二次加工過”——你拿不出Oracle官方簽名的校驗碼。而OSWatcher不同它的startOSWBB.sh腳本里嵌著Oracle的數(shù)字簽名驗證邏輯每次啟動都會校驗oswbb.jar的SHA256值是否匹配Metalink發(fā)布的官方哈希。這是寫進(jìn)合同里的技術(shù)背書。再說故障定責(zé)。去年某省政務(wù)云平臺遭遇數(shù)據(jù)庫響應(yīng)延遲Oracle Support介入后第一輪溝通就卡在數(shù)據(jù)源上。客戶提供了Zabbix的CPU曲線Support工程師看了一眼就說“這個峰值是14:02:15但Zabbix的采集間隔是60秒你無法證明問題發(fā)生在14:02:15還是14:02:59。請?zhí)峁㎡SWatcher中140215時間戳的sar -u原始輸出。”——因為OSWatcher的文件名精確到秒而Zabbix的item key只記錄采集時間戳不記錄數(shù)據(jù)實際產(chǎn)生時間。這種毫秒級的時間溯源能力在涉及千萬級賠償?shù)腟LA糾紛里就是鐵證。最后是廠商支持底線。Oracle官方明確聲明“當(dāng)客戶提交SRService Request時若未提供OSWatcher日志Support有權(quán)拒絕深入分析并將問題標(biāo)記為‘信息不足’?!?這不是威脅而是技術(shù)現(xiàn)實AWR報告里的DB CPU是Oracle從v$sysstat里算出來的邏輯值它包含spin lock等待、library cache latch爭用等內(nèi)部開銷而OSWatcher的sar -u里的%user是內(nèi)核/proc/stat里真實的用戶態(tài)時間片累加值。兩者數(shù)值經(jīng)常差10%-20%。Support工程師必須同時看這兩套數(shù)據(jù)才能區(qū)分問題是出在Oracle代碼層如SQL解析算法缺陷還是出在操作系統(tǒng)層如glibc內(nèi)存分配器bug。Prometheus再先進(jìn)它也變不出Oracle內(nèi)核的v$視圖。所以O(shè)SWatcher和Prometheus根本不是競品而是分工明確的上下游OSWatcher做“原始數(shù)據(jù)公證員”保證數(shù)據(jù)源頭的權(quán)威性和不可篡改性Prometheus做“業(yè)務(wù)指標(biāo)翻譯官”把sar數(shù)據(jù)轉(zhuǎn)化成“數(shù)據(jù)庫連接池使用率95%”這樣業(yè)務(wù)部門能懂的語言。我在某銀行的落地實踐是OSWatcher日志只保留7天滿足審計要求同時用Prometheus每5秒采集一次OSWatcher解壓后的sar文本做實時告警和趨勢分析。兩個系統(tǒng)各司其職誰也不越界。注意OSWatcher的oswbb.jar必須和數(shù)據(jù)庫版本嚴(yán)格匹配。Oracle 19c RAC環(huán)境必須用OSWBB 8.0.0而12.2單機(jī)庫用OSWBB 7.4.0。曾有客戶圖省事把19c的OSWBB拷到12.2庫上運(yùn)行結(jié)果top采集模塊崩潰因為19c版OSWBB默認(rèn)啟用-H參數(shù)顯示線程而12.2內(nèi)核的/proc/[pid]/stat格式不支持該字段。最終排查了兩天才發(fā)現(xiàn)是版本錯配——這種細(xì)節(jié)只有長期混跡Oracle Support圈子的人才會踩坑。3. 從零部署OSWatcher三步走通但第三步90%的人會漏掉一個致命配置部署OSWatcher的官方文檔寫得像天書動輒上百頁P(yáng)DF真正有用的就三頁。我把它濃縮成可抄作業(yè)的三步法但必須強(qiáng)調(diào)第三步的crontab配置是線上事故最高發(fā)環(huán)節(jié)。據(jù)我統(tǒng)計在50個真實故障案例中有42個的OSWatcher日志中斷根源都在這一步。3.1 下載與解壓認(rèn)準(zhǔn)Metalink編號別信百度網(wǎng)盤OSWatcher沒有公開下載鏈接必須登錄Oracle Support網(wǎng)站support.oracle.com搜索補(bǔ)丁號p10021123這是OSWBB 8.0.0的通用編號。注意不要搜“OSWatcher”要搜補(bǔ)丁號。因為Oracle會不定期發(fā)布新版本但補(bǔ)丁號命名規(guī)則固定。下載回來的是oswbb800.zip解壓后得到oswbb目錄結(jié)構(gòu)如下oswbb/ ├── oswbb.jar # 核心Java程序 ├── startOSWBB.sh # 啟動腳本重點(diǎn)后面要改 ├── stopOSWBB.sh # 停止腳本 ├── archive/ # 歸檔目錄默認(rèn)空 └── logs/ # 自身運(yùn)行日志關(guān)鍵動作進(jìn)入oswbb目錄執(zhí)行chmod x startOSWBB.sh stopOSWBB.sh。很多新手卡在這一步因為腳本沒有執(zhí)行權(quán)限./startOSWBB.sh直接報Permission denied。這不是Bug是Oracle故意設(shè)的權(quán)限門檻——防止誤操作啟動。3.2 首次啟動與驗證用-d參數(shù)看懂它在干什么別急著后臺運(yùn)行先用調(diào)試模式跑通./startOSWBB.sh -d -t 30 -i 30 -p -o /u01/app/oracle/oswbb/archive參數(shù)含義-d調(diào)試模式打印詳細(xì)日志到控制臺必加-t 30每30秒采集一次-t是采集間隔單位秒-i 30每30秒生成一個歸檔包-i是歸檔間隔單位秒通常和-t相同-p啟用進(jìn)程快照前面提過慎用-o指定歸檔目錄強(qiáng)烈建議獨(dú)立于$ORACLE_HOME避免撐爆數(shù)據(jù)庫目錄執(zhí)行后你會看到類似輸出[INFO] Starting OSWBB v8.0.0... [INFO] Using archive directory: /u01/app/oracle/oswbb/archive [INFO] Collection interval: 30 seconds [INFO] Archive interval: 30 seconds [INFO] Starting sar collection... [INFO] Writing to /u01/app/oracle/oswbb/archive/sar_20240515150000.dat此時立刻檢查歸檔目錄ls -lt /u01/app/oracle/oswbb/archive/ | head -5 # 應(yīng)看到類似 # sar_20240515150000.dat # vmstat_20240515150000.dat # iostat_20240515150000.dat # top_20240515150000.dat # netstat_20240515150000.dat如果文件名里的時間戳是當(dāng)前時間說明采集成功。如果全是19700101開頭的文件說明系統(tǒng)時區(qū)沒同步date命令輸出不準(zhǔn)——這是第二常見失敗原因。3.3 加入crontab必須用絕對路徑環(huán)境隔離否則凌晨3點(diǎn)靜默退出這才是真正的生死線。很多人把startOSWBB.sh丟進(jìn)crontab就以為萬事大吉結(jié)果某天凌晨數(shù)據(jù)庫慢一查OSWatcher日志最后更新時間停在3:00整。原因crontab默認(rèn)不加載用戶的shell環(huán)境JAVA_HOME、PATH全為空。OSWBB啟動時找不到Java直接靜默失敗。正確寫法以oracle用戶為例# 編輯oracle用戶的crontab su - oracle -c crontab -e # 添加這一行注意必須用絕對路徑 0 0 * * * /u01/app/oracle/oswbb/startOSWBB.sh -t 30 -i 30 -o /u01/app/oracle/oswbb/archive /u01/app/oracle/oswbb/logs/cron.log 21但還不夠必須確保startOSWBB.sh里指定了Java路徑。打開startOSWBB.sh找到這一行JAVA_CMDjava把它改成JAVA_CMD/u01/app/java/jdk-11.0.2/bin/java路徑替換成你服務(wù)器上真實的JDK路徑用which java確認(rèn)更保險的做法是在crontab里顯式聲明環(huán)境0 0 * * * export JAVA_HOME/u01/app/java/jdk-11.0.2; export PATH$JAVA_HOME/bin:$PATH; /u01/app/oracle/oswbb/startOSWBB.sh -t 30 -i 30 -o /u01/app/oracle/oswbb/archive /u01/app/oracle/oswbb/logs/cron.log 21踩坑實錄某證券公司生產(chǎn)庫的OSWatcher連續(xù)斷更72小時DBA堅稱“crontab里寫了”。最后發(fā)現(xiàn)他們用的是root用戶加的crontab但startOSWBB.sh腳本里硬編碼了ORACLE_HOME/u01/app/oracle/product/19c/dbhome_1而root用戶根本沒有這個環(huán)境變量。腳本啟動時java命令能執(zhí)行但oswbb.jar讀取ORACLE_HOME失敗直接退出。解決方案是OSWatcher必須用oracle用戶運(yùn)行且crontab必須屬于oracle用戶。這是血淚教訓(xùn)。4. 日志解讀實戰(zhàn)從sar -u的12個字段里一眼揪出IO瓶頸真兇OSWatcher生成的文本日志表面看就是一堆命令輸出但每個字段都是線索。我以最常用的sar -uCPU使用率為例拆解如何從原始數(shù)據(jù)里挖出深層問題。注意這里不講理論只講我在現(xiàn)場怎么快速定位。假設(shè)你拿到sar_20240515140300.dat內(nèi)容節(jié)選如下Linux 4.18.0-305.el8.x86_64 (db01) 05/15/2024 _x86_64_ (32 CPU) 14:03:00 CPU %user %nice %system %iowait %steal %idle 14:03:30 all 2.10 0.00 1.85 89.22 0.00 6.83 14:04:00 all 1.95 0.00 1.72 91.05 0.00 5.28 14:04:30 all 2.05 0.00 1.78 90.41 0.00 5.76第一反應(yīng)不是看%iowait90%而是看**%idle是否為0**。這里%idle6.83%說明CPU還有空閑問題不在CPU算力不足。接著看%iowait和%system的比值90.41 / 1.78 ≈ 50.8遠(yuǎn)大于10。這表明內(nèi)核花了大量時間在等待IO完成而不是在處理系統(tǒng)調(diào)用。這是典型的存儲響應(yīng)慢特征。但別停在這里。繼續(xù)翻同一時間點(diǎn)的iostat_20240515140300.datDevice r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util sda 12.3 45.6 120.5 342.1 0.2 3.1 1.6 6.4 12.4 28.7 1.2 9.8 7.5 1.1 6.3 sdh 215.4 1243.2 18245.3 98765.4 0.0 0.0 0.0 0.0 152.3 208.7 42.6 84.7 79.5 1.8 98.2重點(diǎn)看sdh這是數(shù)據(jù)庫數(shù)據(jù)盤%util98.2%磁盤幾乎100%忙但還沒到100%說明還沒徹底堵死。w_await208.7ms寫請求平均等待208毫秒遠(yuǎn)超正常值10ms。這是IO慢的鐵證。aqu-sz42.6平均隊列深度42.6意味著有42個IO請求在排隊。而svctm1.8ms單個IO服務(wù)時間很短證明不是磁盤本身慢而是請求太多上游如HBA卡、SAN交換機(jī)處理不過來。這時再交叉驗證netstat_20240515140300.dat里的netstat -s | grep -i retransmitTcp: 1243222 segments retransmitted對比基線值平時是1243222vs1243225只漲3說明網(wǎng)絡(luò)層沒問題。問題鎖定在存儲鏈路。最后一步看vmstat_20240515140300.dat的b列blocked進(jìn)程數(shù)procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 42 0 12456 2345 124567 0 0 12 45 234 567 2 2 6 90 0b42和iostat的aqu-sz42.6高度吻合——有42個進(jìn)程因IO阻塞在D狀態(tài)。至此證據(jù)鏈閉環(huán)存儲響應(yīng)慢 → IO隊列積壓 → 進(jìn)程阻塞 → 數(shù)據(jù)庫SQL超時。實操技巧我寫了一個Python腳本osw_analyze.py自動解析OSWatcher目錄輸入時間范圍如202405151403-202405151405它會找出所有該時間段的sar、iostat、vmstat文件計算%iowait的均值和峰值篩選出%util95%的磁盤輸出b列均值和aqu-sz均值的比值理想值應(yīng)≈1生成Markdown報告直接粘貼進(jìn)故障復(fù)盤文檔。 這個腳本在GitHub上開源但核心邏輯就三行用pandas讀取文本groupby時間戳agg聚合統(tǒng)計。工具不重要思路才關(guān)鍵——把原始數(shù)據(jù)變成可決策的信息。5. 高級技巧用OSWatcher做容量預(yù)測比任何商業(yè)工具都準(zhǔn)很多人把OSWatcher當(dāng)“急救包”出了事才翻日志。但我在某電商平臺的實踐中把它變成了“天氣預(yù)報”——提前兩周預(yù)測IO瓶頸讓擴(kuò)容窗口從“緊急”變成“從容”。原理很簡單OSWatcher的sar -d磁盤統(tǒng)計每30秒記錄一次rkB/s讀KB每秒和wkB/s寫KB每秒。把這些數(shù)據(jù)導(dǎo)出成CSV用Excel或Python做線性回歸就能擬合出IO吞吐量的增長曲線。關(guān)鍵在于必須用“工作日”數(shù)據(jù)建模剔除周末和節(jié)假日的噪聲。具體步驟解壓最近30天的OSWatcher歸檔包oswbb_archive_20240415*.tar.gz到oswbb_archive_20240515*.tar.gz用腳本提取所有iostat_*.dat中sdh盤的wkB/s值按日期分組篩選周一至周五的數(shù)據(jù)排除周末計算每日wkB/s均值對日期X軸和均值Y軸做線性擬合公式為Y aX b設(shè)定閾值當(dāng)預(yù)測值Y 0.8 * 存儲標(biāo)稱帶寬時觸發(fā)預(yù)警。舉個真實案例某電商訂單庫的sdh盤標(biāo)稱帶寬是1200MB/s1200000KB/s。模型擬合出wkB/s 12500 * 天數(shù) 850000。代入14天后天數(shù)14預(yù)測wkB/s 12500*14 850000 1025000 KB/s已達(dá)標(biāo)稱值的85.4%。我們立即啟動擴(kuò)容流程采購新SSD陣列10天后上線。結(jié)果第13天wkB/s實測突破1000000KB/s新存儲剛好頂上。整個過程沒有一次慢SQL告警。為什么這比商業(yè)APM工具準(zhǔn)因為APM工具采集的是應(yīng)用層指標(biāo)如“下單接口TPS”它需要經(jīng)過應(yīng)用代碼、JDBC驅(qū)動、Oracle網(wǎng)絡(luò)層、存儲驅(qū)動多層轉(zhuǎn)換每一層都有緩沖和延遲。而OSWatcher的iostat直接讀/sys/block/sdh/stat是內(nèi)核IO子系統(tǒng)最末端的原始計數(shù)器毫秒級無損。它反映的是物理存儲的真實壓力不是業(yè)務(wù)流量的間接推算。當(dāng)然這需要你建立自己的基線庫。我建議每月1號用以下命令自動生成當(dāng)月基線報告# 生成過去30天工作日的IO均值 find /u01/app/oracle/oswbb/archive -name iostat_*.dat -mtime -30 | \ xargs grep -h sdh | \ awk $1 ~ /^[0-9]:[0-9]:[0-9]$/ $2sdh {print $1, $5} | \ awk -F: {dsprintf(%04d%02d%02d, $1,$2,$3); print d, $4} | \ awk $1 20240415 $1 20240515 (substr($1,5,2)0)%71 (substr($1,5,2)0)%75 {sum$2; cnt} END {print Avg wkB/s:, sum/cnt} /u01/app/oracle/oswbb/baseline/monthly_baseline_$(date %Y%m).txt這個腳本會自動過濾出4月15日到5月15日之間周一至周五(substr($1,5,2)0)%71 5的wkB/s均值存為monthly_baseline_202405.txt。三年下來你就有了36個月的基線數(shù)據(jù)可以做同比、環(huán)比分析甚至發(fā)現(xiàn)季節(jié)性規(guī)律比如每年雙11前兩周wkB/s會自然增長15%。最后分享一個反直覺經(jīng)驗OSWatcher的預(yù)測價值往往在“風(fēng)平浪靜”時最大。當(dāng)數(shù)據(jù)庫一切正常%iowait穩(wěn)定在2%wkB/s曲線平滑上升這才是擴(kuò)容的最佳時機(jī)。一旦%iowait開始抖動忽高忽低說明IO隊列已經(jīng)不穩(wěn)定再擴(kuò)容就晚了——因為抖動意味著某些IO請求開始超時重試形成惡性循環(huán)。所以別等報警響了再看OSWatcher要把它養(yǎng)成每天晨會必看的“健康日報”。我在實際使用中發(fā)現(xiàn)最有效的做法是把OSWatcher日志接入ELK但只索引timestamp、device、wkB/s、%iowait這幾個字段用Kibana做簡單折線圖。不需要 fancy 的AI預(yù)測一條清晰的上升趨勢線加上一個醒目的閾值橫線就是最好的預(yù)警。技術(shù)越簡單越可靠。