物理メモリ使用量の処理

物理メモリ使用量の処理

以下は、私のサーバーの各mysqlメモリ使用量です。apache出力によると、pmapmysql379Mが使用されており、apache277Mが使用されています。

[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列には最初の列の379Mではなく15Mが表示されます。私の質問は: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 ~]#

答え1

「プロセスの物理メモリ使用量」を提供できるコマンドはありません。プロセスの物理メモリ使用量は存在しません。

プロセスの各メモリページは次のとおりです。

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

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

表示される情報は、pmapから取得したものです。これはプロセスの物理メモリ使用量です。 1つの数字にまとめることはできません。/proc/PID/maps/proc/PID/smaps

答え2

pmaptopと同様の分析を行い、同じソース/proc/[N]/mapsから情報を表示するアプリケーションのマニュアルページに、私が書いた内容を引用します。

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

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

データは実際には仮想アドレス空間に保存または取得できません。物理データには物理メモリが必要です。お互いの関係を管理するのがカーネルの使命です。仮想空間統計(VirtualSz、Data + Stack、およびPriv&Write)は、プロセス構造と物理メモリ使用量との関係を考慮するのに役立ちますが、物理メモリ統計(ResidentSz、Share、およびRatio)はプロセスの構造を考慮するのに最も役立ちます。実際に使用されているRAMの量が重要です。

pmap主にあなたに関連情報を報告するために仮想アドレス空間。出力で観察される「ほぼ一致する値」は、topRESプロットとはかなり異なるVIRTプロットを参照できます。これは、上記で「VirtualSz」と「ResidentSz」とマークしたものと正確に一致します(仮想の場合はVIRT、居住者の場合はRES)。

pmap -xを使用すると、プロセスのメモリ使用量がはるかに少ないことを示す追加のDirty列が表示されます。次の例に示すように、「Dirty」列には最初の列の379Mではなく15Mが表示されます。私の質問は:Dirty列の下の値がプロセスで積極的に使用する「実際の」メモリ量ですか?

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

答え3

仮想メモリは約30億個(32ビットシステムの場合は40億個、64ビットカーネルの32ビットアプリケーション、64ビットアプリケーションの場合以上)があることを除けば、短縮ダイヤル番号と同じです。番号を直接入力すると、短縮番号にマッピングされます。

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

これまでは、仮想アドレスのすべてのサブ部分がどのように合っているかを説明しましたが、さらに多くがあります。プロセスに仮想メモリが多すぎるため、合わない可能性があります。どうすればいいですか?ライブラリまたは実行可能ファイルの一部が使用されていない、ディスクからメモリにコピーされない、またはメモリがいっぱいになり、ディスクからロードされたビットが必要な場合は、ディスクから再インポートできるため、削除できます。サポートされていません。マイディスクのメモリはスワップにマッピングされ、スワップにコピーされた後に削除されます。その後、必要に応じて交換で読むことができます。後者の戦略の1つでも、あまりにも使用するとシステムが非常に遅くなります。

関連情報