プロセスの実際のメモリ使用量


20

サーバーのメモリ使用量mysqlapacheサーバー上のメモリ使用量は次のとおりです。pmapたとえば、出力によると、mysql約379Mを使用しており、277Mをapache使用しています。

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

これをの出力と比較するとtop、値がほぼ一致していることがわかります。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

現在、これらの値は間違いなくこれらの2つのプロセスの現在のメモリ使用量ではありません。もしそれがramシステム上の512M を超えた場合、これらの2つのプロセスに割り当てられたページのサイズであり、アクティブに使用されているメモリのサイズ。ここで、を使用すると、プロセスのメモリ使用量がはるかに少ないことを示すpmap -x余分な列Dirtyが表示されます。次の例に示すように、Dirty最初の列の379M に対して、列は15Mを示しています。私の質問は次のとおりです:coloumnの下の値Dirtyは、そのプロセスでアクティブに使用される「実際の」メモリ量ですか?そうでない場合、プロセスの実際のメモリ使用量を調べるにはどうすればよいですか?ないpstop上記と同じ理由。下に何かありますか/proc それはこの情報を提供しますか?

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#

回答:


18

プロセスの実際のメモリ使用量などはないため、「プロセスの実際のメモリ使用量」を提供するコマンドはありません。

プロセスの各メモリページは(他の違いの中でも)次のようになります。

  • そのプロセスのみが使用する一時ストレージ。
  • さまざまなメカニズムを使用して他のプロセスと共有します。
  • ディスクファイルによってバックアップされます。
  • 物理メモリまたはスワップ内。

「汚い」図は、RAMにある(スワップではない)ファイルに裏打ちされていないすべてのものを合計すると思います。これには、共有メモリと非共有メモリの両方が含まれます(ただし、フォークサーバー以外のほとんどの場合、共有メモリはメモリマップファイルのみで構成されます)。

で表示される情報はpmapから来ていると。これがプロセスの実際のメモリ使用量です。1つの数字で要約することはできません。/proc/PID/maps/proc/PID/smaps


6

topと同様の分析を行うアプリケーションのmanページで書いたものを引用し、同じソースからの情報を描画しますpmap(例/proc/[N]/maps):

仮想アドレススペースVS. 物理メモリ

上記の統計の一部を解釈する際には、仮想アドレス空間物理メモリの違いを理解することが重要です。名前が示すように、仮想アドレス空間は現実的ではありません。基本的には、現在プロセスに割り当てられているすべてのメモリのマップです。このマップのサイズの制限は各プロセスで同じであり(通常、2〜4 GB)、累積されません(つまり、それぞれ独自の2〜4 GBの仮想アドレスを持つ数十または数百のプロセスがある場合があります)実際には512 MBの物理メモリしかないシステム上のスペース)。

データを実際に保存したり、仮想アドレス空間から取得したりすることはできません。実データには実物理メモリが必要です。あるものを別のものに関連して管理するのはカーネルの仕事です。仮想空間の統計(VirtualSz、Data + Stack、およびPriv&Write)は、プロセスの構造と物理メモリの使用との関係を検討するのに役立ちますが、実際に使用されるRAMの量に関しては、物理メモリの統計(ResidentSz、Share、割合)が重要です。

pmap仮想アドレススペースに関する情報を主に報告しています。top出力の「値がほぼ一致する」という観察結果は、おそらくRESの数値とは非常に異なるVIRTの数値を示しています。これらは、上記で「VirtualSz」および「ResidentSz」とラベル付けしたものに正確に対応しています(VIRTは仮想用、RESは常駐用です)。

さて、pmap -xを使用すると、プロセスのメモリ使用量がはるかに少ない余分な大量のダーティが表示されます。以下の例に見られるように、ダーティコロンは最初のコロンの379Mに対して15Mを示しています。私の質問は次のとおりです:coloumn Dirtyの下の値は、そのプロセスでアクティブに使用される「実際の」メモリ量ですか?

いいえ、しかしある種の。「ダーティ」メモリとは、ディスクからロードされ、その後変更されたデータを指します。変更されているため、これらの変更は現在RAMに格納されているため、常駐メモリの一部である必要があります。ただし、同義語ではありません。


同意する。ただし、2〜4GBは32ビットシステム用です。最近のほとんどのシステムはおそらく64ビットです。
ctrl-alt-delor

3

仮想メモリはスピードダイヤル番号に似ていますが、約30億またはそれら(32ビットシステムの場合、64ビットカーネルの32ビットアプリの場合は40億、64ビットアプリケーションの場合はさらに多く)があり、直接ダイヤルすることはできません。短縮ダイヤルにマッピングされます。

複数のプロセスが、同じアドレス(電話番号)に対して異なるマッピング(スピードダイヤル番号)を持つことができます。たとえば、複数のライブラリを共有する場合があるため、ライブラリ全体の仮想アドレスがあります(pmapで確認できます)。2つのインスタンスのbashなど、同じ実行可能ファイルを共有することもあります。

これまでのところ、これはすべての仮想アドレスのサブがどのように適合することができるかを説明していますが、もっとあります。1つのプロセスが、収まらないほど多くの仮想メモリを持つことができます。ライブラリまたは実行可能ファイルの一部は使用されない場合があり、ディスクからRAMにコピーされないか、RAMがいっぱいになり、ディスクからロードされた部分が削除されます。必要に応じてディスクから再取得できるためです。または、バックアップされていないメモリがスワップにマップされ、スワップにコピーされてからドロップされます。その後、必要に応じて、スワップから読み取ることができます。これらの後者の戦略のいずれかが多すぎる場合、システムは遅くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.