未使用の物理メモリがまだ多く、Linuxがスワップメモリ​​を使用するのはなぜですか?

未使用の物理メモリがまだ多く、Linuxがスワップメモリ​​を使用するのはなぜですか?
root@host [/home4/nudenude/public_html/hello/cache]# top -r
        top: unknown argument 'r'
usage:  top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]

root@host [/home4/nudenude/public_html/hello/cache]# top
top - 09:15:22 up 32 days,  7:12,  2 users,  load average: 274.18, 268.12, 262.50
Tasks: 863 total, 215 running, 630 sleeping,   3 stopped,  15 zombie
Cpu(s): 13.8%us, 85.7%sy,  0.4%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  16313868k total,  7121660k used,  9192208k free,   679320k buffers
Swap:  4194296k total,   311896k used,  3882400k free,   478132k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 6051 nudenude  20   0  103m  29m 4892 R  4.2  0.2   0:14.04 php
 6472 nudenude  20   0 97048  26m 5272 R  4.2  0.2   0:13.07 php
 7181 nudenude  20   0  100m  30m 4928 R  4.2  0.2   0:11.31 php
 7196 nudenude  20   0  105m  26m 5264 R  4.2  0.2   0:11.19 php
 8003 nudenude  20   0  105m  32m 5288 R  4.2  0.2   0:09.42 php
 8008 nudenude  20   0  107m  29m 4960 R  4.2  0.2   0:09.42 php
 8050 nudenude  20   0  105m  34m 5276 R  4.2  0.2   0:09.32 php
 8052 nudenude  20   0 98664  23m 5300 R  4.2  0.1   0:09.32 php
 8067 nudenude  20   0  104m  28m 5296 R  4.2  0.2   0:09.31 php
 8257 nudenude  20   0 96608  25m 5304 R  4.2  0.2   0:09.02 php
10640 nudenude  20   0 96032  22m 4932 R  4.2  0.1   0:04.40 php
12082 investgr  20   0 87588  16m 4928 R  4.2  0.1   0:00.23 php
 5962 nudenude  20   0  103m  33m 4900 R  3.9  0.2   0:14.19 php
 6095 nudenude  20   0  105m  29m 5276 R  3.9  0.2   0:13.96 php
 6467 nudenude  20   0  103m  28m 5280 R  3.9  0.2   0:12.97 php
 6488 nudenude  20   0  102m  26m 5280 R  3.9  0.2   0:12.96 php

私のサーバーには16GBのメモリがあります。そのうち7GBはまだ無料です。サーバーは4 GBのSWAPメモリを使用し、メモリの85.7%がシステムで使用されます。

なぜ?コラムも読んでください。バーチャル103m、RES 29m。だからほとんどの記憶は物理的な記憶でもありません。なぜ?

答え1

「VIRT 103m、RES 29m。では、ほとんどのメモリは物理メモリでもありません。なぜですか?」

この違いをあなたに伝えたのは私のせいです。

プログラミングをしてみたら、おそらく何かを知っています。メモリアドレス- (通常)システムでメモリバイトを構成するために使用される32ビットまたは64ビットの数値(つまり、32ビットおよび64ビットコンピュータ)。メモリの各バイトにアドレスがあります。これが初めてなら、今知っておくべきことがあります。

最新のオペレーティングシステムでプログラムするときに発生するアドレスは一意であり、RAM内の特定の一意の場所を参照するという点で「実際」ではありません。つまり、0xdeadbeefあるプログラムのアドレス(つまり、通常はアドレスを表す方法である16進数の32ビット数)は、他のプログラムの0xdeadbeef位置と同じではありません。昔はこんな感じでした。つまり、システムには0x000000で始まるアドレスセットが1つしかありません。アドレス空間カーネルを含むすべてのもの間で共有されます。

これがもはや真実ではないのにはいくつかの理由があり、その1つはセキュリティです。異なるプログラムは互いにメモリにアクセスできないため、アドレスが必要な理由はありません。とにかく、今起こっていることは、カーネルが各プロセスに仮想アドレス空間(あなたも見ることができますあなたの他の答えに対する私の答え)は0x0000000から始まります。これは、一部が共有ライブラリなどの他のエンティティにマッピングされるように構成されます。プロセス自体のプライベートスペースはいくつかのセクションに分かれており、ほとんどは純粋に理論的です。技術的には「ヒープ」セクションの一部ですが、プログラムは利用可能なヒープ全体をほとんど使用しません。

最高のVIRTスコアは、/ procインターフェースを介してカーネルによって報告された数字から取得されます。実際に訪問したすべての部分の住所です。特定の仕事に専念する。つまり、プログラム数です。仮想アドレス空間実際に使えるものです。

