小編說:
今天為大家介紹一款實用工具——阿里開源內核診斷工具diagnose-tools。diagnose-tools是由阿里巴巴開發的linux內核診斷工具,用于linux性能分析,特別是大規模集群系統中的抖動問題分析。
diagnose-tools工具是阿里工程師謝寶友在過去一年多時間開發的,代碼行數超過 5萬行。同時,他也是《深入理解并行編程》、《自研操作系統:DIM-SUM設計與實現》的作者。
1. 引言
作為一名Linux工程師,難免會遇到系統宕機、夯機、性能抖動等問題。在夯機時,常見的做法是編寫一個簡單的腳本去遍歷系統中所在線程的堆棧。例如:
#!/bin/sh
#****************************************************************#
# ScriptName: load.sh
# Author: baoyou.xie@aliyun.com
# Create Date: 2020-08-13 19:32
# Modify Author: @alibaba-inc.com
# Modify Date: 2020-08-13 19:32
# Function:
#***************************************************************#
for pid in `ls /proc/`; do
for tid in `ls /proc/$pid/task`; do
echo pid: $pid, tid: $tid
cat /proc/$pid/task/$tid/stack
done
done
只要找到進程的調用鏈,有經驗的工程師會很快知道引起系統卡頓的原因。換句話說,類似問題比較容易解決。
確實,在單機中,解決這些問題的方法很多,看起來也很簡單。但是,這樣的腳本可能存在如下問題:
1. 在生產環境中,一臺100個CPU的服務器,往往有數萬甚至數十萬個線程,運行這樣的腳本要花費一分鐘時間。
2. 如果在上千臺機器中部署這樣的腳本,必然會引起生產故障。
3. 這樣的腳本只能找到線程在內核中的堆棧。如果應用程序運行在用戶態,就沒有辦法知道這些應用程序到底在做什么,為何引起系統卡頓。
2. 難題
互聯網一線工程師最頭疼的難題是“集群內RT偶發抖動”,以及系統卡頓。
其中,RT抖動問題最大的難點在于:
- 上千臺機器中出現異常的機器隨機。
- 異常發生的時間隨機。
- 故障持續時間也只有幾秒鐘。
常規的單機診斷手段有以下不足:
- 占用超過1%的CPU。
- 部署復雜,可能需要安裝Python/systemtap等工具。
- 消耗內存和存儲資源。
可以說,集群范圍內的RT偶發抖動是一個業界難題,被全世界的運維工程師所討厭。
在日常業務穩定性分析的過程中,作者用內核模塊實現了一些小工具,并將這些小工具集成到diagnose-tools中。為了將工具方便應用到線上生產環境,作者特意使用Linux內核模塊實現了diagnose-tools工具。
這些小工具解決了不少線上的穩定性問題。特別是在2019年“雙11”壓測中,發揮了重要作用,為2019年最穩的“雙11”貢獻了力量。
3. 用途
◆ load-monitor
在系統卡頓的時候,往往伴隨著系統Load指標升高。這可以通過top/uptime等命令看到當前系統的Load指標。一旦發現系統Load升高,就可以使用load-monitor子功能找到當前系統中處于D狀態和R狀態的進程。這些狀態的進程與系統Load指標息息相關。diagnose-tools工具不但能找到這些進程的名稱,還能打印出進程的內核態堆棧/用戶態堆棧/進程組/CGROUP組等信息。最重要的是,工具還可以為此生成火焰圖,這樣就可以一目了然地找到問題原因。
當然了,你可以運行如下命令來看看工具的效果:
sh /usr/diagnose-tools/test.sh load-monitor
◆ sys-delay
在服務器Linux中,隨著系統負載的增加,會暴露出Linux內核中不少有隱患的代碼。例如:過長的循環、鎖競爭、不合理的流程。這些代碼會導致系統調用變慢,從而引起卡頓。sys-delay功能是找到這些異常代碼的好工具。
sys-delay功能的實現原理,是在應用程序進入系統調用的地方,掛接一個trace-point鉤子,記錄下進入時間,在退出系統調用的時候結束監控。并且啟動一個定時器,監控執行時間過長的調用鏈。
這個功能找到不少異常流程,相關的工程師制作了熱補丁,提升了阿里混部系統的平滑度。
◆ run-trace
run-trace功能是解決應用程序RT抖動的利器。為至少10個業務方解決了2019年“雙11”壓測過程中的問題。可以略微夸張一點地講,這個功能為2019年最穩的“雙11”發揮了不小的作用,這也間接促進了2019 年“雙11”成功獲得國家科技進步獎。
run-trace功能的原理是在計算RT開始和結束的地方,掛接鉤子,系統記錄下在此期間應用程序的所有行為。可以針對應用程序進行微秒級的采樣,得到應用程序的用戶態調用鏈,找到應用程序異常期間的所有異常事件。
◆ perf
與開源社區大名鼎鼎的perf工具相比,diangose-tools工具的perf功能不算強大,但是很有特色。特別是在運行數十個容器的宿主機中,使用此工具可以針對部分CPU進行采樣,并且完整輸出進程用戶態/內核態調用鏈,這些特色是開源perf工具所沒有的。此功能也協助分析了不少線上生產環境中的問題。
◆ 其他功能
除了這些功能外,diagnose-tools工具還有20多個小功能。包括網絡、I/O相關的診斷工具。限于篇幅,作者并不能在此詳細列出所有功能的介紹。有興趣的讀者可以:
1.參考源碼目錄 /documents/usage.docx里的詳細介紹。
2.參考源碼目錄SOURCE/script/test.sh,試著使用每個功能并觀察其結果。
3.添加linux-kernel微信號與作者聯系。
4. 效果
通過工具,我們最終在線上生產環境中,發現了不少內存回收、系統堆疊、不合理的監控工具引起的問題。
同時根據工具的診斷結果,產生了19個內核優化補丁,同時也調整線上生產系統的Linux配置參數。
最終實現的效果是:將混部機房的Load高告警數量降低了67%,節省了數千臺物理機。同時也將阿里云存儲抖動告警降低了50倍。
5. 特點
要達到這樣的效果,主要在于工具輕量化的特點。這是本工具優于腳本/ebpf/systemtap的地方。它的性能開銷小到何種地步呢?舉個例子,在10G網絡吞吐量的情況下,對每個報文進行監控,僅僅占用3%的CPU。
正是由于輕量化的特點,才可以將工具常態化運行在集群中,抓住異常信息。最終實現秒級系統資源監控,突破了一個業界技術難題。
6. 適用范圍
除了輕量化的特點外,diagnose-tools工具的適用面也比較廣,不僅可以用于阿里生產環境的操作系統,也可以用于標準linux 2.6 / 3.x / 4.x / 5.x版本。當然了,還可以用于常見的Linux發行版,例如ubuntu/centos/debian,甚至也有公有云客戶將它用于定制linux中。
diagnose-tools還可以獲取用戶態應用程序的調用鏈,而不管這些應用程序是用JAVA / C / C++ 還是Go語言開發。甚至,作者希望業界同人對工具進行改造,以支持python等其他開發語言編寫的應用程序。
在實踐中,也可以基于diagnose-tools進行二次開發,與業務調度程序配合,完成更復雜的功能。實際上,已經有業務方在這樣使用diagnose-tools工具了。
7. 現狀
diagnose-tools工具已經被一些公有云客戶、友商、開源愛好者使用,并且幫助解決了不少Linux性能問題,特別是抖動問題。
目前,diagnose-tools工具已經開放源碼。更詳細的信息,請大家參考:
https://github.com/alibaba/diagnose-tools
有一些熱情的開源愛好者已經為diagnose-tools提供了patch,這些patch已經被合入到工具中,并且被作者用于線上生產系統的問題診斷中。
歡迎更多的開源愛好者參與到diagnose-tools工具的開發中來!
本文作者新書《自研操作系統:DIM-SUM設計與實現》已上市!