1. 程式人生 > 其它 >效能調優利器:火焰圖

效能調優利器:火焰圖

讓我們回想一下,曾經作為程式設計新手的我們是如何調優程式的?通常是在沒有資料的情況下依靠主觀臆斷來瞎蒙,稍微有些經驗的同學則會對差異程式碼進行二分或者逐段除錯。這種定位問題的方式不僅耗時耗力,而且還不具有通用性,當遇到其他類似的效能問題時,需要重複踩坑、填坑,那麼如何避免這種情況呢?
俗語有曰:兵慾善其事必先利其器,個人認為,程式設計師定位效能問題也需要一件“利器”。 如同醫生給病人看病,需要依靠專業的醫學工具(比如 X 光片、聽診器等)進行診斷,最後依據醫學工具的檢驗結果快速精準的定位出病因所在。效能調優工具(比如 perf / gprof 等)之於效能調優就像 X 光之於病人一樣,它可以一針見血的指出程式的效能瓶頸。
但是常用的效能調優工具 perf 等,在呈現內容上只能單一的列出呼叫棧或者非層次化的時間分佈,不夠直觀。這裡我推薦大家配合使用火焰圖,它將 perf 等工具採集的資料呈現得更為直觀。
初識火焰圖
火焰圖(Flame Graph)是由 Linux 效能優化大師 Brendan Gregg 發明的,和所有其他的 profiling 方法不同的是,火焰圖以一個全域性的視野來看待時間分佈,它從底部往頂部,列出所有可能導致效能瓶頸的呼叫棧。
火焰圖整個圖形看起來就像一個跳動的火焰,這就是它名字的由來。
火焰圖有以下特徵(這裡以 on-cpu 火焰圖為例):
每一列代表一個呼叫棧,每一個格子代表一個函式
縱軸展示了棧的深度,按照呼叫關係從下到上排列。最頂上格子代表取樣時,正在佔用 cpu 的函式。
橫軸的意義是指:火焰圖將採集的多個呼叫棧資訊,通過按字母橫向排序的方式將眾多資訊聚合在一起。需要注意的是它並不代表時間。
橫軸格子的寬度代表其在取樣中出現頻率,所以一個格子的寬度越大,說明它是瓶頸原因的可能性就越大。
火焰圖格子的顏色是隨機的暖色調,方便區分各個呼叫資訊。
其他的取樣方式也可以使用火焰圖, on-cpu 火焰圖橫軸是指 cpu 佔用時間,off-cpu 火焰圖橫軸則代表阻塞時間。
取樣可以是單執行緒、多執行緒、多程序甚至是多 host,進階用法可以參考附錄進階閱讀


效能調優利器:火焰圖
原文連結: https://www.infoq.cn/article/a8kmnxdhbwmzxzsytlga

------------------越是喧囂的世界,越需要寧靜的思考------------------ 合抱之木,生於毫末;九層之臺,起於壘土;千里之行,始於足下。 積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千里;不積小流,無以成江海。騏驥一躍,不能十步;駑馬十駕,功在不捨。鍥而舍之,朽木不折;鍥而不捨,金石可鏤。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鱔之穴無可寄託者,用心躁也。