容器化 RDS:藉助火焰圖定位Kubernetes效能問題
-
發現效能瓶頸
-
確定問題元件
-
藉助 CPU Profile 和 Flame Graph,快速縮小範圍,定位到問題 code-path
-
有針對的優化
| 發現效能瓶頸
所有的程式設計人員都是樂觀主義者,畢竟在可能出現問題的地方,一定都會遇到問題,在耗時 3600 秒後,95% 的 PVC 處於 Pending 狀態,嚴格的說,在批量建立的場景,該功能不可用。
大量 PVC 處於 Pending 狀態
| 定位問題元件
-
kube-apiserver
-
kube-controller-manager
-
kubelet
-
external-provisioner
-
external-attacher
-
csi-driver
-
qcfs-csi-plugin
架構圖
通過 kubelet logs 檢視日誌,可以在 external-provisioner 中發現可疑日誌:
I0728 19:19:50.504069 1 request.go:480] Throttling request took 192.714335ms, request: POST:https://10.96.0.1:443/api/v1/namespaces/default/events I0728 19:19:50.704033 1 request.go:480] Throttling request took 190.667675ms, request: POST:https://10.96.0.1:443/api/v1/namespaces/default/events
external-provisioner 訪問 kube-apiserver 觸發限流
external-provisioner 有重大嫌疑。
| 定位問題 code-path
閱讀 external-provisioner 程式碼,加入除錯日誌,理解邏輯
不斷縮小 code-path
採集堆疊樣本
找到在取樣手氣內消耗 CPU 時間比率最高的函式,把該函式作為除錯的起點
函式的呼叫關係以及取樣週期內 CPU 耗時百分比:
提供 CPU profile 和 Heap profile;
在取樣時獲得堆疊(幾乎所有)資訊, 以此為依據估算整個取樣週期內堆疊的CPU佔用百分比, 並不是 100% 準確;
取樣成本並不低,100赫茲既可以取樣夠用的堆疊資訊,又不會給應用程式帶來過大開銷;
CPU 取樣頻率預設為 100 赫茲,並硬編碼到模組中, 不建議調到 500 赫茲以上。
藉助第三方工具 go-torch 繪製
每個矩形代表一個堆疊,取樣時間內,CPU 佔用百分比越高 Y 軸越長,X 軸表明了堆疊之間的呼叫關係
從左到右按照字母表排序
顏色隨機選擇,無具體含義
來自於 external-provisioner 呼叫的第三方模組 kubenetes-incubator/external-storage
| 解決問題
採用 sharedinformer cache
修改 Leader Lock 粒度
external-provisioner 日誌中的 throttling 關鍵字消失
100 PVC 的時間縮短到60秒以內全部建立成功,無任何報錯。
| 結語
對於終端使用者而言,互動的介面越來越簡單,但對於開發者而言,元件越來越多,編譯一次的時間越來越久,加上無處不在的併發,導致定位問題的難度越來越大,尤其是效能問題。所以,對體系架構的理解能幫我們快速鎖定問題元件,配合 Profile 工具和 Flame Graph 快速定位 code-path,再加上對業務邏輯的理解找到解決方案。
所有的程式設計人員都是樂觀主義者,無論是什麼樣的程式,結果是勿庸置疑的:"這次它肯定會執行。" 或者 "我剛剛找出了最後一個問題。" ——人月神話
| 作者簡介
熊中哲·沃趣科技聯合創始人
曾就職於阿里巴巴和百度,超過10年關係型資料庫工作經驗,目前致力於將雲原生技術引入到關係型資料庫服務中。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2215126/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 容器化 RDS:藉助 CSI 擴充套件 Kubernetes 儲存能力套件
- MySQL問題定位-效能優化之我見MySql優化
- Go藉助PProf的一次效能優化Go優化
- 藉助AI助手如何高效排查SQL問題AISQL
- 【前端除錯】- 藉助Performance分析並最佳化效能前端除錯ORM
- Linux程式效能分析和火焰圖Linux
- Flame Graph 火焰圖分析 Java 效能Java
- go效能調優之火焰圖Go
- 雲吞鋪子:RDS for MySQL CPU效能問題分析3MySql
- 雲吞鋪子:RDS for MySQL CPU效能問題分析2MySql
- Kubernetes 問題排查全景圖
- 如何讀懂火焰圖?+ 例項講解程式效能優化優化
- 在瀑布下用火焰烤餅:三步法助你快速定位網站效能問題(超詳細)網站
- perf及火焰圖的使用,效能分析
- 軟體效能問題正確定位思路
- 利用jstack定位典型效能問題例項JS
- Kubernetes-應用部署問題定位和處理
- 藉助 DSL 來簡化 Loadgen 配置
- 藉助友盟+U-APM實現安卓效能優化總結安卓優化
- aspose word指定位置插入圖片,藉助word模板檔案中的書籤來定位 及Java 獲取網路圖片Java
- 效能工具perf的用法以及如何繪製效能火焰圖
- 達夢儲存過程效能問題定位儲存過程
- 如何從設計和規範上規避RDS效能問題?
- Linux火焰圖效能分析文章及視訊演示Linux
- 又一款效能監控利器——火焰圖
- 手把手教你定位常見Java效能問題Java
- 一次容器MySQL的效能問題排查MySql
- 使用火焰圖進行Java應用效能分析Java
- 雲吞鋪子:RDS for MySQL CPU效能問題分析第一篇MySql
- Java 應用壓測效能問題定位經驗分享Java
- 藉助 :has 實現3d輪播圖3D
- Chrome 火焰圖Chrome
- Golang火焰圖Golang
- 藉助友盟+U-APM找出uniapp移動端崩潰的問題APP
- 如何藉助小程式容器與前端中介軟體提升開發效率前端
- 容器化RDS—— 計算儲存分離 or 本地儲存
- UI 自動化元素定位規範問題UI
- 藉助babel理解jsxBabelJS