Linuxメモリを使用したのは何ですか?低キャッシュ、低バッファ、VMではない


11

まず第一に、はい、私はLinuxAteMyRAMを読みましたが、これは私の状況を説明していません。

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

上記のように、-/+ buffers/cache:行は使用メモリ率が非常に高いことを示しています。ただし、の出力からtop、100 MBを超えるメモリを使用するプロセスはありません。

それで、何がメモリを使用しましたか?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

これは、x84_64 Linuxを実行するx86_64マシン(一般的なブランドのサーバーではない)であり、仮想マシンのコンテナーではありません。カーネル(uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

の内容/proc/meminfo

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dftmpfsファイルシステムからのメモリの大きな消費はないと報告します。


2
の出力はps -eo pid,user,args,pmem --sort pmem何ですか?
Braiam 14年

ここにリンクを貼り付け、数回試してみましたが、同じ出力が得られました。
ジェイソン

3
使用しないでくださいhead!完全なコマンドの完全な出力が必要です。使用したい場合headは、コマンドに追加します。ユーザーが尋ねるコマンドには常に完全な出力を提供してください。
Braiam

3
電話では、私の頭の上の構文を覚えていませんが、sysv共有メモリを確認してください。コマンドはipcsだと思う。
デロバート14年

5
これに対する解決策を見つけましたか?-ここで同様の問題が発生しています:superuser.com/questions/793192/…–
Hackeron

回答:


4

Linuxのメモリは、診断して理解するのに奇妙な存在です。

すべてではありませんが、ほとんどの場合、通常の操作では、メモリは1つのタスクに割り当てられます。一部は、現在実行中のフォアグラウンドプロセスに割り当てられます。一部はディスクからキャッシュされたデータを保存します。ある特定の時点でアクティブに実行されていないプロセスに関連付けられたデータを保持するものもあります。

Linuxのプロセスには、独自の仮想アドレススペースがあります(出力のVIRT top)。これには、プロセスに関連付けられたすべてのデータが含まれており、プロセスがどれほど「大きい」と考えることができます。ただし、そのすべてのメモリが「実際の」メモリマップ(の出力のRES)に積極的に含まれることはまれですtop。RES(常駐メモリ)は、その時点でRAMから直接アクセスできるデータです。次に、その上に共有メモリ(SHR)もあります。同じプロセスの複数のインスタンス間で共有できます。そのため、プロセスで使用中のメモリはRESとSHRのいずれかの時点にありますが、共有メモリを使用するプロセスのインスタンスが複数ある場合、使用量はRESとRESとRES ...とSHRです。

では、なぜRESとVIRTの違いなのでしょうか?確かに、プロセスに割り当てられたメモリのブロックがある場合、それは割り当てられたメモリですよね?いいえ。メモリはページ単位で割り当てられ、ページはアクティブまたは非アクティブにできます。アクティブなものはRESにあります。非アクティブは「残り」です。現在アクセスされていないため、片側にプッシュできます。これは、メモリが不足した場合にディスクにスワップアウトできることを意味します。しかし、彼らはただディスクに直行するだけではありません。まず、キャッシュに格納されます。常にスワップしたくないので、アプリケーションとスワップスペースの間にバッファがあります。スワッパーが実行する別のプロセスを選択し、異なるページがアクティブおよび非アクティブになると、これらのバッファーは常に変化します。そして、単なる人間が追いつくために断食するために起こっているすべての方法。

さらに、ディスクバッファがあります。非アクティブなメモリはキャッシュに移動するだけでなく、そのキャッシュがディスクにスワップされると、まずディスクバッファに移動して書き込みのためにキューに入れられます。これがミックス内のキャッシュの2番目のレイヤーです。また、これらのディスクバッファは、システムの他の部分でも一般的なIOバッファリングに使用されます。そのため、彼らも絶えず変化しています。

それでは、あなたはのようなもので見ているtopfreeなどして時間をかけてマシンの現在の状態の瞬時のスナップショット、または集約統計のどちらかです。データを読み取るまでに、データは古くなっています。

1つのプロセスで大量のメモリにアクセスできますが、そうすることはめったにありません。とにかく一度にすべてのメモリにアクセスすることはできないため、「コアでロックされている」という特別なフラグが立てられていない限り、現在見ていないメモリはキャッシュに移動されます。

そのため、アプリケーションが「使用」するメモリの量と「使用」するメモリの量は、まったく異なるものです。アプリケーションのデータスペースの多くは、実際には「コア」メモリではなくキャッシュにありますが、キャッシュはほとんどの場合RAMにあるため、すぐに利用でき、「コア」メモリになるには「アクティブ化」する必要があります。それは、ディスクにスワップアウトされない限り、スワップを解除する必要があるときです(バッファ内にある場合は高速になる可能性があります)。

獣の高速性と数字が常に変化しているという事実のために、数字はそれらが何であるかを計算する途中でさえ変わるかもしれないので、「これは使用中のメモリ量」と正確に言うことは決して不可能ですユーザーの視点。meminfoはカーネルによって提供される時間のスナップショットですが、実行中のカーネルであるため、その時点でアクティブに実行されているプロセスがないため、必ずしも1つのプロセスのメモリ使用量の実際の状態を示すわけではありません-プロセス間です。

私が言ったように、それはすべて非常に混乱しています。

しかし、結局のところ、それは本当に重要ではありません。重要なのは、「空き」メモリの量ではなく、使用したスワップスペースの量と、スワップスペースにアクセスする頻度です。スワップは、メモリ不足ではなく、システムの速度を低下させます(ただし、メモリ不足は過剰なスワップを引き起こします)。大量のメモリを使用しているが、スワップスペースをまったく使用していない(またはほとんど使用していない)場合、問題はありません。空きメモリは一般的に望ましくなく、ある目的のために使用されていたが、別の目的のためにまだ割り当てられていないという点で、とにかく純粋に一時的なものです。たとえば、キャッシュメモリであり、ディスクにスワップされました。しかし、まだ他の用途には使用されていないか、ディスクバッファであり、バッファはディスクにフラッシュされていますが、キャッシュを要求するアプリケーションはまだありません。


6
これは本当に興味深いですが、OPがこの特定の不一致を観察している理由の質問には答えません。
テルドン14年

唯一の本当の違いは、OPの期待とLinuxが提供するものとの間にあると思います。つまり、Linuxが提供する価値は足し算されず、それはすでに変化しているからです。
マジェンコ14年

OPは彼が尋ねている質問を本当に理解していないように見えるので、「正しい」答えをどのように選択できるかわかりません。顔が青くなるまでシステムがどのように機能するかを説明することはできますが、彼がそれらの基本を把握できず、彼の質問が実際に無意味であることに気付かない場合、「正しい」答えはありません。
マジェンコ14年

これを書いてくれて感謝していますが、正直なところ、その背後にある不可知論的な口調は好きではありません。「スナップショット」理論には同意しますが、スナップショットが、RAM使用率が高いという同じ数値を出し続けているのに、どのように発生したかわからない場合は、興味がありませんか?
ジェイソン

5
これをブログに投稿してください。それは良いことですが、ここでは関係ありません。プロセスのVIRTはすべてのRAM使用量を考慮しておらず、システムはそうするように圧力をかけられてもスワップしません。
ジル 'SO-悪であるのをやめる'

0

これは答えの一部です。

「使用済み」メモリ(「free」コマンドで)と指定されたものと「アクティブ(ユーザー)プロセスに割り当てられたメモリ」(/ proc / meminfoで)には違いがあります。わかりましたので、システムの合計は48149 MBです(約47Gb)

/ proc / meminfoを見ると、次のように表示されます。Inactive:17296272 kB =(約16.5 Gb)-非アクティブなメモリは、終了したプロセスからのものである可能性があります。また、アクティブなプロセスによって長時間使用されていないメモリでもかまいません。プロセスが終了したからといって、メモリは「解放」されません。どうして?より多くの仕事のため。同じメモリページが再び使用される可能性があるため、Linuxカーネルは、プロセスが必要とするまでデータを「非アクティブ」リストに残します。

このページではその一部を説明します。http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization ; Linuxカーネルで使用されるPFRA(ページフレーム再生アルゴリズム)のセクションを読む:「プロセスのユーザーモードアドレス空間に属するページの前に、プロセスによって参照されないディスクおよびメモリキャッシュに含まれるページを再生する必要があります」 「使用済み」(非アクティブ+アクティブ)から「フリー」に移動することを意味します。

これにより、メモリ管理がより詳細に説明されます。アクティブリストと非アクティブリストの機能、およびリスト間のページの移動方法https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

カーネルがデータ構造に使用するメモリもあり、これは「スラブ1049464 kb」(〜1 GB)として表示されると思いますが、これは個別にカウントされるとは言えません。


過去に追加したかったのは、共有メモリセグメントを割り当てたアプリケーションの記述が不十分で、それらを解放しなかったためにシステムがメモリ不足になった経験があったことです。共有メモリセグメントは、それらを使用するすべてのプロセスが停止した場合でも持続しました。これはLinuxではありませんでしたが、Linuxでも同様かもしれません。上記のように、これについてはipcsを参照してください。makelinux.net/alp/035を参照してください。明示的に割り当て解除された共有メモリが必要だと書かれています。
ssl 14年

1
私はあなたの答えが何であるかをすべて理解していませんが、「非アクティブなメモリは終了したプロセスからのものである可能性があります」は間違いなく間違っています。ユーザーランドのメモリには、マップ型と匿名型の2種類があります。データはファイルからリロードできるため、マップされたメモリはいつでも再利用できます。匿名メモリは、交換された場合に回収できます。非アクティブなメモリは、再利用に適したメモリです。ただし、メモリはまだ使用されているため、コンテンツはファイルまたはスワップのいずれかになければなりません。プロセスが停止すると、そのメモリは解放され、アクティブ+非アクティブのアカウントに含まれなくなります。
ジル 'SO-悪であるのをやめる' 14年

1
いくつかの参照:非アクティブなメモリの増加を引き起こす可能性があるものと、それを再利用する方法は?サーバー障害; 古いが、まだほとんど適用可能なRed Hatのヒント。また、あなたが引用したBhavin Turakhiaの記事も。問題については明確ではありませんが、「PFRAを理解する」セクションで匿名ページとマップされたページについて説明しています。
ジル 'SO-悪であるのをやめる' 14年

私はこの記事からプロセスによって参照されていない非アクティブなページに考えを得た:kernel.org/doc/gorman/html/understand/understand013.html けれども、私はそれがまだ実行されているプロセスによって解放されたページの可能性があるとします。セクション「LRUリストからレクラメーションページ」
SSL

しかし、おそらくスワップキャッシュ内のページを指しているのでしょうか?
ssl 14年

-2

NFSを使用していますか?どちらの方法で
も実行slabtop -oする価値があるかもしれませんがnfs_inode_cache、手に負えなくなる可能性があります。


-4

見るべき数字は、出力でswapを使用していることであり、これは「0」です。これは、RAMが不足していないことを意味します。システムがメモリをスワップしていない限り、他の数字について心配する必要はありません。

編集:OK、私の答えは簡潔ではなく不可解と考えられているようです。それでは、詳しく説明させてください。

ここでの主な問題はtop / psの出力の解釈にあると思いますが、これはあまり正確ではありません。たとえば、同じ共有ライブラリの複数の使用が予想どおりに計算されないため、http//virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.htmlを参照してください。

ただし、完全に正確なのは、スワップサイズが正確にゼロの場合、システムがメモリを使い果たしていない(まだ)ことです。もちろん、これは非常にわかりやすい説明ですが、システムの実際のメモリ使用量をプロファイリングするには、topは正しいものではありません。(そして、上を見ると、少なくともvirtまたは%memの出力をソートしています。)

http://elinux.org/Runtime_Memory_Measurementも参照して ください


1
システムがスワップするかどうか心配する必要はありません、それは正常です。システムが頻繁にスワッピングされているかどうかを心配する必要があります(これは、大きな使用済みスワップスペースを持つこととは異なります)。使用されているスワップが0であるという事実は、それ自体が奇妙で、空き物理メモリがほとんどありません。
ジル 'SO-悪であるのをやめる'

まあ、彼の出力は、彼のシステムがまったく交換しなかったことを示しています。それは確かに最適な交換率です。スワップサイズを小さくすることは良いこととは言いませんでしたが、サイズをゼロにすることは確かです。また、システムが実際に空きメモリを使い果たしていない限り、なぜスワップを開始する必要があるのでしょうか?
エキセキューター14年

いいえ、スワッピングの欠如は最適とはほど遠いです。現在使用されていないプログラムのメモリは、頻繁に使用されるファイル用のディスクキャッシュ用のスペースを確保するために交換する必要があります。の出力について追加したばかりのビットについては、freeあなたが意図したものだと思いますtopが、それでも合計は合計より大きくなるだけです(共有メモリが複数回カウントされるため)。
ジル 'SO-悪であるのをやめる' 14年

合計がそれ以上でもそれ以上でもないということはどういう意味ですか?topは画面に収まるだけのプロセスを表示します。上記のすべてが実行中のプロセスではないため、メモリ使用量でソートされず、「メモリを使用したもの」の質問に対して出力はほとんど役に立ちません。 。
エキセキューター14年

ああ、そして、スワップを開始する最適な時期について議論をしたくありませんが、Linuxサーバーのデフォルトは、「現時点では慣れていない」という理由だけでメモリをスワップしないことです。
エキセキューター14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.