Debian Wheezy Mono-Sgen 2.10.8.1-8 組み込みアプリケーションのメモリ リークかどうかを判断するのに苦労しています。システムには 512MB の RAM があります。スワップは無効です。私は、Linux がプロセス メモリをどのように管理しているかを理解しようと研究しており、実際に Mono-Sgen のどこかでメモリ リークが発生しているかどうかを結論付けています。何週間にもわたる一定の実行時間の後に何度もプロファイリングしており、GC メモリは常にアプリケーションのベースラインに戻っているため、これが私のアプリケーションではないことは間違いありません。私のアプリケーションの観点からは、オブジェクトがリークしていません。これは、Mono-Sgen が内部的にリークしていないという意味ではありませんが、私はこれを特定していませんし、そうではない可能性もあります。
大きなヒープの mono のデフォルトは 512MB であるため、Mono-Sgen ヒープの上限を設定しようとしましたが、これが私のシステムのすべてであるため、Linux からの OOM を防ぐために上限を設定する必要があると想定しました。Mono-Sgen の構成は次のとおりです。
export MONO_GC_PARAMS=major=marksweep-fixed,major-heap-size=32m,nursery-size=4m,evacuation-threshold=75
私の理解では、32MB 固定サイズのマーク アンド スイープ固定メジャー ヒープを使用しています。デフォルトのナーサリ サイズは 4MB であり、メジャー ヒープ割り当てバケットのいずれかが 75 を下回った場合、Mono-Sgen はメジャー ヒープでコピー コレクションを実行します。断片化を防ぐために使用される %。デフォルトの 66% を上げました。
停電によりリセットが発生してから、私のデバイスは現在 6 日強稼働しています。アプリケーションが最初に起動するとき、完全に初期化されるまで約 10 分待ってから、/proc/PID/status ファイルのスナップショットを撮り、メモリ使用量のベースラインを取得します。今日、私は別のスナップ ショップを利用して現在の状況を確認しました。いつものように、Mono-Sgen プロセスのこのインスタンスの仮想、常駐、およびデータが再び増加しました。初期化中に発生した最高水位標をまだ破っていませんが、前回このテストを行ったときは破っていました。私ができなかったことと、達成しようとしているのは、システムのすべての物理メモリを使い果たすまで実行させることです。これが実際にメモリ リークなのか、それともある時点で Linux が私のプロセスが割り当てたページの一部を再利用するのかを知る必要があります。
私が気づいたことの 1 つは、スワップがないことを知っていても、Mono-Sgen プロセスの常駐サイズが常にデータ数より約 30MB 少ないことです。私が理解していることから、データ数はヒープ割り当ての量であり、常駐サイズは実際に物理メモリにあるものであり、仮想は割り当てられたものであり、必ずしも使用されるわけではありません。
私の推測では、Linux は単に Linux であり、必要な場合を除き、時間やメモリを無駄にすることはありません。システムの負荷が非常に軽いため、Linux はメモリを再利用するために何かを行うメモリ プレッシャーがなく、Mono-Sgen がヒープの割り当てと拡大を続けないようにするためだと思います。実際のメモリ プレッシャーがある場合、Linux は実際には使用されていないページに足を踏み入れて再利用します。
以前に割り当てられたメモリで free が呼び出された場合、Linux はプロセスの割り当てられたメモリ サイズを縮小しないことを読みました。LinuxがLinuxでない限り、必要な場合にのみ実行する理由がわかりません。しかし、私の恐れは、これが起こるまでどれだけ待つ必要があるかということです.
これはメモリ リークですか? それとも、メモリ プレッシャーが発生し始めたときに、このプロセスの常駐サイズとデータ サイズの間で見られるページの違いを Linux が再利用しますか? この件について手に入れることができるすべてのものを検索して読みましたが、探している答えが見つからず、OOMキラーが原因でアプリケーションがバウンスするかどうかを確認するのに1か月も待ちたくありません. とにかくします:)しかし、事前に知りたいです。
私は Mono-Sgen 2.10.8.1-8 で潜在的なメモリ リークを調査しましたが、私がやっていること (ネイティブ Linux アプリケーションへの多数の process.start() 呼び出しを使用) については、私を傷つけるタイプのバグのほとんどを調べました。このリリースにはありません。Jessie の Mono-Sgen バージョン (3.2.8 だと思います) に更新しようとしましたが、システムがクラッシュしていたので、未知の恐怖から安定した Mono-Sgen 2.10.8.1-8 バージョンに戻しました。
/proc/PID/status によって返される内容に注目して、典型的なメモリ情報のスナップショットを多数添付しています。
いつものように、どんな情報でも大歓迎です。Linux が負荷の軽いシステムでメモリを再利用する方法を理解していないことを願っています。