php エディター Baicao は、Gin Gonic Web サーバーの使用時にメモリ リークの問題が発生する可能性があることを発見しました。メモリ リークは、プログラムがメモリ リソースを過剰に占有する原因となり、最終的にシステムの安定性とパフォーマンスに影響を与える一般的なバグです。開発者にとって、メモリ リークをタイムリーに検出して解決することは非常に重要です。この記事では、Gin Gonic ネットワーク サーバーのメモリ リークの原因と解決策を探り、開発者がコードを最適化し、システム パフォーマンスを向上できるようにします。
gin-gonic/gin Web サーバーで潜在的なメモリ リークが発生しました。シンプルな /health_check エンドポイントを作成して問題を再現しようとしました。エンドポイント /health_check は毎秒ヒットします。この問題により、使用可能なポッド メモリが使い果たされると、メモリ不足 (OOM) 状態が発生します。ポッド内で実行されている他のコンテナはありません。
問題を理解するために、pprof メトリクスと prometheus メトリクスも公開しましたが、何も見つかりませんでした。同じ問題を報告している他の問題がリストされていないため、誰かが問題の切り分けを手伝ってくれることを期待しています。
ヒープ メモリやスタック メモリの増加は見られませんが、プロセス メモリは増加し続けています。 RSS を使用して増加を確認し、pmap を使用して対応するメモリ ブロックを確認できますが、メモリがクリアされない理由や、割り当てられたメモリが何に使用されているかを追跡することはできません。
関連するエンドポイントを含む簡単なコード例:
リーリー リーリービルドコマンド:
リーリーポッドのリソース制限:
OOM による約 90 分間のメモリ増加により、ポッドがクラッシュしました。以下のグラフの各スパイクは、OOM によるポッドの再起動を表しています。
Go バージョン: go1.21.1 linux/amd64
ドッカー イメージ: 1.21.1-bullseye
なぜこれが起こっているのか、あるいはこれが予期されているのかどうかは完全にはわかりませんが、より深く調査し、運用環境のデプロイメントから一時的にフラグを削除しました。
このフラグを削除した後のメモリ傾向を共有します (ビルド コマンドは go build
)。ピークは、100 万のリクエスト (一度に 100 件の並列) をトリガーして実行している負荷テストです。
Pod のメモリ使用量は次のとおりです。
以下は RSS です。
PS: 現時点ではこれを回答としてマークしていますが、自由に修正してください。私はまだ golang に慣れていないので、皆さんの貢献に感謝します。この結果に反するものが見つかった場合は、この回答を更新/削除します。ありがとうございます。
以上がジンゴニックウェブサーバーのメモリリーク?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。