それはまだ実際の記憶とは異なります。 特定の方法で何かを使用できると言うものとそれを使用することは異なります。たとえば、100MBの配列を宣言したが配列に何も入れなかった場合、VIRTスコアに100MBを追加するだけでRSSには何もありません(または配列のアドレスを保持するのにバイトがほとんど必要ありません)。 /RES("RESident Set Size") スコア。カーネルはとてもスマートですメモリ管理この方法。仮想アドレスを物理アドレスにマッピングするテーブルを保持することは、仮想アドレスが多いため、仮想アドレスのリストがその物理アドレスのリストよりもはるかに大きいことを意味します。何も該当しないなぜなら、プログラムは実際にそれらにアクセスしようとせず、単にそれらを生成するように要求するからです。

プログラムがまだマップされていないアドレスにアクセスしようとすると、カーネルはそのために物理メモリを提供します。したがって、消費される「仮想アドレス空間」の量は、常に使用される「実メモリ」の量よりも大きい。通常、サイズははるかに大きいが、正確な理由はこの説明の範囲外です。 ;)

VIRTは決まった信用限度で、RESは実際の負債と考えることができます。 RESには、他のプログラム(一般的に公共図書館)と共有できる部分が含まれているため、これらのたとえ話は複雑です。 Linuxカーネルは「Pss」スコアを報告します。例:

  • 100%プライベートスペース
  • 共有スペースAの25%は、他の3つのプロセスでも使用されます。
  • 共有スペースBの50%、Bを使用する別のプロセス1つ。

Aを使用する他のプロセスの1つが終了すると、Pssはそれに応じて増加します(33%まで)。しかし、塔はこの数値を申告しなかった。

未使用の物理メモリがまだ多く、Linuxがスワップメモリ​​を使用するのはなぜですか?

これは、いくつかの物理メモリを維持することに重点を置く2つの優先順位に関連しています。この場合、何かが交換された場合はまだロード中ですが、長い間アイドル状態であったプロセスに属します。再使用すると、スワップ領域から物理メモリにリロードされます(必要に応じて他のコンテンツを置き換えます)。

空きメモリプールを予約する最初の理由は、上記で議論したことに関連しています。一方、銀行(カーネル)は一度に完了できるよりも多くのWRTメモリークレジットを発行できますが、ほとんどそうする必要はありません。ただし、近いうちにこれらのいくつかを実装する必要があるかもしれません。したがって、多くの変更を維持することで、アクティブなプロセスの応答性を高めることができるという考えがあります。長い間アイドル状態であったプロセスが完全にいっぱいになるまでRAMに残すと、スワッピングがより顕著になります。最もアクティブなプロセスを遅くします。、臨界点に達するまでは発生しないからです。

もう1つの理由は、使用可能なRAMが実際にカーネル内のファイルキャッシュとして使用されるためです(これは、出力の最初の行が通常2行目とはfree非常に異なる理由です)。ファイルキャッシュの目的は、頻繁に使用されているが現在実際に使用されていないコンテンツを後で再度必要とする場合に備えてメモリに保存することです。実行中のプロセスが何かを完了すると、空きメモリとしてマークされますが、ファイルキャッシュの一部として残ります。そのプロセスまたは他のプロセスがそのアイテムを再要求すると、そのプロセスの一部として表示され(もはや無料ではなく)、ディスクから再ロードする必要はありません。これはまた、アクティブなプロセスに応答性を提供し、パフォーマンスを向上させます。

スコアを調整して、カーネルがこのポリシーをどれほど積極的に実施しているかを調整できます/proc/sys/vm/swappiness。しかし、特別な理由がない限り、そのままにしておく必要があります。さまざまな状況でシステムの反応性を最適に維持する方法を決定するために、多くの考えと経験が必要でした。

答え2

mmap'edファイルもスワップされているように見えます[スワップ可能またはスワップ済みの読み取り]。

swapon -sは、スワップされたスペースが設定されたページングデバイスから来るかどうかを示します。そうでない場合は、プロセスがディスク上のファイルに追加されていることを確認できます。

プログラム実行ファイルはこのように自動的に置き換えられると思います。プログラムがすでにディスク上にあり、交換が必要な場合はそこから再ロードできるためです。プログラムの実行中に実行可能ファイルを上書きすると、どうなるかわかりません。

VIRTには、ファイルからマップされたページ、使用されたスワップ領域、まだ物理的に割り当てられていない領域が含まれます。 RESは実際に消費されたRAMですが、その一部は共有ライブラリと重複します(たとえば、各共有オブジェクトを共有する最後のプロセスが存在したときにRESに示されている合計量のみを再取得できます。

paxdiabloはここに関連する質問に対する良い答えを書きました。https://stackoverflow.com/questions/1972765/mmap-problem-allocates-huge-amounts-of-memory

乾杯

関連情報