您好,登錄后才能下訂單哦!
容器化RDS:計算存儲分離架構下的“Split-Brain”
容器化RDS:計算存儲分離還是本地存儲?
容器化RDS:你需要了解數據是如何被寫"壞"的
容器化RDS:借助 CSI 擴展 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 有重大嫌疑。
閱讀 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年關系型數據庫工作經驗,目前致力于將云原生技術引入到關系型數據庫服務中。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。