go tool trace goalng調優工具

為什么80%的碼農都做不了架構師?>>> ??hot3.png

你想知道你的Go程序在做什么嗎???go tool trace?可以向你揭示:Go程序運行中的所有的運行時事件。 這種工具是Go生態系統中用于診斷性能問題時(如延遲,并行化和競爭異常)最有用的工具之一。 在我之前的?博客文章?中,我提到我們在Pusher中使用?go tool trace?來跟蹤為何Go垃圾收集器有很長的停頓時間。 在這篇博文中,我更加深入的介紹?go toll trace?。

go tool trace?試用

go tool trace?可以顯示大量的信息,所以從哪里開始是個問題。 我們首先簡要介紹使用界面,然后我們將介紹如何查找具體問題。

JBFBFja.jpg!web

go tool trace?UI是一個Web應用程序。 下面我已經嵌入了一個這個web程序的實例!??此示例?是可視化并行快速排序實現的追蹤信息:

nMnqiqv.jpg!web

請嘗試這個例子!有關導航UI的幫助,請單擊右上角的“?”。單擊屏幕上的任何事件可以在下面獲取更多信息。這里有一些你可以從這個追蹤中找到的有價值的信息:

  • 這個程序運行多長時間?

  • 有多少goroutines運行872微秒?

  • 該進程何時第一次升級到使用三個OS線程?

  • 什么時候主要調用qSortPar?

  • 是什么導致額外的過程(1,2和3)開始工作?

  • proc#2什么時候停止?

太棒了! 我應該怎么在我的程序中使用?go tool trace??

您必須調整程序以將運行時事件寫入二進制文件。 這涉及從標準庫導入?runtime/trace?,并添加幾行樣板代碼。 這個快速的視頻將引導您:

視頻

以下是需要復制粘貼的代碼:

package main
import (	"os""runtime/trace"
)func main() {f, err := os.Create("trace.out")	if err != nil {		panic(err)}	defer f.Close()err = trace.Start(f)if err != nil {panic(err)}	defer trace.Stop()  // Your program here
}

這將使您的程序以?二進制格式?在文件trace.out中寫入事件數據。 然后可以運行?go tool trace trace.out?。 這將解析跟蹤文件,并使用可視化程序打開瀏覽器。 該命令還將啟動服務器,并使用跟蹤數據來響應可視化操作。 在瀏覽器中加載初始頁面后,單擊“View trace”。 這將加載跟蹤查看器,如上面嵌入的那樣。

使用go tool trace能解決什么問題?

我們來看一個如何使用這個工具跟蹤典型問題的例子。

診斷延遲問題

當完成關鍵任務的goroutine被阻止運行時,可能會引起延遲問題。 可能的原因有很多:做系統調用時被阻塞; 被共享內存阻塞(通道/互斥等); 被runtime系統(例如GC)阻塞,甚至可能調度程序不像您想要的那樣頻繁地運行關鍵goroutine。

所有這些都可以使用?go tool trace?來識別。 您可以通過查看PROCs時間線來跟蹤問題,并發現一段時間內goroutine被長時間阻塞。 一旦你確定了這段時間,應該給出一個關于根本原因的線索。

作為延遲問題的一個例子,讓我們看看上一篇博文中?長時間的GC暫停?:

byeuU32.jpg!web

紅色的事件代表了唯一的程序goroutine正在運行。 在所有四個線程上并行運行的goroutines是垃圾收集器的MARK階段。 這個MARK階段阻止了主要的goroutine。 你能出到阻止runtime.main goroutine的時間長短嗎?

在Go團隊宣布GC暫停時間少于100微秒后?,我很快就調查了這個延遲問題。 我看到的漫長的停頓時間,?go tool trace?的結果看起來很奇怪,特別是可以看到它們(暫停)是在收集器的并發階段發生的。??我在go-nuts 郵件列表中提到了這個問題?,似乎與?這個問題?有關,現在已經在Go 1.8中修復了。 我的基準測試又出現了?另一個GC暫停問題?,這在寫本文時依然會出現。 如果沒有?go tool trace?這一工具,我是無法完成調查工作的。

診斷并行問題

假設您已經編寫了一個程序,您希望使用所有的CPU,但運行速度比預期的要慢。 這可能是因為您的程序不像您所期望的那樣并行運行。 這可能是由于在很多關鍵路徑上串行運行太多,而很多代碼原本是可以異步(并行)運行的。

假設我們有一個pub/sub消息總線,我們希望在單個goroutine中運行,以便它可以安全地修改沒有加互斥鎖的用戶map。 請求處理程序將消息寫入消息總線隊列。 總線從隊列中讀取消息,在map中查找訂閱者,并將消息寫入其套接字。 讓我們看看單個消息的?go tool trace?中的內容:

qQzym2I.jpg!web

最初的綠色事件是http處理程序讀取發布的消息并將其寫入消息總線事件隊列。 之后,消息總線以單個線程運行 - 第二個綠色事件 - 將消息寫給訂閱者。

