仮想メモリの使用方法を理解する> Linuxでのスワップ+物理


9

「トップ」に6GBの常駐メモリと70GBの仮想メモリが割り当てられていると報告しているプロセスがあります。奇妙なことに、この特定のサーバーには8 GBの物理容量と35 GBのスワップ領域しかありません。

「トップ」マニュアルから:

   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. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

この説明があれば、プロセスの仮想メモリ割り当ては、スワップと使用可能な物理メモリに制限されると予想します。

「pmap」によると、このプロセスのコード、共有ライブラリ、および共有メモリのセクションはすべて最小で、300M程度です。

明らかに、マシンとプロセスはまだ(ゆっくりではありますが)正しく機能しているので、ここで何が欠けていますか?

回答:


9

物理RAMまたはページファイルにないデマンドゼロメモリである可能性があります。

あなたが見たいかもしれないいくつかのリソース:

アプリケーションは空のメモリページをたくさん作成しますか?もしそうなら、あなたのアプリケーションは以下から大きな恩恵を受けるかもしれません:

リアルタイムのメモリページで圧縮および解凍できます。次に、ディスクにスワップするのではなく、RAMにすべてを保持できます(非常に遅い)。


はい、アプリケーションはIPV4スペースで多くの相関を実行しているため、トラフィックの分布によっては、多数の空のページが含まれる可能性があります。それには注意が必要です。ありがとう!
ベリー

喜んでお手伝いします。うまくいけば、他のユーザーが私をマークアップしてくれるでしょう。私がキラー答えを思い付くが、私は1266の定格を持つ:-(私は、私のようなサーバー障害のユーザーを考えていないhahhah。
Unixの用務員

1
人々があなたに投票しない理由はいくつかあります:1.回答のフォーマット---マークアップを使用します。2.ユーザー名が一般的です。3. 最も重要なこと:あなたがそれについてコメントするのに十分に重要であることがわかるという事実。口の中に酸味が残ります。
Belmin Fernandez

@ user37899賛成票は3つのカテゴリに分類される傾向があります。回答がどれほど有益であるか、フォーマットが適切で読みやすいか、質問がどれだけ人気があるかです。私はあなたの書式設定に取り組んでいますが、いくつかの素晴らしい答えが1つだけの賛成投票でサイトの周りにあることを理解しなければなりません-質問の人気が最も効果的な要因です。
ジェフファーランド2012年

1
いくつかのフォーマットを行いました。うまくいけば、それはへへの助けになります。
ベルミンフェルナンデス

2

ここでは、仮想メモリと常駐メモリについて説明します。

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

ここではJavaプロセスについて説明しますが、Linuxで実行されているすべてのプロセスに適用できます。virtの主なポイントは、合計には使用できないものすべてが含まれていることです。Virtは32ビットOSに注目するものです(プロセスがアドレス可能なスペースの制限に達するため)が、それ以外の場合はほとんど役に立ちません。前述のように、注意が必要なのは常駐メモリであり、使用可能な物理RAMとスワップに制限されます。


割り当てられた仮想メモリが彼の物理メモリ+スワップ領域よりも大きかった理由は、彼が実際に...尋ねた
Unixの用務員

ええ、Stackoverflowでの議論では、それがどのように可能かについて話します。
cjc 2012年

1

これは、プロセスのアドレス空間が指定したサイズである可能性が高いですが、OSによって実際には割り当てられていません。

から:http : //lwn.net/Articles/428100/

「十分なオーバーヘッドと大幅なレイテンシなし」という目標を達成しようとする過程で、Go開発者はいくつかの簡略化の仮定を行いました。その1つは、実行中のアプリケーション用に管理されているメモリは、単一の仮想的に連続していることです。アドレス範囲。そのような仮定は、エディターがviでヒットしたのと同じ問題に遭遇する可能性があります-他のコードは範囲の真ん中にピースを割り当てることができます-したがって、Go開発者は同じソリューションを採用しました:彼らは必要と思われるすべてのメモリを割り当てるだけです(彼らは考えました、合理的には、起動時にその16GBで64ビットシステムで十分です)。

つまり、メモリ管理が時々行われる不合理な方法です-連続したアドレス空間があると、未使用のメモリの解放が簡単になります。


0

答えはおそらくMMAPです。データはディスク上にありますが、それはスワップの「外側」にあり、「free」または「top」コマンドでは表示できません。

Javaプロセスが複雑すぎない場合は、「lsof」で遊んでMMAPファイルの場所を見つけることができます。ただし、このJavaプロセスが複雑な場合、見づらくなります。


-1

Linuxでは物理メモリ+スワップスペースよりも多くの仮想メモリを割り当てることができることにも驚きましたが、これは明らかに典型的な状況でのパフォーマンスに役立ちます。

幸い、メモリアカウンティングモードを切り替えるために使用できるカーネル調整パラメータがあります。このパラメーターはvm.overcommit_memoryであり、使用可能なメモリーを追跡するために使用されるアルゴリズムを示します。デフォルト(0)は、ヒューリスティックな方法を使用し、仮想メモリシステムをオーバーコミットします。プロセスをランダムに強制終了するのではなく、割り当て時にプログラムが適切なメモリ不足エラーを受け取るようにするには、このパラメーターを2に設定する必要があります。

http://www.linuxjournal.com/article/10678


これは完全に混乱しています。オーバーコミットでは、物理メモリとスワップスペースよりも多くの仮想メモリを割り当てることができません。オーバーコミットしなくてもそれを行うことができます。(たとえば、2 GBのRAM、スワップなし、オーバーコミットなしのマシンでは、4 GBの仮想メモリを使用して、4 GBのファイルを読み取り専用でメモリマップできます。)
David Schwartz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.