web-dev-qa-db-ja.com

Linuxでメモリ使用量はどのように報告されますか?

Psを使用すると、サイズ、vsize(トップのVIRTと同じ?)、およびrss(トップのRES?と同じ)を確認できます。 (上に表示されるもう1つはSHRです。)

これらのさまざまなフィールドの意味を誰かが要約してくれませんか?

17
Jim Hunziker

要するに:

  • 仮想サイズ:は、プロセスが管理しているアドレス空間の量です。仮想アドレス空間には、プロセスがポインタ(メモリアドレス参照)を介してアクセスできるすべてのものが含まれています。たとえば、プログラムがビデオカードのフレームバッファーにアクセスする場合、そのメモリはプロセスの仮想空間にマップされ、ポインターに格納されているアドレスを受け取ります。メモリマップファイルと匿名マッピングも仮想アドレススペースサイズに含まれます。ほとんどすべてが仮想サイズです。 /proc/<pid>/mapsにリストされているすべてのアドレス範囲のサイズを合計すると、仮想サイズとほぼ同じ値が返されます。

  • 常駐サイズ:は、現在メモリに常駐しているそのプロセスに特に属しているメモリの量です。つまり、スワップされていないメモリの量です。プロセスの実行中であっても、プロセスの一部がスワップメモリ​​にある可能性があることに注意してください。オペレーティングシステムは、プロセスがスワップにアクセスしようとすると、これらの領域をスワップからプルします。これには、ヒープ、すべてのスレッドのスタック、およびその他のプライベートマッピングが含まれます。 /proc/<pid>/mapsを調べると、[stack][heap]およびその他の匿名マッピング(ファイルパスのないもの)が交換されるか、常駐サイズで計算されます。

  • 共有サイズ:は、複数のプロセスに属するメモリの量です。たとえば、同じアプリケーションの4つのインスタンスがメモリに読み込まれている場合、ヒープの4つのインスタンスと少なくとも4つのスタックがあり、各プロセスに1つ(これは常駐メモリです)ですが、プログラムとそのライブラリのバイナリコード。共有スペースです。プログラムのバイナリコードとそのライブラリだけでなく、ローカリゼーションファイル、読み取り専用プログラムデータ、SysVおよびPOSIX共有メモリセグメント、セマフォなども含まれます。/proc/<pid>/mapsを見ると、ほとんどのマッピングがライブラリとプログラムファイルが共有されます。

VIRTにはRSSとSHRの結合が含まれており、常にそれらのどれよりも大きいことに注意してください。 RSSとSHRの両方として扱われるリージョンがある場合があります。

35
Juliano

ジュリアーノの答え:

常にRSS + SHR <= VIRTであることに注意してください。

これは間違っています。 SHRには他のプロセスと共有できるすべての仮想メモリが含まれ、RSSにはすべてのメモリが物理的にRAMプロセスで使用される)に含まれます。

したがって、現在RAMにあるすべての共有メモリは、SHRとRSSの両方でカウントされるため、SHR + RSSは重複カウントを含む可能性があるため、意味がありません。

RSS + SHR> VIRTでプロセスを構築するには、大きなファイル(1GB)をmmapし、それを完全に読み取ります。mmapedファイルはRAMにロードされ、VIRT、SHR、RSSはそれぞれ1GBよりも少し大きいため、SHR + RSS> VIRT。

6
Anonymous