官术网_书友最值得收藏!

第48條
使用expvar輸出度量數據,輔助定位性能瓶頸點

上一條提到,要想對Go應用存在的性能瓶頸進行剖析,首先就要對不同類型的性能數據進行收集和采樣。有兩種收集和采樣數據的方法。在微觀層面,采用通過運行性能基準測試收集和采樣數據的方法,這種方法適用于定位函數或方法實現中存在性能瓶頸點的情形;在宏觀層面,采用獨立程序收集和采樣數據的方法。但通過獨立程序進行性能數據采樣時,往往很難快速捕捉到真正的瓶頸點,尤其是對于那些內部結構復雜、業務邏輯過多、內部有較多并發的Go程序。我們在對這樣的程序進行性能采樣時,真正的瓶頸點很可能被其他數據遮蓋。

那么如何能更高效地捕捉到應用的性能瓶頸點呢?我們需要知道Go應用運行的狀態。應用運行狀態一般以度量數據的形式呈現。通過了解應用關鍵路徑上的度量數據,我們可以確定在某個度量點上應用的性能是符合預期性能指標還是較大偏離預期,這樣就可以最大限度地縮小性能瓶頸點的搜索范圍,從而快速定位應用中的瓶頸點并進行優化。

這些可以反映應用運行狀態的數據也被稱為應用的內省(introspection)數據。相比于通過查詢應用外部特征而獲取的探針類(probing)數據(比如查看應用某端口是否有響應并返回正確的數據或狀態碼),內省數據可以傳達更為豐富、更多的有關應用程序狀態的上下文信息。這些上下文信息可以是應用對各類資源的占用信息,比如應用運行占用了多少內存空間,也可以是自定義的性能指標信息,比如單位時間處理的外部請求數量、應答延遲、隊列積壓量等。

傳統編程語言(如C++、Java等)并沒有內置輸出應用狀態度量數據的設施(接口方式、指標定義方法、數據輸出格式等),需要開發者自己通過編碼實現或利用第三方庫實現。Go是“自帶電池”的編程語言,我們可以輕松地使用Go標準庫提供的expvar包按統一接口、統一數據格式、一致的指標定義方法輸出自定義的度量數據。在本條中,我們就一起來看看如何使用expvar輸出自定義的性能度量數據。

主站蜘蛛池模板: 保靖县| 渝北区| 盐津县| 万源市| 旌德县| 庆元县| 临泉县| 会昌县| 周口市| 江达县| 桐梓县| 巫溪县| 盐边县| 鹤峰县| 舞钢市| 连城县| 扬中市| 达拉特旗| 临沂市| 浮山县| 裕民县| 大方县| 涡阳县| 邯郸市| 积石山| 庆城县| 渝中区| 华容县| 尤溪县| 双江| 陕西省| 甘德县| 冕宁县| 新郑市| 卢湾区| 龙岩市| 禄丰县| 双鸭山市| 兰坪| 波密县| 大石桥市|