紅線顯示消息寫入訂戶的套接字的位置。 寫入所有訂閱者的過程需要多長時間?

問題是四分之一的線程正在閑置。 有沒有辦法利用它們? 答案是肯定的 我們不需要同步寫入每個用戶; 寫入可以在單獨的goroutine中同時運行。 讓我們看看如果我們作出這個變化,會發生什么:

ZJneUvm.jpg!web

正如你所看到的,寫給訂閱者消息的過程正在許多goroutines的上同步進行。

但它是否更快?

有趣的是,鑒于我們使用4X的CPU,加速是適合的。 這是因為并行運行代碼有更多的開銷:啟動和停止goroutines; 共享內存以及單獨的緩存。 加速的理論上限使得我們無法實現4倍延遲降低:?阿姆達爾定律?。

實際上,并行運行代碼往往效率較低; 特別是在goroutine是非常短暫的,或者他們之間有很多的競爭的情況下。 這是使用此工具的另一個原因:嘗試這兩種方法,并檢查哪種工作最適合您的用例。

什么時候?go tool trace?不合適?

當然,?go tool trace?不能解決一切問題。 如果您想跟蹤運行緩慢的函數,或者找到大部分CPU時間花費在哪里,這個工具就是不合適的。 為此,您應該使用?go tool pprof?,它可以顯示在每個函數中花費的CPU時間的百分比。??go tool trace?更適合于找出程序在一段時間內正在做什么,而不是總體上的開銷。 此外,還有“view trace”鏈接提供的其他可視化功能,這些對于診斷爭用問題特別有用。 了解您的程序在理論上的表現(使用老式Big-O分析)也是無可替代的。

希望這篇文章可以讓您了解如何使用?go tool trace?診斷問題。 即使您沒有解決具體問題,可視化您的程序是檢查程序運行時特性的好方法。 我在這篇文章中使用的例子很簡單,但更復雜的程序中的癥狀應該與此驚人的相似。

這個博客文章給了你一個使用?go tool trace?的介紹,但你可能希望更深入地深入了解該工具。 目前正在進行的 官方?go tool trace?文檔 相當稀少。 有一個?Google文檔?更詳細。 除此之外,我發現參考源代碼是很有用,可以找出?go tool trace?如何工作:

  • go tool trace 源代碼

  • 二進制跟蹤解析器的源代碼

  • trace 源代碼

  • go tool trace?的Web界面來自?Catapult項目的跟蹤查看器?。 該查看器可以從許多跟蹤格式生成可視化。 go工具跟蹤使用?基于JSON?的跟蹤事件格式。

轉載于:https://my.oschina.net/tlkt/blog/918115

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395448.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員 文本編輯器 c語言,程序員必備的五款文本編輯器

原標題:程序員必備的五款文本編輯器程序員的工作離不開文本編輯器,有人說一個txt就能搞定,但txt面對如今復雜的要求,明顯有些捉襟見肘,下面推薦五款超級好用的文本編輯器及搭配軟件,絕對是程序員的大愛。程…

PCH文件的創建和配置

1.PCH文件的的創建 (1)CommandN (2)打開新建文件窗口:ios->other->PCH file,創建一個pch文件 2.PCH文件的配置 (1)在工程的TARGETS里邊Building Setting中搜索Prefix Header (2)然后在Precompile Prefix Header下邊的Prefix Header右邊雙擊,添加剛…

ci 數據庫異常捕獲_系統地捕獲錯誤:如何通過4個步驟構建GitLab CI測試管道

ci 數據庫異常捕獲by Joyz通過喬伊斯 系統地捕獲錯誤:如何通過4個步驟構建GitLab CI測試管道 (Catch bugs systematically: how to build a GitLab CI testing pipeline in 4 steps) Your first app is a hit the day it’s launched. But one week later, you rea…

(小白)函數一: 聲明函數的方法—語句定義法和表達式定義法的區別

一、函數的定義: 在說明什么是函數前先舉一個小例子: 大家都知道印刷術是我國的四大發明(科普一下:中國四大發明:造紙術、印刷術、火藥、指南針)之一,之所以有印刷術,是因為重復的抄…

android限制輸入字符的范圍,Android EditText 對輸入字數和內容范圍進行限制

在做定制機時,對光敏值進行范圍控制時,以及對區號輸入時遇到對輸入字數以及輸入內容的顯示。找了好多方法,終于找到了幾種方法其中EditText的addTextChangedListener功不可沒。例如對光敏值要在0到61之間。大于61時要在輸入框中自動變為61.代…

vue13過濾器 debounce延遲、limitBy、filterBy、orderBy

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>智能社——http://www.zhinengshe.com</title><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum…

Sass:一種CSS預處理器語言

http://sass-lang.com/ Sass是一種CSS預處理器語言&#xff0c;通過編程方式生成CSS代碼。因為可編程&#xff0c;所以操控靈活性自由度高&#xff0c;方便實現一些直接編寫CSS代碼較困難的代碼。 同時&#xff0c;因為Sass是生成CSS的語言&#xff0c;所以寫出來的Sass文件是不…

