鍍金池/ 教程/ Linux/ free 查詢可用內(nèi)存
進程管理工具
objdump 二進制文件分析
scp 跨機遠程拷貝
crontab 定時任務(wù)
readelf elf文件格式分析
pstack 跟蹤進程棧
系統(tǒng)管理及IPC資源管理
vmstat 監(jiān)視內(nèi)存使用情況
strace 跟蹤進程中的系統(tǒng)調(diào)用
sar 找出系統(tǒng)瓶頸的利器
ipcs 查詢進程間通信狀態(tài)
ps 進程查看器
性能優(yōu)化
wget 文件下載
top linux下的任務(wù)管理器
磁盤管理
size 查看程序內(nèi)存映像大小
free 查詢可用內(nèi)存
文件及目錄管理
iostat 監(jiān)視I/O子系統(tǒng)
性能監(jiān)控
程序構(gòu)建
學(xué)會使用命令幫助
gdb 調(diào)試?yán)?/span>
網(wǎng)絡(luò)工具
nm 目標(biāo)文件格式分析
lsof 一切皆文件
用戶管理工具
程序調(diào)試
ldd 查看程序依賴庫
文本處理

free 查詢可用內(nèi)存

free工具用來查看系統(tǒng)可用內(nèi)存::

/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的運行結(jié)果,一共有4行。為了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數(shù)組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的輸出一共有四行,第四行為交換區(qū)的信息,分別是交換的總量(total),使用量(used)和有多少空閑的交換區(qū)(free),這個比較清楚,不說太多。

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

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

24677460KB(缺省時free的單位為KB)物理內(nèi)存,即FO[2][1]; 在這些物理內(nèi)存中有23276064KB(即FO[2][2])被使用了; 還用1401396KB(即FO[2][3])是可用的;

這里得到第一個等式:

FO[2][1] = FO[2][2] + FO[2][3]

FO[2][4]表示被幾個進程共享的內(nèi)存的,現(xiàn)在已經(jīng)deprecated,其值總是0(當(dāng)然在一些系統(tǒng)上也可能不是0,主要取決于free命令是怎么實現(xiàn)的)。

FO[2][5]表示被OS buffer住的內(nèi)存。FO[2][6]表示被OS cache的內(nèi)存。在有些時候buffer和cache這兩個詞經(jīng)?;煊?。不過在一些比較低層的軟件里是要區(qū)分這兩個詞的,看老外的洋文::

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(塊設(shè)備)的數(shù)據(jù)的,而cache是存放從disk上讀出的數(shù)據(jù)。這二者是為了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系統(tǒng)(例如windows),為了提高IO read的性能,總是要多cache一些數(shù)據(jù),這也就是為什么FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。我們可以做一個簡單的測試:

釋放掉被系統(tǒng)cache占用的數(shù)據(jù)::

echo 3>/proc/sys/vm/drop_caches
  1. 讀一個大文件,并記錄時間;
  2. 關(guān)閉該文件;
  3. 重讀這個大文件,并記錄時間;

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

free輸出的第二行是從一個應(yīng)用程序的角度看系統(tǒng)內(nèi)存的使用情況。

  • 對于FO[3][2],即-buffers/cache,表示一個應(yīng)用程序認(rèn)為系統(tǒng)被用掉多少內(nèi)存;
  • 對于FO[3][3],即+buffers/cache,表示一個應(yīng)用程序認(rèn)為系統(tǒng)還有多少內(nèi)存;

因為被系統(tǒng)cache和buffer占用的內(nèi)存可以被快速回收,所以通常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中讀出的。

在系統(tǒng)上可能有meminfo(2)這個函數(shù),它就是為了解析/proc/meminfo的。procps這個包自己實現(xiàn)了meminfo()這個函數(shù)??梢韵螺d一個procps的tar包看看具體實現(xiàn),現(xiàn)在最新版式3.2.8。

文章出處:

http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html