ホームページ  >  記事  >  バックエンド開発  >  ジンゴニックウェブサーバーのメモリリーク?

ジンゴニックウェブサーバーのメモリリーク?

PHPz
PHPz転載
2024-02-08 21:51:08571ブラウズ

Gin Gonic 网络服务器内存泄漏?

php エディター Baicao は、Gin Gonic Web サーバーの使用時にメモリ リークの問題が発生する可能性があることを発見しました。メモリ リークは、プログラムがメモリ リソースを過剰に占有する原因となり、最終的にシステムの安定性とパフォーマンスに影響を与える一般的なバグです。開発者にとって、メモリ リークをタイムリーに検出して解決することは非常に重要です。この記事では、Gin Gonic ネットワーク サーバーのメモリ リークの原因と解決策を探り、開発者がコードを最適化し、システム パフォーマンスを向上できるようにします。

質問内容

説明

gin-gonic/gin Web サーバーで潜在的なメモリ リークが発生しました。シンプルな /health_check エンドポイントを作成して問題を再現しようとしました。エンドポイント /health_check は毎秒ヒットします。この問題により、使用可能なポッド メモリが使い果たされると、メモリ不足 (OOM) 状態が発生します。ポッド内で実行されている他のコンテナはありません。

問題を理解するために、pprof メトリクスと prometheus メトリクスも公開しましたが、何も見つかりませんでした。同じ問題を報告している他の問題がリストされていないため、誰かが問題の切り分けを手伝ってくれることを期待しています。

ヒープ メモリやスタック メモリの増加は見られませんが、プロセス メモリは増加し続けています。 RSS を使用して増加を確認し、pmap を使用して対応するメモリ ブロックを確認できますが、メモリがクリアされない理由や、割り当てられたメモリが何に使用されているかを追跡することはできません。

再現方法

関連するエンドポイントを含む簡単なコード例:

リーリー リーリー

ビルドコマンド:

リーリー

ポッドのリソース制限:

  1. 64MiBメモリ
  2. 1 CPU
###期待する###

メモリ使用量が一定に保たれることを期待しています。多少の変動は許容されますが、メモリ使用量がほぼ一定に保たれ、メモリ不足にならないことが望ましいです。

###実績###

OOM による約 90 分間のメモリ増加により、ポッドがクラッシュしました。以下のグラフの各スパイクは、OOM によるポッドの再起動を表しています。

コルーチン

リーリー ###環境###

Go バージョン: go1.21.1 linux/amd64

ドッカー イメージ: 1.21.1-bullseye

gin バージョン (またはコミット参照): github.com/gin-gonic/gin v1.9.1
  • オペレーティング システム: Debian GNU/Linux 11 (ブルズアイ)
  • GOGC=10;GOMEMLIMIT=64MiB (デフォルトを使用しても試しましたが、結果は同じでした)
  • ご支援やご指導をいただければ幸いです。
  • 解決策
  • そこで、メモリが増加する場所を見つけるためにいくつかの実験を行いました。

-race

ビルド フラグを使用せずにテストしてみましたが、メモリは問題ないようです。アイドル状態のサーバーでは一貫して増加しているようには見えません (liveness、readiness プローブ、およびメトリクス エンドポイントのみが利用可能です)。

なぜこれが起こっているのか、あるいはこれが予期されているのかどうかは完全にはわかりませんが、より深く調査し、運用環境のデプロイメントから一時的にフラグを削除しました。

このフラグを削除した後のメモリ傾向を共有します (ビルド コマンドは go build)。ピークは、100 万のリクエスト (一度に 100 件の並列) をトリガーして実行している負荷テストです。

Pod のメモリ使用量は次のとおりです。

以下は RSS です。

ヒープとスタックのメモリ使用量は次のとおりです。

PS: 現時点ではこれを回答としてマークしていますが、自由に修正してください。私はまだ golang に慣れていないので、皆さんの貢献に感謝します。この結果に反するものが見つかった場合は、この回答を更新/削除します。ありがとうございます。

以上がジンゴニックウェブサーバーのメモリリーク?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。