開源性能可視化工具——FlameScope模式識別

FlameScope是一個新的開源性能可視化工具,它使用次秒級偏移熱圖和火焰圖來分析週期活動、方差、擾動。咱們在Netflix TechBlog上面,發表了技術文章Netflix FlameScope,以及工具的源代碼火焰圖很好理解,次秒級偏移熱圖理解起來要困難些(我最近發明的它)。FlameScope能夠該幫助你理解後者。html

總而言之,次秒級偏移熱圖是這樣的:x軸是一整秒,y軸是這一秒裏的幾分之一秒。這每一個幾分之一秒都被稱做一個桶(或者說盒),表示這幾分之一秒裏,事件數量的聚合。盒子顏色深度表示發生的次數,顏色越深表示次數越多。git

下圖一個真實的CPU上的次秒級偏移熱圖樣本:github

這張圖中能分析出什麼信息來呢?爲了能把各類不一樣模式區分開來展現,我在這篇文章裏先畫了一些人工合成的樣本。實際使用FlameScope工具時,能夠選擇你的各個模式,還能生成火焰圖,顯示對應的代碼路徑(這裏我不展現火焰圖)。工具

週期活動

1 . 一個線程,每秒一次性能

線程在每秒鐘內的一樣的偏移裏醒來,作幾毫秒的工做,而後回到睡眠。測試

2 . 一個線程,兩次每秒優化

每500ms喚醒一次。既多是兩個線程,也多是一個線程500ms 喚醒一次。spa

3 . 兩個線程線程

看起來像兩個線程均1s喚醒一次3d

4 . 一個忙等待線程,每秒一次

這個線程作約20ms的工做,而後睡1s。這是一個常見的模式,致使每秒鐘喚醒抵消匍匐前進。

5 . 一個忙等待線程,兩次每秒

每500ms喚醒一次。有多是單線程程序,每秒喚醒兩次。

6 . 一個計算較密集的忙等線程

斜率高,每秒作更多的工做,大約是80毫秒。

7 . 一個計算較不密集的忙等線程

斜率低,每秒作的工做較少,可能只有幾毫秒。

8 . 一個忙等待線程,每5秒鐘喚醒一次

如今5秒喚醒一次。

咱們能夠根據夾角和喚醒的時間間隔,計算每一個喚醒的CPU繁忙時間:
busy_time = (1000 ms / (熱圖行數 時間長度) tan(夾角)
例如45°夾角的線:
busy_time = (1000 ms / (501)) tan(45) = 20ms

方差

9 . cpu利用率100%

這是CPU徹底被用滿的樣子

10 . cpu利用率50%

真實的工做負載更像是這樣,是由短請求、隨機到達組成的。

11 . cpu利用率25%

相同的工做負載類型,大小在25%。

12 . cpu利用率5%

相同的工做負載類型,大小在5%。

13 . 負載增長

在2分鐘的尺度上,負載在變重。

14 . 變化的負荷

每30秒就有5秒的工做負載較重。

擾動

15 . CPU擾動

時不時地全部CPU都滿載個100ms。(好比垃圾回收)

16 . CPU阻塞

時不時地全部CPU都空載個100ms。(好比等I/O)

17 . 單線程阻塞

時不時地,只有一個CPU沒有idle(表現爲粉紅色長條,而不是白色長條)。(好比全局鎖)

最後這個模式頗有趣:它發生在一個當前運行的線程持有一把鎖,而其它全部線程都阻塞在這把鎖上。
那麼該線程在作什麼呢?點擊FlameScope的粉色線,就能看到此時的火焰圖。複雜的性能問題馬上變簡單。

總結

你能從這張圖中分析出什麼結論?

實際使用FlameScope工具時,能夠選擇你的各個模式,還能生成火焰圖,顯示對應的代碼路徑。

我和同事Martin Spier(也是該工具的主開發人員)11月8日在LinkedIn性能meetup上發表演講。

祝你使用FlameScope愉快,歡迎截圖分享你遇到有趣的模式!

Brendan

實踐

須要補充的是,做者最新的工做,將強大的Differential Flame Graph也集成到FlameScope中了,如今交互式地在FlameScope上,選擇兩個測試集以及對應的時間段,對比兩個測試組的事件採樣。

我在使用FlameScope時,發現並fix了FlameScope的若干bug。也包括Differential Flame Graph跑不起來的一些bug。以後我便用它來進行了一些性能問題的復現。還發現其中一些有趣的模式。

首先,我想分析兩個測試組的調度特徵。我對他們分別進行了perf sched record採樣,並使用FlameScope進行了數據可視化。

性能好的分組 
客戶端

服務端

性能差的分組
客戶端

服務端


咱們發現性能差的分組,有大量的調度事件,並且發生地很是均勻。性能好的分組則是週期性地繁忙工做若干毫秒(深紅色長條),咱們還能發現背景裏有周期性的輕鬆任務(淺紅色長條)

這個對比,給了咱們這兩個測試集的調度特徵一個直觀的感覺。但看來分析問題須要藉助更多的信息。

因而我使用了Differential Flame Graph分析兩個測試集的完整調用棧上的採樣。

該圖便給出一個重要線索,兩個測試集最重大的區別,在vfs_write->do_sync_write->sock_aio_write->inet_sendmsg->copy_user_enhanced_fast_string這條路徑上。(注意因爲內核編譯優化等緣由,調用路徑略有不許確)

性能好的測試組,多調用了不少次copy_user_enhanced_fast_string,性能差測試組的則不多。

以後的工做便於FlameScope關係不大了。這即是我使用FlameScope工具進行測試和性能調優的一個實踐。Bredan Gregg大神主導的這個軟件,對性能數據闡釋的直觀性真的太強了~


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索