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