iofsstat:幫你輕鬆定位 IO 突高,前因後果一目瞭然 | 龍蜥技術
文/ 李光水:系統運維SIG核心成員、 毛文安:系統運維SIG負責人。
一、 需求背景
二、現有工具
在定位問題這類問題的過程中,我們會通過系統的現有工具,定位具體的程式、檔案或者容器,然後採取下一步措施解決問題,如停掉程式、容器並檢視問題現象是否消失。一般地,如下幾類工具會使用比較頻繁:
-
基於核心 diskstats 衍生的工具,如 iostat、sar-類命令的IO統計功能、vmstat-d
——可以巨集觀的從整個磁碟角度去統計 io 資訊,如統計整盤的 iops、bps
-
基於核心 proc/$pid/io 衍生的工具,如 pidstat -d
——可以統計到程式貢獻的總體IO
-
基於 Taskstats 衍生的工具,如 iotop
——可以統計到程式貢獻的總體 IO 以及貢獻的 iowait
儘管系統為我們提供了比較豐富的工具,但總有這樣一種感覺:使用已有的命令,儘管知道磁碟的 IO 高了,但不知道是哪個程式貢獻的;知道系統裡面的某個程式貢獻的 IO 高了,但又不確定這裡有多少 IO 是被我關心的磁碟給消費的,也不知道這些 IO 都是在操作什麼檔案,總覺得哪哪都差一點兒。所以總結下來,得到如下幾點訴求:
● 在磁碟 IO 被打滿的情況下,希望觀察是哪個程式貢獻了比較多的 IO
● 系統上統計到某個程式貢獻了大量的 IO,希望觀察到這些 IO 最終是被哪個磁碟給消費,或者這些 IO 是在訪問哪個檔案,如果這個程式是來自某個容器,希望依然可以獲取訪問的檔案以及此程式所在的容器
而本文所介紹的
iofsstat
,實現了從程式角度來統計 IO 資訊、檔案讀寫資訊,滿足了之前提到的幾個訴求,可以應用到 io utils 高、io 打滿類問題的定位中。
三、
iofsstat 功
能
介紹
3.1 統計指定磁碟的程式檔案 IO
主要統計某程式對某檔案貢獻了多少
IO,對使用者呈現的指標為程式角度+磁碟角度,磁碟角度這個毋庸置疑是為了能夠看到磁碟的全貌,程式角度,是更細粒度的,可以看到對應的在這個時刻,各程式的貢獻情況(PS:這裡並非程式貢獻的總和要等於磁碟整體的統計,因為統計的原理不一致,這裡可以更多的關注兩個角度之間的關聯性,如在某一時刻,磁碟統計到高了,這個時候可以看到對應的這個時刻的各個程式的貢獻程度),各指標如下:
程式角度:
comm:程式名、 pid:程式id、cnt_rd:讀檔案次數、bw_rd:讀檔案"頻寬"、cnt_wr:寫檔案次數、bw_wr :寫檔案"頻寬"、inode:檔案inode編號、filepath:檔案路徑,當在一次採集週期內由於程式訪問檔案很快結束情況下,獲取不到檔名則為"-"。
如程式來自某個容器,在檔名字尾會顯示 [containterId:xxxxxx]
磁碟角度:
xxx-stat:r_iops:磁碟總的讀 iops、 xxx-stat:w_iops:磁碟總的寫 iops、xxx-stat:r_bps:磁碟總的讀 bps、xxx-stat:w_bps:磁碟總的寫 bps、xxx-stat:wait:磁碟平均 io 延遲、xxx-stat:r_wait:磁碟平均讀 io 延遲、xxx-stat:w_wait:磁碟平均寫 io 延遲、xxx-stat:util%:磁碟 io utils
sysak iofsstat -d vdb1 --fs 1 #間隔1秒統計一次vdb磁碟上的程式讀寫檔案情況 2022/01/19 14:13:48 vda-stat: r_iops w_iops r_bps w_bps wait r_wait w_wait util% 0.00 98.00 0.00 91.5MB/s 946.34 0.00 946.34 93.20 comm pid cnt_rd bw_rd cnt_wr bw_wr inode filepath dd 55937 0 0 1096 137.0MB/s 9226 /home/data/tfatsf ...
3.1.1 程式、磁碟、檔案資訊
實際上滿足功能的需求,只需要獲取程式資訊、IO 大小、dev 編號、檔案 inode 編號就夠了,而在檔案系統層沒有現成的符合這些需求的 tracepoint,因此考慮通過 kprobe_events 去 hook 特定函式;kprobe_events
又繞不開因為不同核心版本,資料結構會不一致,造成輸入到 kprobe_events 的表示式不一致的問題,幸運的是因為 surftrace 已經幫我們解決了這個問題,我們只需要關注 kprobe 之後資料的解析,而無需關注表示式的變化。
3.1.2 如何獲取檔案路徑
通過 3.1.1 已經獲取檔案 inode 編號,通過 find -inum 指定磁碟的掛載目錄,或者通過 debugfs 方式,獲取到檔名,但這種方式不僅耗時間也可能會耗 io;因為已經獲取到了程式資訊,接下來可以在 /proc/$pid/fd 過濾出來屬於指定磁碟下的檔案,然後比對檔案的 inode 即可獲取檔名,簡單高效,但缺點是當比對檔案過程中檔案訪問結束被 close 掉了,就獲取不到檔名了,但這種情況一般在有問題的情況下出現概率也很低(一般關注的 IO 打滿問題基本持續時間也都是秒級別)。
3.2 統計指定磁碟的程式IO貢獻
主要統計某程式對某磁碟貢獻了多少 IO,對使用者呈現的指標為程式角度+磁碟角度,磁碟角度這個毋庸置疑是為了能夠看到磁碟的全貌,程式角度,是更細粒度的,可以看到對應的在這個時刻,各程式的貢獻情況(PS:這裡並非程式貢獻的總和要等於磁碟整體的統計,因為統計的原理不一致,這裡可以更多的關注兩個角度之間的關聯性,如在某一時刻,磁碟統計到高了,這個時候可以看到對應的這個時刻的各個程式的貢獻程度),各指標如下:
程式角度:
comm:程式名、pid:程式 id、 iops_rd:程式貢獻的讀 iops、bps_rd :程式貢獻的讀bps、iops_wr:程式貢獻的寫iops、bps_wr :程式貢獻的寫bps。
磁碟角度:
同 3.1 節磁碟角度。
sysak iofsstat -d vdb 1 #間隔1秒統計一次vdb磁碟上的程式io貢獻情況 2022/01/19 12:04:38vda-stat: r_iops w_iops r_bps w_bps wait r_wait w_wait util% 0.00 118.00 0.00 104.2MB/s 976.82 0.00 976.82 95.60 comm pid iops_rd bps_rd iops_wr bps_wr [dd] 98675 1 4.0KB/s 259 32.4MB/s [kworker/u12:0] 91022 1 4.0KB/s 198 167.5MB/s [jbd2/vdb1-8] 19510 0 0 1 4.0KB/s ...
3.2.1 實現原理
四、效能開銷
五、程式碼開源
iofsstat 程式碼將在 3 月中旬開源,敬請期待。
加入微信群:新增社群助理-龍蜥社群小龍(微信:openanolis_assis),備註【龍蜥】與你同在;加入釘釘群:掃描下方釘釘群二維碼。歡迎開發者/使用者加入龍蜥社群(OpenAnolis)交流,共同推進龍蜥社群的發展,一起打造一個活躍的、健康的開源作業系統生態!
龍蜥社群( OpenAnolis)是由 企事業單位、高等院校、科研單位、非營利性組織、個人等在自願、平等、開源、協作的基礎上組成的非盈利性開源社群。龍蜥社群成立於 2020 年 9 月,旨在構建一個開源、中立、開放的Linux 上游發行版社群及創新平臺。
龍蜥社群成立的短期目標是開發龍蜥作業系統( Anolis OS)作為 CentOS 停服後的應對方案,構建一個相容國際 Linux 主流廠商的社群發行版。中長期目標是探索打造一個面向未來的作業系統,建立統一的開源作業系統生態,孵化創新開源專案,繁榮開源生態。
目前, 龍蜥OS 8.4 已釋出,支援 X86_64 、Arm64、LoongArch 架構,完善適配飛騰、海光、兆芯、鯤鵬、龍芯等晶片,並提供全棧國密支援。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2855169/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 技術門檻高?來看 Intel 機密計算技術在龍蜥社群的實踐 | 龍蜥技術Intel
- 關於 React19,你需要了解的前因後果React
- 比 ping 強大百倍的視覺化工具!結果一目瞭然視覺化
- [JavaWeb]Log4j的前因後果JavaWeb
- 這 8 類問題,SysOM 2.0 OOM 診斷助你快速定位異常 | 龍蜥技術OOM
- 編寫高質量可維護的程式碼:一目瞭然的註釋
- 助力Koordinator雲原生單機混部,龍蜥混部技術提升CPU利用率達60%|龍蜥技術
- ATC'22頂會論文RunD:高密高併發的輕量級 Serverless 安全容器執行時 | 龍蜥技術Server
- eBPF 雙子座:天使 or 惡魔?| 龍蜥技術eBPF
- 龍蜥開源Plugsched:首次實現 Linux kernel 排程器熱升級 | 龍蜥技術Linux
- 龍蜥社群高效能儲存技術 SIG 11 月運營回顧 | 龍蜥 SIG
- 浪潮資訊工程師:帶你瞭解裝置透傳虛擬機器的快速啟動技術最佳化方案 | 龍蜥技術工程師虛擬機
- 建立匯入狀態碼,介面情況一目瞭然
- 龍蜥利器:系統運維工具 SysAK的雲上應用效能診斷 | 龍蜥技術運維
- 龍蜥開源核心追蹤利器 Surftrace:協議包解析效率提升 10 倍! | 龍蜥技術協議
- 萬里資料庫加入龍蜥社群,打造基於“龍蜥+GreatSQL”的開源技術底座資料庫SQL
- 跨語言程式設計的探索 | 龍蜥技術程式設計
- 快遞查詢 API 介面:讓物流資訊一目瞭然API
- 帶你輕鬆瞭解C# Lock 關鍵字C#
- 智慧工具+海量模板幫你輕鬆搞定主圖設計!
- 蘋果企業開發者賬號漲價的前因後果蘋果
- 蘋果iOS如何虛擬定位 iToolab AnyGo mac中文版輕鬆做到蘋果iOSGoMac
- 如何輕鬆做資料治理?開源技術棧告訴你答案
- 還在頭疼每月房貸還款?這個房貸計算機讓你一目瞭然計算機
- 讓玩家對遊戲機制一目瞭然的玻璃清潔劑遊戲
- 超全Python IDE武器庫大總結,優缺點一目瞭然!PythonIDE
- 肝了一週總結的SpringBoot常用註解大全,一目瞭然!Spring Boot
- 小團隊招聘 PHP技術員 工作輕鬆PHP
- 輕量易部署!Coolbpf 釋出不依賴 Clang 的指令碼化程式設計特性 lwcb | 龍蜥技術指令碼程式設計
- ChatGPT強勢爆紅,背後的技術原理是?一文輕鬆搞懂!ChatGPT
- 京東API介面技術大揭秘:讓你輕鬆駕馭電商開發API
- 有了這套車間生產看板,生產進度一目瞭然
- 螞蟻安全科技 Nydus 與 Dragonfly 映象加速實踐 | 龍蜥技術Go
- 入門即享受!coolbpf 硬核提升 BPF 開發效率 | 龍蜥技術
- 基於 Coolbpf 的應用可觀測實踐 | 龍蜥技術
- SysOM 案例解析:消失的記憶體都去哪了 !| 龍蜥技術記憶體
- 輕鬆定位硬體故障方法-日誌分析
- 輕鬆gps定位:AnyGo最新啟用版中文Go