Goでpprofでボトルネック
Go実践でプロファイリングを始める
Go言語で開発を進める際、実際の動作を観測しながら最適化を行うことは不可欠です。プロファイリングは、CPUやメモリの使用状況を可視化し、ボトルネックを特定する手段です。まずは、標準ライブラリに含まれる net/http/pprof を使って簡単にプロファイルを取得できる環境を整えましょう。
pprofの基本操作
pprofは、Goの実行時にプロファイルデータを生成し、HTTP経由で取得できるツールです。以下のようにサーバーに http://localhost:6060/debug/pprof/ を追加すると、CPU、メモリ、goroutine などのプロファイルを確認できます。
go get net/http/pprof
import _ "net/http/pprof"
go run main.go
# さらに別ターミナルで
curl http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.pprof
go tool pprof cpu.pprof
このコマンドで30秒間のCPUプロファイルを取得し、pprofツールで解析できます。
CPUプロファイルでボトルネックを探す
CPUプロファイルは、実行時間の多い関数を可視化します。pprofの top コマンドや web コマンドを使うと、関数ごとのCPU使用率を確認できます。
go tool pprof -top cpu.pprof
go tool pprof -http=:8080 cpu.pprof
ここで、特定の関数が高い割合を占めている場合、その関数のアルゴリズムを見直すことでボトルネックを解消できます。
メモリプロファイルでリークを検出
メモリプロファイルは、ヒープ上のオブジェクトの割り当て状況を示します。pprofでメモリプロファイルを取得し、allocs や heap を解析することで、不要なオブジェクトが残っていないか確認できます。
curl http://localhost:6060/debug/pprof/heap?debug=1 > heap.pprof
go tool pprof heap.pprof
解析結果から、頻繁に生成されるが不要なオブジェクトを特定し、ガベージコレクションの負荷を減らす最適化を行います。
パフォーマンス分析と最適化のワークフロー
プロファイリングを繰り返し行い、計測結果をもとにチューニングを実施することで、Goアプリケーションのパフォーマンスを継続的に向上させることができます。以下は一般的なワークフローです。
- ベースラインを測定(CPU・メモリ)
- ボトルネックを特定(pprofでCPU/メモリ)
- コードを最適化(アルゴリズム改善、データ構造変更)
- 再測定し差分を確認
- CI/CDに組み込み、回帰テストを自動化
このサイクルを継続することで、Go実践におけるパフォーマンス分析と最適化が体系化され、安定した高性能アプリケーションを構築できます。
コメント
コメントを投稿