以下は、私のサーバーでの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 ~]#
プロセスの実際のメモリ使用量などはないであるため、「プロセスの実際のメモリ使用量」を示すコマンドはありません。
プロセスの各メモリページは、(他の違いの中で)次のようになります。
「汚い」数字は、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に格納されているため、常駐メモリの一部である必要があります。ただし、同義ではありません。
仮想メモリはスピードダイヤル番号に似ていますが、約30億またはそれら(32ビットシステムの場合、64ビットカーネルの32ビットアプリの場合40億、64ビットアプリケーションの場合はさらに多く)があり、直接ダイヤルすることはできません。スピードダイヤルにマッピングされます。
いくつかのプロセスは、同じアドレス(電話番号)に対して異なるマッピング(スピードダイヤル番号)を持つことができます。たとえば、複数のライブラリを共有している可能性があるため、ライブラリ全体の仮想アドレスを持っています(pmapで確認できます)。それらは同じ実行ファイルを共有することさえできます。 bashの2つのインスタンス。
これまでのところ、これはすべての仮想アドレスのサブがどのように適合するかを説明していますが、それ以上のものがあります。 1つのプロセスが仮想メモリを大量に保有しているため、収まらないはずです。ライブラリの一部、または実行可能ファイルが使用されない、ディスクからramにコピーされない、またはramがいっぱいになり、ディスクからロードされた部分が削除される、必要に応じてディスクから再フェッチできるため、または、私のディスクがバッキングされていないメモリがスワップにマップされ、スワップにコピーされてからドロップされます。その後、必要に応じてスワップから読み取ることができます。これらの後者の戦略のいずれかが多すぎると、システムが遅くなります。