web-dev-qa-db-ja.com

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

以下は、私のサーバーでのmysqlおよびApacheのメモリ使用量です。 pmapの出力によると、mysqlは約379Mを使用しており、Apacheは277Mを使用しています。

[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つのプロセスの現在のメモリ使用量ではありません。これは、システムの512M ramを超えた場合であり、これらが割り当てられているページのサイズであることを理解していますこれらの2つのプロセスであり、実際にそれらが使用するメモリのサイズではありません。さて、pmap -xを使用すると、余分な列Dirtyが表示され、プロセスのメモリ使用量がはるかに少なくなっています。以下の例に示すように、Dirtyの列は15Mを示していますが、最初の列は379Mです。私の質問は次のとおりです。COLUMNDirtyの下の値は、そのプロセスによってアクティブに使用されている「実際の」メモリ量ですか?そうでない場合、プロセスの実際のメモリ使用量を確認するにはどうすればよいですか?上記と同じ理由で、psおよびtopではありません。 /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 ~]#
22
Sree

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

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

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

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

pmapが表示する情報は/proc/PID/mapsおよび/proc/PID/smaps。これがプロセスの実際のメモリ使用量です。1つの数値で要約することはできません。

pmapと同じソースからのトップおよび描画情報と同様の分析を行うアプリケーションのマニュアルページに書いたものを引用します(例:/proc/[N]/maps):

仮想アドレス空間と物理メモリ

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

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

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

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

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

6
goldilocks

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

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

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

3
ctrl-alt-delor