linux中的free命令大家都很常用,可大家都清楚free輸出的各行的意思及它們之間的關係嗎?
[root@localhost ~]# free total used free shared buffers cached Mem: 4038116 4010292 27824 0 205228 1343276 -/+ buffers/cache: 2461788 1576328 Swap: 8289500 254076 8035424
第一行: total 實體記憶體總數: 4038116 used 已經使用的記憶體數: 4010292 free 閒置記憶體數: 27824 shared 當前已經廢棄不用,總是0 buffers 即Buffer Cache記憶體數: 205228 cached 即Page Cache記憶體數: 1343276
關係:total = used + free
第二行: -/+ buffers/cache的意思相當於: -buffers/cache 的記憶體數:2461788 (等於第1行的 used – buffers – cached),實際上是應用程式所使用的記憶體。 +buffers/cache 的記憶體數: 1576328 (等於第1行的 free + buffers + cached),是對應用程式來說還剩餘的記憶體。
可見-buffers/cache反映的是被程式實實在在吃掉的記憶體,而+buffers/cache反映的是可以挪用的記憶體總數。 對作業系統來講buffers/cached 都是屬於被使用,所以它認為free只有27824. 對應用程式來講是(-/+ buffers/cach).buffers/cached 是等同可用的,因為buffer/cached是為了提高程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。
第三行是交換分區swap, 列出已使用、閒置swap.
那buffers和cached都是緩衝,兩者有什麼區別呢? 為了提高磁碟存取效率, Linux做了一些精心的設計, 除了對dentry進行緩衝(用於VFS,加速檔案路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟塊的讀寫,後者針對檔案inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間。 磁碟的操作有邏輯級(檔案系統)和物理級(磁碟塊),這兩種Cache就是分別緩衝邏輯和物理級資料的。 Page cache實際上是針對檔案系統的,是檔案的緩衝,在檔案層面上的資料會緩衝到page cache。檔案的邏輯層需要映射到實際的物理磁碟,這種映射關係由檔案系統來完成。當page cache的資料需要重新整理時,page cache中的資料交給buffer cache,因為Buffer Cache就是緩衝磁碟塊的。但是這種處理在2.6版本的核心之後就變的很簡單了,沒有真正意義上的cache操作。 Buffer cache是針對磁碟塊的緩衝,也就是在沒有檔案系統的情況下,直接對磁碟進行操作的資料會緩衝到buffer cache中,例如,檔案系統的中繼資料都會緩衝到buffer cache中。 簡單說來,page cache用來快取檔案資料,buffer cache用來緩衝磁碟資料。在有檔案系統的情況下,對檔案操作,那麼資料會緩衝到page cache,如果直接採用dd等工具對磁碟進行讀寫,那麼資料會緩衝到buffer cache。
所以我們看linux,只要不用swap的交換空間,就不用擔心自己的記憶體太少.如果常常swap用很多,可能你就要考慮加實體記憶體了.這也是linux看記憶體是否夠用的標準. 如果是應用伺服器的話,一般只看第二行,+buffers/cache,即對應用程式來說free的記憶體太少了,也是該考慮最佳化程式或加記憶體了。