プロファイリングの概要
プロファイリングは実行時データを大量に扱い、プロセス内部の状況を俯瞰的に把握できる実行時解析の一種です。 収集されたデータは、プログラムのさまざまな動作に関する CPU 使用率、メモリの割り当て、スレッドの活動状況などに関連しています。
プロファイリングは、メモリスナップショットの取得のような瞬時のものや、長時間にわたるものがあります。 例えば、CPU プロファイラーはプログラムの稼働中、数時間や数日といった長期間のデータを収集することができます。
プロファイリングが役立つのはいつですか?
プロファイリングツールは次のことに役立ちます。
バグやボトルネックの特定、およびパフォーマンス低下の診断
ホットスポットや最適化の機会を特定し、パフォーマンス問題に直接関連しない場合もあります
異なるソリューションのパフォーマンスを評価または比較する
プログラム内部の動作をより深く理解する
利用可能なプロファイラー
GoLand は runtime/pprof パッケージに含まれる組み込みプロファイラーを使用します。 各プロファイラーは特定の種類のパフォーマンスデータを収集します。

CPU プロファイラーは、プログラムが CPU を使用している間にどこで時間を消費しているかを表示します。
このプロファイラーは、I/O や同期待ちではなく、実際に処理を行う関数を特定するのに役立ちます。
ヒープ プロファイラーはメモリ使用量をレポートします。
割り当てられたメモリと、まだ使用中のメモリを表示します。 割り当てとはメモリ予約のリクエストであり、例えばスライスや構造体を作成するときに発生します。 このプロファイラーを使って高いメモリ使用量やメモリリークを検出できます。
Allocs プロファイラーは、時間の経過とともにすべてのメモリの割り当てをレポートします。
短命なものであっても、多くのオブジェクトを作成しているコードを特定するのに役立ちます。
ゴルーチン プロファイラーは、すべての現行ゴルーチンのスタックトレースを表示します。
ゴルーチンは Go ランタイムが管理する軽量スレッドです。 このプロファイラーを利用して並行性を理解し、停止または予期せぬゴルーチンを検出します。
ブロック プロファイラーは、ゴルーチンがどこで待機しているかを表示します。
ブロッキング操作は、条件が満たされるまで実行を一時停止します。 例えば、ゴルーチンはチャネルやロック、I/O を待つことがあります。 このプロファイラーは同期による遅延を特定するのに役立ちます。
Mutex プロファイラーはロックの競合を表示します。
ミューテックスは共有データを保護するためのロックです。 複数のゴルーチンが同時に同じロックを獲得しようとすると、競合が発生します。 このプロファイラーはロックによる遅延を特定するのに役立ちます。
Threadcreate プロファイラーは、プログラムが OS スレッドを作成する場所を表示します。
このプロファイラーを用いて過剰なスレッド作成を検出し、ランタイムがどのようにワークをスケジューリングしているかを把握します。
Go プロファイラーの構成
Go プロファイラーの設定は IDE 設定で行います。 設定は、プロファイルの保存先とプロファイラーがデータを収集する頻度を定義します。
アプリケーションのプロファイリング設定
Ctrl+Alt+S を押して設定を開き、 に移動します。
グローバルなプロファイリングパラメーターを構成します:
デフォルトのプロファイリングディレクトリ は、IDE がキャプチャしたプロファイルの保存先を定義します。
メモリプロファイリングレート は、プロファイラーがメモリの割り当てをサンプリングする頻度を定義します。
値は、記録された割り当て間の平均バイト数を示します。 値を下げると詳細度とオーバーヘッドが増加します。 デフォルト値は 512 KB です。
ブロックプロファイリングレート は、プロファイラーがブロッキングイベントを記録する頻度を定義します。
値はナノ秒単位で測定されます。 より多くのイベントを記録するには、値を小さく設定します。
ミューテックスプロファイリング割合 は、プロファイラーが記録するミューテックス競合イベントの件数を定義します。
値はサンプリング比率を制御します。 例えば、値 10 はプロファイラーが 10 件中 1 件のイベントを記録することを意味します。
テストのプロファイリング設定
Ctrl+Alt+S を押して設定を開き、 に移動します。
テスト実行用のプロファイラーを構成します:
CPU プロファイラー はテスト実行中の CPU 使用率を記録します。
メモリプロファイラ はメモリの割り当てを記録します。
プロファイリングレート を使って、プロファイラーが割り当てをサンプリングする頻度を定義します。 すべての割り当てを記録するには、値を
1に設定してください。 デフォルト値(512 KB)を使用するには、フィールドを空白のままにします。ブロッキングプロファイラー はブロッキングイベントを記録します。
ブロッキングイベントは、ゴルーチンがチャネルやロック、I/O などのリソースを待機する際に発生します。
プロファイリングレート を使い、プロファイラーがブロッキングイベントをサンプリングする頻度を定義します。 すべてのイベントを記録するには、値を
1に設定してください。ミューテックスプロファイラー はミューテックス競合を記録します。
ミューテックス競合は、複数のゴルーチンが同じロックを取得しようとしたときに発生します。
プロファイリング割合 を使用して、プロファイラーがどの割合でイベントを記録するかを定義します。 例えば、値 10 はプロファイラーが 10 件中 1 件のイベントを記録することを意味します。
プロファイリングの仕組み
GoLand は標準の Go pprof ツールを使ってプロファイリングデータを収集します。
プロファイリングを開始すると、IDE はアプリケーションを一時的なオーバーレイでビルドします。 オーバーレイはソースファイルを変更せずに、ビルドにプロファイリングフックを注入します。
IDE は次のようなコマンドを実行します:
オーバーレイファイルはプロファイリングを有効化する一時的な変更を定義します。 GoLand は実行完了後にこれらの変更を削除します。