Go Extend アプリでのメモリ不足(OOM)エラーのトラブルシューティング
注釈:本資料はAI技術を用いて翻訳されています。
Overview
この記事では、効率的なメモリ管理のベストプラクティスと、メモリおよび CPU のプロファイリング作業を効率化するために pprof を使用する手順について説明します。
メモリ管理のベストプラクティス
Go では、メモリの不適切な使用によりメモリリークが発生することがあります。効率的なメモリ管理と適切なリソースのクリーンアップのために、以下のベストプラクティスを推奨します。
- グローバル変数を避ける。
defer文を使用する。- チャネルを適切にクローズする。
Goroutinesを正しく処理する。- メモリ使用量を監視する。
- コンテキストを使用して
Goroutinesを管理する。
メモリおよび CPU プロファイリングに pprof を使用する
Go で最も一般的に使用されるプロファイリング手法は、pprof と runtime パッケージです。Go アプリケーションで pprof を使用してメモリおよび CPU のプロファイリングを行うと、特に Kubernetes 環境において、メモリ不足(OOM)の問題を特定して解決する際に大いに役立ちます。
pprof のインストール
この pprof パッケージは、Extend の Go アプリケーションの main.go ファイルにデフォルトで実装されています。
import (
_ "net/http/pprof"
"runtime"
...
)
func main() {
go func () {
runtime.SetBlockProfileRate(1)
runtime.SetMutexProfileFraction(10)
}()
logrus.Infof("starting app server..")
// The rest of the program's logic
}
その後、Web ブラウザで http://localhost:8080/debug/pprof/ の UI を確認できます。
メモリプロファイリング
メモリプロファイリングは、Go プログラムのメモリ消費量を理解し、最適化するのに役立ちます。
以下のコマンドを使用してメモリプロファイルを生成します。
go tool pprof "http://localhost:8080/debug/pprof/heap?seconds=30"
または
go tool pprof -png http://localhost:8080/debug/pprof/heap > heap.png
heap.png ファイルには、アプリケーション内の inuse_space プロファイリングのノードグラフが表示されます。
CPU プロファイリング
CPU プロファイリングは主に実行時間の観点からパフォーマンスのボトルネックを特定することに重点を置いていますが、コードを最適化することで間接的にメモリ使用量の管理にも役立ちます。
以下のコマンドを使用して CPU プロファイルを生成します。
go tool pprof "http://localhost:8080/debug/pprof/profile?seconds=30"
または
go tool pprof -png http://localhost:8080/debug/pprof/profile > profile.png
profile.png ファイルには、アプリケーション内の CPU プロファイリングのノードグラフが表示されます。