Linux上的free命令詳解
解釋一下Linux上free命令的輸出。
下面是free的運行結果,一共有4行。為了方便說明,我加上了列號。這樣可以把free的輸出看成一個二維數組FO(Free Output)。例如:
- FO[2][1] = 24677460
- FO[3][2] = 10321516
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
- 讀一個大文件,並記錄時間;
- 關閉該文件;
- 重讀這個大文件,並記錄時間;
第二次讀應該比第一次快很多。原來我做過一個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。
Linux內存中Swap機制
先來看看這個
free -m
total used free shared buffers cached
Mem: 31912 24994 6918 0 763 18335
-/+ buffers/cache: 5894 26017
Swap: 4095 0 4095
其實內存是三個之和:Mem+buffers/cache+Swap
在linux系統中,啟動一個程序,它占用的內存假設是1G,但是運行一段時間后,使用top查看進行信息,你會發現它的內存只剩幾十M了,這是因為內存不足,它的內存被swap走了。
若開啟了swap,則系統會有一個交換空間在硬盤里,你的內存數據正是被交換到硬盤里,因此程序會運行的比較慢。
你可以用free -m命令查看交換空間使用了多少了。
Linux的產生和發展,更多的應用和服務器,那么對於Linux的各個管理機制要非常清晰,一個完整的Linux系統主要有存儲管理,內存管理,文件系統和進程管理等幾方面組成,貼出一些以前學習過的一個非常好的文章。和大家共享!以下主要說明Swap機制:
Linux支持虛擬內存(virtual memory),虛擬內存是指使用磁盤當作RAM的擴展,這樣可用的內存的大小就相應地增大了。內核會將暫時不用的內存塊的內容寫到硬盤上,這樣一來,這 塊內存就可用於其他目的。當需要用到原始的內容時,他們被重新讀入內存。這些操作對用戶來說是完全透明的;Linux下運行的程式只是看到有大量的內存可 供使用而並沒有注意到時不時他們的一部分是駐留在硬盤上的。當然,讀寫硬盤要比直接使用真實內存慢得多(要慢數千倍),所以程式就不會象一直在內存中運行 的那樣快。用作虛擬內存的硬盤部分被稱為交換空間(Swap Space)。
一般,在交換空間中的頁面首先被換入內存;如果此時沒有足夠的物理內存來容納他們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內存來容納所有這些頁面,Linux就會波動而不正常;但經過一段較長的時間Linux會恢復,但此時系統已不可用了。
有時,盡管有許多的空閑內存,仍然會有許多的交換空間正被使用。這種情況是有可能發生的,例如如果在某一時刻有進行交換的必要,但后來一個占用 非常多物理內存的大進程結束並釋放內存時。被交換出的數據並不會自動地交換進內存,除非有這個需要時。此時物理內存會在一段時間內保持空閑狀態。對此並沒 有什么可擔心的,不過知道了是怎么一回事,也就無所謂了。
許多操作系統使用了虛擬內存的方法。因為他們僅在運行時才需要交換空間,以解決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統的交換空間,其他的就是一種浪費。所以讓他們共享一個交換空間將會更有效率。
注意,如果會有幾個人同時使用這個系統,他們都將消耗內存。然而,如果兩個人同時運行一個程式,內存消耗的總量並不是翻倍,因為代碼頁及共享的庫只存在一份。
Linux系統常常動不動就使用交換空間,以保持盡可能多的空閑物理內存。即使並沒有什么事情需要內存,Linux也會交換出暫時不用的內存頁面。這能避免等待交換所需的時間:當磁盤閑着,就能提前做好交換
