最近、私のWebサーバーの1つがより多くのメモリを消費していましたが、確認すると、/proc/meminfo
AnonPagesがほぼすべてのメモリを消費していることがわかりました。
一部の文書ではこの問題を理解しようとしていますが、明確ではありません。誰かが正確に何であり、どのように解決するのに役立ちますか?
答え1
マニュアルページからproc(5)
:
AnonPages %lu (since Linux 2.6.18)
Non-file backed pages mapped into user-space page tables.
Linuxでは、プロセスがメモリをマッピングする方法は、通常、mmap(2)
「ファイルまたはデバイスをメモリにマッピングする」システムコールを使用することです。メモリはディスク上の物理ファイルとしてサポートされるため、通常のメモリブロックと同様にファイルを処理できます。
ただし、どのファイルでもサポートされていない空のメモリ部分を割り当てることもできます。これらのメモリページを「匿名」と呼びます。マニュアルページからmmap
:
MAP_ANONYMOUS
The mapping is not backed by any file; its contents are initialized to zero.
Cでプログラムしたことがある場合は、おそらくmalloc(3)
Cを使用して動的メモリを割り当てる方法に精通しています。 Linuxでは、ほとんどの場合、匿名メモリ割り当てページをmalloc
実際に呼び出します。mmap
AnonPages
最も一般的なメモリタイプ(プロセスで使用される動的メモリ領域)の使用量を示します。
mmap
匿名ページの使用または割り当てがmalloc
必ずしもすぐにAnonPages
反映されるわけではありません。ダイナミックメモリを割り当てると、使用可能な仮想アドレス空間しか取得できませんが、メモリページは実際には「インスタンス化」されず、プロセスのユーザ空間メモリの使用を開始するまで(メモリからの書き込みまたは読み取り)プロセスのユーザ空間メモリへのマッピングではありません。次に、これらのメモリページがRAMにロードされ計算されますAnonPages
。
簡単に言えば、AnonPages
「メモリ」と「RAM」を考えるとき、最初に思い浮かぶのはおそらく「メモリ」です。 「一般」メモリページは、要求に応じてプロセスに動的に割り当てられ、そのプロセスで使用されます。実際に「修正」する必要はありません。AnonPages
「最高の打者」になることは予想され、一般的なことです。
最も多くのメモリを占めるプロセス(使用などtop
)を見つけて、それに応じて行動する必要があります。多くのメモリ(RSS)を消費する1つのプロセスがある場合、またはメモリを埋める多くのプロセスがあります。