pprof は Go のパフォーマンス分析ツールで、プログラムの実行プロセス中に、CPU 使用率、メモリ使用量、ゴルーチンの実行ステータスなどのプログラムの実行情報を記録できます。バグの場所は必要です。場合によっては、これらの記録された情報が非常に重要になります。 pprof の使用方法は数多くあります。Go には既製の「net/http/pprof」がパッケージ化されています。数行の簡単なコマンドで、pprof を開いて実行情報を記録し、Web サービスを提供できます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
プロファイルは一般にパフォーマンス分析と呼ばれ、辞書での訳は概要 (名詞) または概要を説明する概要です。 ... 動詞)。コンピューター プログラムの場合、そのプロファイルは、CPU 占有率、メモリ、スレッド ステータス、スレッド ブロッキングなど、実行中のプログラムに関するさまざまな一般情報です。プログラムに関するこの情報がわかれば、プログラムの問題や障害の原因を簡単に特定できます。
pprof は Go のパフォーマンス分析ツールで、プログラムの実行プロセス中に、CPU 使用率、メモリ使用量、ゴルーチンの実行ステータスなどのプログラムの実行情報を記録できます。バグの場所は必要です。場合によっては、これらの記録された情報が非常に重要になります。
golang はプロファイリングを比較的よくサポートしており、標準ライブラリには「runtime/pprof」および「net/http/pprof」というプロファイル ライブラリが用意されており、開発者を支援する多くの便利なビジュアル ツールも提供されています。
オンライン サービスの場合、HTTP サーバーの場合は、pprof が提供する HTTP インターフェイスにアクセスしてパフォーマンス データを取得します。もちろん、実際には、ここでの最下層は runtime/pprof が提供する機能とも呼ばれ、外部ネットワーク アクセスを提供するインターフェイスにカプセル化されています。この記事では主に「net/http/pprof」の使用方法を紹介します。
pprof を使用するには多くの方法があります。Go にはすでに 1 つの net/http/pprof がパッケージ化されており、これは簡単に使用できます。数行のコマンドでpprofの起動、稼働情報の記録、稼働データをブラウザとコマンドラインから取得できるWebサービスを提供できます。
Web サービスでモニタリングを有効にする方法について、簡単な例を見てみましょう。
package main import ( "fmt" "net/http" _ "net/http/pprof" ) func main() { // 开启pprof,监听请求 ip := "0.0.0.0:8080" if err := http.ListenAndServe(ip, nil); err != nil { fmt.Printf("start pprof failed on %s\n", ip) } dosomething() }
「net/http/pprof」パッケージをプログラムにインポートし、リスニングポートを開きます。この時点で、プログラムのプロファイルを取得できます。実際の運用では、通常、この関数をゴルーチン。では、開封後はどうやって確認するのでしょうか? 3 つの方法があります:
ブラウザを開いて ip:port/debug/pprof と入力します。入力。
#pprof は、多くのパフォーマンス データを提供します。具体的な意味は次のとおりです。
allocs はすべてのオブジェクトのメモリ割り当て、heap はアクティブ オブジェクトのメモリ割り当てです。詳細は後述します。
1. CPU パフォーマンス分析が有効になっている場合、Go ランタイムは 10 ミリ秒ごとに一時停止して、現在実行中の goroutine のコール スタックと関連データを記録します。パフォーマンス分析データがハードディスクに保存されたら、コード内のホット スポットを分析できます。
2. メモリ パフォーマンス分析では、ヒープが割り当てられたときに呼び出しスタックを記録します。デフォルトでは、1000 割り当てごとに 1 回サンプリングされますが、この値は変更できます。スタック割り当ては随時解放されるため、メモリ分析では記録されません。メモリ分析はサンプリング手法であり、メモリの使用量ではなくメモリの割り当てを記録するためです。したがって、メモリ パフォーマンス分析ツールを使用して、プログラムの特定のメモリ使用量を正確に判断することは困難です。
3. ブロッキング分析は非常にユニークな分析で、CPU パフォーマンス分析に似ていますが、記録されるのは goroutine がリソースを待機するのに費やした時間です。ブロッキング分析は、プログラムの同時実行性のボトルネックを分析するのに非常に役立ちます。ブロッキング パフォーマンス分析では、大量のゴルーチンがブロックされていることがわかります。ブロッキング パフォーマンス分析は特殊な分析ツールであるため、CPU とメモリのボトルネックが解消されるまでは分析に使用しないでください。
もちろん、リンクをクリックすると、そのリンクは読みにくく、分析することはほとんど不可能であることがわかります。図に示すように:
ヒープをクリックして一番下までスクロールすると、興味深いデータが表示されます。トラブルシューティングに役立つ場合もありますが、一般的には使用されていない。
heap profile: 3190: 77516056 [54762: 612664248] @ heap/1048576 1: 29081600 [1: 29081600] @ 0x89368e 0x894cd9 0x8a5a9d 0x8a9b7c 0x8af578 0x8b4441 0x8b4c6d 0x8b8504 0x8b2bc3 0x45b1c1 # 0x89368d github.com/syndtr/goleveldb/leveldb/memdb.(*DB).Put+0x59d # 0x894cd8 xxxxx/storage/internal/memtable.(*MemTable).Set+0x88 # 0x8a5a9c xxxxx/storage.(*snapshotter).AppendCommitLog+0x1cc # 0x8a9b7b xxxxx/storage.(*store).Update+0x26b # 0x8af577 xxxxx/config.(*config).Update+0xa7 # 0x8b4440 xxxxx/naming.(*naming).update+0x120 # 0x8b4c6c xxxxx/naming.(*naming).instanceTimeout+0x27c # 0x8b8503 xxxxx/naming.(*naming).(xxxxx/naming.instanceTimeout)-fm+0x63 ...... # runtime.MemStats # Alloc = 2463648064 # TotalAlloc = 31707239480 # Sys = 4831318840 # Lookups = 2690464 # Mallocs = 274619648 # Frees = 262711312 # HeapAlloc = 2463648064 # HeapSys = 3877830656 # HeapIdle = 854990848 # HeapInuse = 3022839808 # HeapReleased = 0 # HeapObjects = 11908336 # Stack = 655949824 / 655949824 # MSpan = 63329432 / 72040448 # MCache = 38400 / 49152 # BuckHashSys = 1706593 # GCSys = 170819584 # OtherSys = 52922583 # NextGC = 3570699312 # PauseNs = [1052815 217503 208124 233034 ......] # NumGC = 31 # DebugGC = false
除了浏览器,Go还提供了命令行的方式,能够获取以上信息,这种方式用起来更方便。
使用命令go tool pprof url
可以获取指定的profile文件,此命令会发起http请求,然后下载数据到本地,之后进入交互式模式,就像gdb一样,可以使用命令查看运行信息,以下为使用示例:
# 下载cpu profile,默认从当前开始收集30s的cpu使用情况,需要等待30s go tool pprof http://localhost:8080/debug/pprof/profile # 30-second CPU profile go tool pprof http://localhost:8080/debug/pprof/profile?seconds=120 # wait 120s # 下载heap profile go tool pprof http://localhost:8080/debug/pprof/heap # heap profile # 下载goroutine profile go tool pprof http://localhost:8080/debug/pprof/goroutine # goroutine profile # 下载block profile go tool pprof http://localhost:8080/debug/pprof/block # goroutine blocking profile # 下载mutex profile go tool pprof http://localhost:8080/debug/pprof/mutex
接下来用一个例子来说明最常用的四个命令:web、top、list、traces
。
接下来以内存分析举例,cpu和goroutine等分析同理,读者可以自行举一反三。
首先,我们通过命令go tool pprof url
获取指定的profile/heap文件,随后自动进入命令行。如图:
第一步,我们首先输入web
命令,这时浏览器会弹出各个函数之间的调用图,以及内存的之间的关系。如图:
这个图的具体读法,可参照:中文文档 或者英文文档 这里不多赘述。只需要了解越红越大的方块,有问题的可能性就越大,代表可能占用了更多的内存,如果在cpu的图中代表消耗了更多cpu资源,以此类推。
接下来 top、list、traces
三步走可以看出很多想要的结果。
top 按指标大小列出前10个函数,比如内存是按内存占用多少,CPU是按执行时间多少。
top会列出5个统计数据:
cum%: 是累计量占总量的百分比。
这样我们可以看到到底是具体哪些函数占用了多少内存。
当然top后也可以接参数,top n
可以列出前n个函数。
list可以查看某个函数的代码,以及该函数每行代码的指标信息,如果函数名不明确,会进行模糊匹配,比如list main
会列出main.main
和runtime.main
。现在list sendToASR
试一下。
可以看到切片中增加元素时,占用了很多内存,左右2个数据分别是flat和cum。
traces 打印所有调用栈,以及调用栈的指标信息。使用方式为traces+函数名
(模糊匹配)。
在命令行之中,还有一个重要的参数 -base
,假设我们已经通过命令行得到profile1与profile2,使用go tool pprof -base profile1 profile2
,便可以以profile1为基础,得出profile2在profile1之上出现了哪些变化。通过两个时间切片的比较,我们可以清晰的了解到,两个时间节点之中发生的变化,方便我们定位问题(很重要!!!!)
打开可视化界面的方式为:go tool pprof -http=:1234 http://localhost:8080/debug/pprof/heap
其中1234是我们指定的端口
Top
该视图与前面所讲解的 top 子命令的作用和含义是一样的,因此不再赘述。
Graph
为函数调用图,不在赘述.
Peek
Top ビューと比較して、このビューには、関数の出力であるコンテキスト情報の表示が追加されています。 . 発信者/着信者。
ソース
このビューは主にソース コードの追跡と分析を追加します。そのオーバーヘッドが主にどこで消費されているかがわかります。 。
フレームグラフ
リソース消費に対応するフレームグラフ、フレームグラフの読み取り方法については割愛します。詳細はここにありますが、この記事の焦点ではありません。
2 番目のドロップダウン メニューは、図に示すとおりです。
alloc_objects、alloc_space
は、アプリケーションによって割り当てられたリソースを表します。 inuse_objects,inuse_space
は、未解放かどうかに関係なく、アプリケーションのリソース割り当て状況がまだ解放されていないことを示します。
意味 | |
---|---|
メモリの量割り当てられているがまだ解放されていない | |
割り当てられているがまだ解放されていないオブジェクトの量 | |
割り当てられたメモリの合計量 (解放されたかどうかにかかわらず) | |
割り当てられたオブジェクトの合計量 (解放されたかどうかに関係なし) |
以上がゴープロフとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。