Golang アプリケーション、特に同時実行性の高い環境、長時間実行されるサービス、またはデータ集約型タスクでは、効率的なメモリ管理が重要です。メモリ使用量のプロファイリングは、問題の診断、パフォーマンスの最適化、メモリ不足 (OOM) エラーの防止に役立ちます。このガイドでは、Go エンドポイントからメモリ使用量をプロファイリングするための包括的なアプローチを提供します。
メモリ プロファイリングは、アプリケーション内の非効率なメモリ使用量、メモリ リーク、過剰な割り当てを特定します。適切なプロファイリングを行わないと、メモリの問題によりパフォーマンスの低下、コストの上昇、サービスのダウンタイムが発生する可能性があります。
Go アプリケーションのメモリ使用量をプロファイリングするには、ランタイム プロファイリングには pprof、継続プロファイリングには parca などのツールを使用できます。これらのツールを設定して効果的に使用する方法は次のとおりです。
プロフ
メモリ、CPU、ゴルーチンなどのプロファイリングを提供する組み込みの Go ツール。
パーカ
pprof からデータを収集することでリアルタイムの洞察を提供する継続的プロファイリング ツールです。
ストレステスト
負荷を生成して実際の使用状況をシミュレートし、ストレス下でのメモリの動作を観察します。この例では、SoapUI を使用します。
pprof は組み込みツールであるため、インストールは必要ありません。アプリケーションで pprof を有効にするには、次のスニペットを含めます。
import ( _ "net/http/pprof" ) func main() { go func () { log.Print(http.ListenAndServe(":1234", nil)) }() }
これにより、ポート 1234 で pprof が公開されます。プロファイリング データにアクセスするには、http://localhost:1234/debug/pprof/ にアクセスするか、go tools pprof などのツールを使用します。
parca をインストールするには、https://github.com/parca-dev/parca を参照してください。parca を正常にインストールした後、parca.yaml を構成し、job_name.static_configs.targets を pprof と同じポート番号 (この例では 1234) に設定します
その後、コマンドを実行できます
parca --config-path="parca.yaml"
成功すると、
のようなメッセージが表示されます。
level=info name=parca ts=2024-10-30T06:19:44.5149184Z caller=factory.go:53 msg="loading bucket configuration" level=info name=parca ts=2024-10-30T06:19:44.5159183Z caller=badger.go:54 msg="Set nextTxnTs to 0" level=info name=parca ts=2024-10-30T06:19:44.517917Z caller=server.go:90 msg="starting server" addr=:7070
addr=:7070 は parca Web インターフェイスにアクセスできる場所です。ポート番号は構成によって異なる場合があります
すべてのセットアップが成功すると、Web ブラウザで parca にアクセスできます
メモリ使用量には複数のプロファイリング タイプがあり、使用できます
環境によっては異なる解決策が必要になる可能性があるため、問題が発生した場合はドキュメントを参照してください
プロファイリングの前に、ストレス テスト ツールを使用して高トラフィックをシミュレートします。ここでは SoapUI を使用します。ストレス テストは、記憶の問題につながる状況を再現するのに役立ちます。
ストレス テストが完了したら、parca ダッシュボードを使用してメモリ使用量を経時的に監視します。
グラフをクリックして詳細なプロファイルにアクセスします。
つららグラフを使用して、スタックと対応するメモリ使用量を調べます。線の幅が広いほど、メモリの消費量が多いことを示します。この視覚化は、大量のメモリを消費するプロセスを特定するのに役立ちます。
私たちのアプリケーションで、大量のメモリ使用量を伴うプロセスが特定されました:
メモリの最適化は、アプリケーションとその環境によって異なる複雑なトピックです。ここではいくつかの実践的なテクニックを紹介します:
さらなる調査の結果、キャッシュから取得したデータが大きすぎることが判明しました。このような大規模なデータセットがロジック フローに本当に必要かどうかを検証する必要がありました。
私たちの場合、この大規模なデータセットは必要ないことが判明しました。したがって、不要なデータを選択的に削除することでプロセスを最適化しました。テストを再実行した後、メモリ使用量は約 50% 減少しました。
以前の実装
不要なデータを選択的に削除した後
この方法を利用すると、メモリ使用量を簡単に絞り込んで修正できます。この場合、選択的データ読み込みがメモリ使用量を削減する正しい方法です。
メモリ プロファイリングは、Go アプリケーションのパフォーマンスと安定性を維持するための重要な実践です。 pprof や parca などのツールを活用すると、メモリの問題を特定し、リソースの使用を最適化し、さまざまな負荷の下でアプリケーションが確実に実行されるようにすることができます。定期的なプロファイリングとプロアクティブな最適化により、メモリ関連の課題に効果的に対処できます。
以上がGo でのメモリのプロファイリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。