Go Extend アプリでのメモリ不足(OOM)エラーのトラブルシューティング
注釈:本資料はAI技術を用いて翻訳されています。
概要
この記事では、効率的なメモリ管理のベストプラクティスと、[pprof](https://pkg.go.dev/net/http/pprof) を使用してメモリおよび CPU プロファイリングプロセスを効率化する手順を説明します。
メモリ管理のベストプラクティス
Go におけるメモリリークは、メモリの不適切な使用によって発生する可能性があります。効率的なメモリ管理と適切なリソースクリーンアップのために、以下のベストプラクティスを推奨します。
- グローバル変数を避ける。
deferステートメントを使用する。- チャネルを適切にクローズする。
Goroutinesを正しく処理する。- メモリ使用量を監視する。
- コンテキストを使用して
Goroutinesを管理する。
メモリおよび CPU プロファイリングに pprof を使用する
Go では、最も一般的に使用されるプロファイリングは pprof と runtime パッケージです。Go アプリケーションでメモリおよび CPU プロファイリングに pprof を使用することは、特に 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 プロファイリングのノードグラフが表示されます。