サーバーのパフォーマンスを監視するためにtop
を実行していますが、2つのJavaプロセスは最大800MB-1GBの仮想メモリを表示します。それは悪いことですか?
仮想メモリとはどういう意味ですか?
そして、ああ、私は1GBのスワップを持っていて、それは0%の使用を示しています。だから私は混乱しています。
Javaプロセス= 1 Tomcatサーバー+自分のJavaデーモンサーバー= Ubuntu 9.10(karmic)
仮想メモリは必ずしもメモリである必要はありません。たとえば、プロセスが大きなファイルをメモリマップする場合、ファイルは実際にはディスクに格納されますが、プロセスで「アドレススペース」を占有します。
アドレス空間(つまり、プロセスリスト内の仮想メモリ)のコストはかかりません。それは本当ではない。実在するのは、常駐メモリであるRSS(RES)列です。これが、プロセスが実際に使用しているメモリの量です。
しかし、それでもすべてではありません。プロセスがfork()を呼び出すと、2つの部分に分割され、両方とも最初はすべてのRSSを共有します。したがって、RSSが最初は1 GBだったとしても、フォーク後の結果は2つのプロセスになり、それぞれのRSSは1 GBになりますが、それでも1 GBのメモリしか使用しません。
まだ混乱していますか?本当に知っておくべきことは次のとおりです。free
コマンドを使用して、プログラムの開始前と開始後に結果を確認します(+/- buffers/cache
行)。その違いは、新しく起動したプログラムが使用したnewメモリの量です。
Top(1)のマニュアルページから:
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It
includes all code, data and shared libraries plus pages that
have been swapped out.
VIRT = SWAP + RES.
ここで、RESは常駐メモリ(使用される物理メモリ)を意味します。
実際にはそれは正しくありません(もう)。 「スワップ」と表示されている場合は、プログラムがそのアドレス空間にマップしたファイルも含まれます。実際には、実際に消費している場合と消費していない場合がありますRAM。このメモリはファイルによってバックアップされますが、本当に交換しないでください。
VIRTには、割り当てられているがまだ何も使用されていないページも含まれます。この状態のページは、カーネルのゼロページ(見事な概念-調べる必要があります)にマップされるため、VIRTに表示されますが、実際にはメモリを消費しません。
私はこれを発見しました Mugurel Sumanariuからの説明 非常に明確です:
VIRT
は、プロセスの仮想サイズを表します。これは、プロセスが実際に使用しているメモリの合計です。たとえば、ビデオカードのRAM Xサーバー)、それにマップされたディスク上のファイル(特に共有ライブラリ)、および他のプロセスと共有されるメモリVIRTは、プログラムが現時点でアクセスできるメモリの量を表します。
RES
は常駐サイズを表します。これは、プロセスが消費している実際の物理メモリの量を正確に表しています。 (これも%MEM列に直接対応します。)ほとんどのプログラムはCライブラリに依存しているため、これは事実上常にVIRTサイズよりも小さくなります。
SHR
は、VIRTサイズのうち実際に共有可能な量(メモリまたはライブラリ)を示します。ライブラリの場合、ライブラリ全体が常駐しているとは限りません。たとえば、プログラムがライブラリ内のいくつかの関数のみを使用する場合、ライブラリ全体がマップされ、VIRTおよびSHRでカウントされますが、実際に使用されている関数を含むライブラリファイルの部分のみが読み込まれ、カウントされますRESの下で。
Ps/top出力のVIRT列は、メモリ使用量の測定にはほとんど関係ありません。心配しないでください。 Apacheの高負荷VIRTとRESメモリ
上部のVIRtual
列は、プロセスのスーパースペース(スーパー消費スペース)を示します。これは、プロセスが実行時に実際に使用していない可能性があります。別の列RESident
があります。これは、実行時にプロセスによって割り当てられた実際の物理メモリ/スペースを示します。
2つの違いの理由は、例で理解できます。プロセスが特定のライブラリを使用している場合、ライブラリのサイズもvirtual-size
に役立ちます。ただし、ライブラリの一部のみが使用されるため(つまり、いくつかのメソッドが使用されているため)、resident-size
が役立ちます。
参照してください 詳細
Linuxは仮想メモリをサポートします。つまり、ディスクをRAMの拡張として使用して、使用可能なメモリの有効サイズがそれに応じて大きくなるようにします。カーネルは、現在使用されていないメモリブロックの内容をハードディスクを使用して、メモリを別の目的に使用できるようにします。元のコンテンツが再び必要になると、それらはメモリに再度読み込まれます。これはすべて、ユーザーに対して完全に透過的です。Linuxで実行されるプログラムは、より多くのメモリしか認識しません利用可能であり、その一部がディスク上に常駐していることに気付かない場合があります。もちろん、ハードディスクの読み取りと書き込みは、実際のメモリを使用する場合よりも遅い(1000倍程度遅い)ので、プログラムはt高速で実行:仮想メモリとして使用されるハードディスクの部分は、スワップスペースと呼ばれます。
Linuxは、ファイルシステム内の通常のファイル、またはスワップ領域用の別のパーティションを使用できます。スワップパーティションの方が高速ですが、スワップファイルのサイズを変更する方が簡単です(ハードディスク全体を再パーティション化する必要はなく、すべてを最初からインストールする必要はありません)。必要なスワップ領域がわかっている場合は、スワップパーティションに移動する必要がありますが、不確かな場合は、最初にスワップファイルを使用し、しばらくの間システムを使用して、スワップの量を確認できます。サイズに自信がある場合は、必要に応じてスワップパーティションを作成します。
Linuxでは、複数のスワップパーティションやスワップファイルを同時に使用できることも知っておく必要があります。これは、たまに異常な量のスワップ領域しか必要としない場合、常に割り当てられた容量全体を維持するのではなく、そのようなときに追加のスワップファイルを設定できることを意味します。
オペレーティングシステムの用語に関する注意:コンピュータサイエンスでは、通常、スワッピング(プロセス全体をスワップスペースに書き出す)とページング(一度に固定サイズのパーツのみ(通常は数キロバイト)のみを書き込む)を区別します。通常、ページングの方が効率的です。これがLinuxの機能ですが、従来のLinux用語ではとにかくスワッピングについて説明しています。
「VIRT」はアドレス空間にすぎず、RESは「実際の」メモリですが、「SHR」(=共有)の「RES」の量は、他のプロセスと共有されるRESの一部です。したがって、ほとんどのプロセスでは、RESからSHRを引くことで、この特定のプロセスに本当に起因するメモリ量が得られると思います。