Python學習(五)列表的簡單操作

#!/usr/bin/env python#_*_coding:utf8_*_# 操作列表# for循環nbaStars [yaoming,kobe,manu,23,the klaw]for nbaStar in nbaStars: print(nbaStar)nbaStars [yaoming,kobe,manu,str(23),the klaw] # 這里有 int 對象&#xff0c;沒有title方法的for nbaStar in nbaStars:…

node seneca_使用Node.js和Seneca編寫國際象棋微服務,第3部分

node senecaFinishing up a three-part series on writing a rules engine with Seneca microservices.完成有關使用Seneca微服務編寫規則引擎的三部分系列文章。 Parts 1 & 2 of this series covered:本系列的第1部分和第2部分涉及&#xff1a; The Seneca microservice…

Android開發畫布銷毀,Android DialogFragment 在頁面銷毀下的使用方式

今天看到了一篇文章,講了DialogFragment的封裝方式(Android&#xff1a;我為何要封裝DialogFragment&#xff1f;),想到當初也為頁面銷毀后DialogFragment的回調方式頭疼了好久,看到了po主的思路,與當初自己想的不太一樣,就整理一下.如何在開發中遇到頁面銷毀的情況在android開…

視覺智能產品發布 阿里云這項世界第一的技術現在人人可用

用手機拍下朋友的相片&#xff0c;軟件會自動識別進行分類并將照片發送給朋友。這不是空想&#xff0c;利用視覺智能對手機相冊進行管理、分類和分享正逐步成為現實。在6月10日舉行的云棲大會上海峰會上&#xff0c;阿里云正式發布了“圖像識別”和“人臉識別”兩款視覺智能服務…

ViewPager中Fragment的重復創建、復用問題

在ViewPager中的Fragment的生命周期 隨著頁面的切換 當前的展示頁相鄰的頁面生命周期一直在變化 一開始 剛進入Activity時候&#xff0c;ViewPager默認初始化好前兩個Fragment&#xff08;消息和任務&#xff09; 消息 ->任務 05-09 14:47:39.593 31509-31509/tyh.com.tabl…

使用VB.net建立excel文件

Add the following code snippet on top of Form1.vb Imports Excel Microsoft.Office.Interop.Excel Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim appXL As Excel.Application 聲明一個application對象Dim wbX…

沙盤演練工作坊-產品開發_Google認證的Android助理開發人員:考試演練

沙盤演練工作坊-產品開發by Rohan Taneja由Rohan Taneja Google認證的Android助理開發人員&#xff1a;考試演練 (Google Certified Associate Android Developer: Exam Walkthrough) UPDATE (24th July, 2018)更新(2018年7月24日) The certification exam is available agai…

linux hlist,linux內核V2.6.11學習筆記(2)--list和hlist

這兩個數據結構在內核中隨處可見,不得不拿出來單獨講講.這兩個數據結構都是為了方便內核開發者在使用到類似數據結構的時候不必自行開發(雖然不難),因此它們需要做到足夠的"通用性",也就是說,今天可以用它們做一個存放進程的鏈表,明天同樣可以做一個封裝定時器的鏈表…

14-angular.isDefined

判斷括號內的值是否存在。 格式&#xff1a; angular.isDefined(value); value: 被判斷是否存在的值。 返回值&#xff1a; true/false轉載于:https://www.cnblogs.com/ms-grf/p/6978886.html

實施工程師1分鐘即時演講_我是如何在1年內從時裝模特轉變為軟件工程師的

實施工程師1分鐘即時演講In 2015 I knew almost nothing about coding. Today, I’m a software engineer and a teacher at a code school for kids.在2015年&#xff0c;我對編碼幾乎一無所知。 今天&#xff0c;我是一名軟件工程師&#xff0c;還是一所代碼學校的兒童老師。…

MSSQL分組取后每一組的最新一條記錄

數據庫中二張表&#xff0c;用戶表和獎金記錄表&#xff0c;獎金記錄表中一個用戶有多條信息&#xff0c;有一個生效時間&#xff0c;現在要查詢&#xff1a; 獎金生效時間在三天前&#xff0c;每個用戶取最新一條獎金記錄&#xff0c;且用戶末鎖定 以前用的方法是直接寫在C#代…

android模擬器插件,Android模擬器插件找不到android SDK

首先&#xff0c;克隆項目詹金斯一直輸出后&#xff1a;[android] No Android SDK found; lets install it automatically...[android] Going to install required Android SDK components...[android] Installing the platform-tool,tool SDK component(s)...$ /var/lib/jenki…

讀書筆記--模板與泛型編程

了解隱式接口和編譯期多態 編譯期多態和運行期多態 運行期多態就好比是virtual函數再運行的時候才確定該virtual函數該被綁定為哪個函數&#xff0c;運行的時候才確定函數類型。  編譯期多態就好比是泛型編程和模板編程中&#xff0c;在編譯的時候才確定哪個函數該被調用&…