freeコマンド詳細


Linux上のfreeコマンドの出力を説明します.
次はfreeの実行結果で、全部で4行あります.説明の便宜上、列番号を付けました.これによりfreeの出力を2次元配列FO(Free Output)と見なすことができる.例:
  • FO[2][1] = 999212
  • FO[3][3] = 305404
  • 
        
        
        
        
    1 2 3 4 5 6
    1
    total used free shared buffers cached
    2 Mem: 999212 967476 31736 0 50668 223000
    3 -/+ buffers/cache: 693808 305404
    4 Swap: 2048276 154524 1893752

    freeの出力は全部で4行あり,第4の動作交換領域の情報は,それぞれ交換の総量(total),使用量(used),どれだけ空き交換領域(free)であるかが明らかであり,これはあまり多くは言わない.
    free出力の2行目と3行目は迷います.どちらの行もメモリの使用状況を示しています.第1列は総量(free)、第2列は使用量(free)、第3列は使用可能量(free)である.1行目の出力はオペレーティングシステム(OS)から見たものです.つまり、OSの観点から見ると、コンピュータには次のようなものがあります.
  • 999212 KB(デフォルトではfreeの単位はKB)物理メモリ、すなわちFO[2][1].
  • はこれらの物理メモリに967476 KB(すなわちFO[2][2])が使用されている.
  • はさらに31736 KB(すなわちFO[2][3])で利用可能である.

  • ここで最初の式が得られます.
  • FO[2][1] = FO[2][2] + FO[2][3]

  • FO[2][4]は、いくつかのプロセスによって共有されるメモリを表し、現在deprecatedされており、その値は常に0である(もちろん、一部のシステムでは0ではない可能性もあり、主にfreeコマンドがどのように実現されるかに依存する).
    FO[2][5]は、OS bufferが住んでいるメモリを表す.FO[2][6]は、OS cacheによるメモリを表す.bufferとcacheの2つの言葉はよく混用されることがあります.しかし、いくつかの比較的低いレベルのソフトウェアでは、この2つの言葉を区別し、外国人の洋文を見ています.
  • A buffer is something that has yet to be "written"to disk.
  • A cache is something that has been "read"from the disk and stored for later use.

  • すなわちbufferはdisk(ブロックデバイス)に出力するデータを格納するためのものであり、cacheはdiskから読み出したデータを格納するものである.両者は、IO性能を向上させるため、OSによって管理される.
    Linuxや他の成熟したオペレーティングシステム(例えばwindows)は、IO readの性能を向上させるために、常にいくつかのデータを多くcacheしなければならない.これは、FO[2][6](cached memory)が比較的大きく、FO[2][3]が比較的小さい理由である.簡単なテストができます
  • システムcacheによって占有されたデータを解放する.
    
          
          
          
          
    echo 3 >/proc/sys/vm/drop_caches

     
  • 大きなファイルを読み、時間を記録します.
  • ファイルを閉じます.
  • この大きなファイルを読み返し、時間を記録します.

  • 2回目の読みは1回目よりずっと速いはずです.もともと私はBerkeleyDBの読み取り操作をしたことがあります.5 Gのファイル、数千万件の記録を読みます.私の環境では、2回目の読みは1回目より9倍ぐらい速くなります.
     
    free出力の2行目は、1つのアプリケーションの観点からシステムメモリの使用状況を見ることです.
  • FO[3][2]、すなわち-buffers/cacheは、1つのアプリケーションがシステムがどれだけのメモリを使用されていると考えているかを示す.
  • FO[3][3]、すなわち+buffers/cacheは、アプリケーションがシステムにどれだけのメモリがあると考えているかを示す.

  •  
    システムcacheやbufferによって消費されるメモリは急速に回収できるため、通常FO[3][3]はFO[2][3]よりも大きくなる.
    ここでは2つの式を使用します.
  • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
  • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

  • どちらも理解に難くない.
    freeコマンドはprocps.*.rpm提供(RedhatシリーズのOS上).freeコマンドのすべての出力値は/proc/meminfoから読み出されます.
    システム上にmeminfo(2)という関数がある可能性があります.これは/proc/meminfoを解析するためです.procpsというパッケージ自体がmeminfo()という関数を実現した.procpsのtarパッケージをダウンロードして具体的な実装を見ることができます.現在、最新版は3.2.8です.