Red Hat Linuxがシステムで実際に利用可能な空きメモリより少ない空きメモリを報告するのはなぜですか?


9

私は比較的小さなホームRed Hat Linuxサーバー(約8 GB RAM)を持っています。私は、さまざまなものを追跡するためにいくつかの自作のアプリを実行する以外に、それを使用しません。ボックスで実行されている唯一の実物は、データベースとWebサーバーです。

NMONやTOPなどのツールを使用してシステムカウンターをチェックすると、システムの合計空きメモリが比較的少ない(数百MB程度)のに、データベースとWebサーバーのアクティブメモリがまだ少ない(合計で3 GBを消費します)。他の実行中のプロセスをすべて含めた場合でも、消費されるメモリの合計は4 GB未満です。

Red Hat Linuxは、総メモリから実行中のプロセスの使用済みメモリの合計を差し引いたものよりも少ない空きメモリを報告するのはなぜですか?

回答:


19

空きメモリと未使用メモリを混同しないでください。UNIXの世界における空きメモリは、論理データがマッピングされていない物理メモリのページです。未使用のメモリにはデータがマッピングされていますが、現在、実行中のプロセスによってアクティブに使用されていません。

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

Linux(およびすべてのUnix OS)は、できるだけ少ない空きメモリを確保しようとします。代わりに、実行中のOSのプロセスにアクティブにマップされていないメモリを、さまざまなIO転送操作のファイルキャッシュやバッファなどに使用します。

混乱を招く可能性があるのは、実行中のすべてのプロセスで使用中のメモリを単純に合計して、使用中の合計メモリを取得することはできないということです。これを試みた場合、アプリケーションが実際にマシンに存在するよりも多くのメモリを使用しているように見えることがすぐにわかります。これには2つの理由があります

  1. メモリは、Copy-On-Writeメモリ割り当て、メモリマップIO共有ダイナミックライブラリを通じて、さまざまなプロセス間で共有できます
  2. オペレーティングシステムは、アプリケーションに実際に提供されているよりも多くのメモリを約束する自由があります。理論では、ほとんどのアプリケーション作成者は、オーバーヘッドを回避するために一度に大量のメモリを要求することを好み、実際にはそのメモリのすべてを使用しない場合があります。

この問題については、lwn.netに最近の記事があります。


1
簡単に説明もここで提供されます。linuxatemyram.com
スティーブンT.スナイダー

4

Linuxは、ファイルシステムアクセスをメモリに積極的にキャッシュして、ディスクアクセス時間を高速化します。心配する必要はありません。

ボックスでfree -mを実行すると、メモリが使用されている場所がよくわかります。

以下は、私のボックスの1つから引き出された出力です。空きメモリは147Megで、ファイルシステムアクセス要求のためにほぼ4Gがキャッシュされます。

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722

1

「バッファ」フィールドと「キャッシュ」フィールドも含めていますか?


1

Linuxの場合、/ proc / meminfoのCommitted_ASを見てください。これは、カーネルが実際にプロセスを実行することを約束しているメモリの量(実際+スワップ)です。

Linuxはメモリを非常に効率的に使用します。一部のプロセスに約束されていないブロック、最近/頻繁にアクセスされるファイルをキャッシュするために使用されます。したがって、Linuxは、起動後間もなく、利用可能なすべての物理メモリの90%を使用するのが一般的です。

カーネルが..およびダーティ(スワップ)の使用を提供することにコミットしているものを見てください。これにより、全体像がよくなります。

この動作を調整する必要がある場合は、質問を更新してください:)

これはLinuxの標準MOです。一部のディストリビューションは、sysctlを介してニーズに合わせてメモリ管理を微調整します。しかし、あなたが報告することは、すべての中でかなり典型的です。


1

システムでどのような種類のカーネルを実行していますか?32ビットカーネルは、PAEを有効にしてコンパイルしない限り、約3.6GBのメモリしか報告しません。

つまり、これがRedhat Enterprise Linux(またはCentOS)の最新バージョン(v3以降)の場合、デフォルトの32ビットカーネルでこれが有効になります。

上記の「free」コマンドの出力を投稿できれば、これが問題であるかどうかを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.