free 查看系統內存使用情況

原文地址 https://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html

free 工具用來查看系統可用內存:

/opt/app/tdev1$free
             total       used       free     shared    buffers     cached
Mem:       8175320    6159248    2016072          0     310208    5243680
-/+ buffers/cache:     605360    7569960
Swap:      6881272      16196    6865076

解釋一下 Linux 上 free 命令的輸出。

下面是 free 的運行結果,一共有 4 行。爲了方便說明,我加上了列號。這樣可以把 free 的輸出看成一個二維數組 FO(Free Output)。例如:

FO[2][1] = 24677460
FO[3][2] = 10321516

                   1          2          3          4          5          6
1              total       used       free     shared    buffers     cached
2 Mem:      24677460   23276064    1401396          0     870540   12084008
3 -/+ buffers/cache:   10321516   14355944
4 Swap:     25151484     224188   24927296

free 的輸出一共有四行,第四行爲交換區的信息,分別是交換的總量(total),使用量(used)和有多少空閒的交換區(free),這個比較清楚,不說太多。

free 輸出地第二行和第三行是比較讓人迷惑的。這兩行都是說明內存使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。

  第一行的輸出時從操作系統(OS)來看的。也就是說,從 OS 的角度來看,計算機上一共有:

24677460KB(缺省時 free 的單位爲 KB)物理內存,即 FO[2][1]; 在這些物理內存中有 23276064KB(即 FO[2][2])被使用了; 還用 1401396KB(即 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 這兩個詞經常混用。不過在一些比較低層的軟件裏是要區分這兩個詞的,看老外的洋文:

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
  1. 讀一個大文件,並記錄時間;
  2. 關閉該文件;
  3. 重讀這個大文件,並記錄時間;

第二次讀應該比第一次快很多。原來我做過一個 BerkeleyDB 的讀操作,大概要讀 5G 的文件,幾千萬條記錄。在我的環境上,第二次讀比第一次大概可以快 9 倍左右。

free 輸出的第二行是從一個應用程序的角度看系統內存的使用情況。

  • 對於 FO[3][2],即 - buffers/cache,表示一個應用程序認爲系統被用掉多少內存;
  • 對於 FO[3][3],即 + buffers/cache,表示一個應用程序認爲系統還有多少內存;

因爲被系統 cache 和 buffer 佔用的內存可以被快速回收,所以通常 FO[3][3] 比 FO[2][3] 會大很多。

這裏還用兩個等式:

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章