1. 程式人生 > 其它 >(轉)Linux free命令 記憶體介紹

(轉)Linux free命令 記憶體介紹

轉:https://www.cnblogs.com/ultranms/p/9254160.html

free 命令顯示系統記憶體的使用情況,包括實體記憶體、交換記憶體(swap)和核心緩衝區記憶體。

如果加上 -h 選項,輸出的結果會友好很多:

有時我們需要持續的觀察記憶體的狀況,此時可以使用 -s 選項並指定間隔的秒數:

$ free -h -s 3

上面的命令每隔 3 秒輸出一次記憶體的使用情況,直到你按下 ctrl + c。

由於 free 命令本身比較簡單,所以本文的重點會放在如何通過 free 命令瞭解系統當前的記憶體使用狀況。

輸出簡介

下面先解釋一下輸出的內容:
Mem行(第二行)是記憶體的使用情況。
Swap

行(第三行)是交換空間的使用情況。
total列顯示系統總的可用實體記憶體和交換空間大小。
used列顯示已經被使用的實體記憶體和交換空間。
free列顯示還有多少實體記憶體和交換空間可用使用。
shared列顯示被共享使用的實體記憶體大小。
buff/cache列顯示被 buffer 和 cache 使用的實體記憶體大小。
available列顯示還可以被應用程式使用的實體記憶體大小。

我想只有在理解了一些基本概念之後,上面的輸出才能幫助我們瞭解系統的記憶體狀況。

buff/cache

先來提一個問題: buffer 和 cache 應該是兩種型別的記憶體,但是 free 命令為什麼會把它們放在一起呢?要回答這個問題需要我們做些準備工作。讓我們先來搞清楚 buffer 與 cache 的含義。

buffer在作業系統中指 buffer cache, 中文一般翻譯為 "緩衝區"。要理解緩衝區,必須明確另外兩個概念:"扇區" 和 "塊"。扇區是裝置的最小定址單元,也叫 "硬扇區" 或 "裝置塊"。塊是作業系統中檔案系統的最小定址單元,也叫 "檔案塊" 或 "I/O 塊"。每個塊包含一個或多個扇區,但大小不能超過一個頁面,所以一個頁可以容納一個或多個記憶體中的塊。當一個塊被調入記憶體時,它要儲存在一個緩衝區中。每個緩衝區與一個塊對應,它相當於是磁碟塊在記憶體中的表示(下圖來自網際網路):

注意,buffer cache 只有塊的概念而沒有檔案的概念,它只是把磁碟上的塊直接搬到記憶體中而不關心塊中究竟存放的是什麼格式的檔案。

cache在作業系統中指 page cache,中文一般翻譯為 "頁快取記憶體"。頁快取記憶體是核心實現的磁碟快取。它主要用來減少對磁碟的 I/O 操作。具體地講,是通過把磁碟中的資料快取到實體記憶體中,把對磁碟的訪問變為對實體記憶體的訪問。頁快取記憶體快取的是記憶體頁面。快取中的頁來自對普通檔案、塊裝置檔案(這個指的就是 buffer cache 呀)和記憶體對映檔案的讀寫
頁快取記憶體對普通檔案的快取我們可以這樣理解:當核心要讀一個檔案(比如 /etc/hosts)時,它會先檢查這個檔案的資料是不是已經在頁快取記憶體中了。如果在,就放棄訪問磁碟,直接從記憶體中讀取。這個行為稱為快取命中。如果資料不在快取中,就是未命中快取,此時核心就要排程塊 I/O 操作從磁碟去讀取資料。然後核心將讀來的資料放入頁快取記憶體中。這種快取的目標是檔案系統可以識別的檔案(比如 /etc/hosts)。
頁快取記憶體對塊裝置檔案的快取就是我們在前面介紹的 buffer cahce。因為獨立的磁碟塊通過緩衝區也被存入了頁快取記憶體(緩衝區最終是由頁快取記憶體來承載的)。

到這裡我們應該搞清楚了:無論是緩衝區還是頁快取記憶體,它們的實現方式都是一樣的。緩衝區只不過是一種概念上比較特殊的頁快取記憶體罷了。
那麼為什麼 free 命令不直接稱為 cache 而非要寫成 buff/cache? 這是因為緩衝區和頁快取記憶體的實現並非天生就是統一的。在 linux 核心 2.4 中才將它們統一。更早的核心中有兩個獨立的磁碟快取:頁快取記憶體和緩衝區快取記憶體。前者快取頁面,後者快取緩衝區。當你知道了這些故事之後,輸出中列的名稱可能已經不再重要了。

free 與 available

在 free 命令的輸出中,有一個 free 列,同時還有一個 available 列。這二者到底有何區別?
free 是真正尚未被使用的實體記憶體數量。至於 available 就比較有意思了,它是從應用程式的角度看到的可用記憶體數量。Linux 核心為了提升磁碟操作的效能,會消耗一部分記憶體去快取磁碟資料,就是我們介紹的 buffer 和 cache。所以對於核心來說,buffer 和 cache 都屬於已經被使用的記憶體。當應用程式需要記憶體時,如果沒有足夠的 free 記憶體可以用,核心就會從 buffer 和 cache 中回收記憶體來滿足應用程式的請求。所以從應用程式的角度來說,available = free + buffer + cache。請注意,這只是一個很理想的計算方式,實際中的資料往往有較大的誤差。

交換空間(swap space)

swap space 是磁碟上的一塊區域,可以是一個分割槽,也可以是一個檔案。所以具體的實現可以是 swap 分割槽也可以是 swap 檔案。當系統實體記憶體吃緊時,Linux 會將記憶體中不常訪問的資料儲存到 swap 上,這樣系統就有更多的實體記憶體為各個程序服務,而當系統需要訪問 swap 上儲存的內容時,再將 swap 上的資料載入到記憶體中,這就是常說的換出和換入。交換空間可以在一定程度上緩解記憶體不足的情況,但是它需要讀寫磁碟資料,所以效能不是很高。

現在的機器一般都不太缺記憶體,如果系統預設還是使用了 swap 是不是會拖累系統的效能?理論上是的,但實際上可能性並不是很大。並且核心提供了一個叫做 swappiness 的引數,用於配置需要將記憶體中不常用的資料移到 swap 中去的緊迫程度。這個引數的取值範圍是 0~100,0 告訴核心儘可能的不要將記憶體資料移到 swap 中,也即只有在迫不得已的情況下才這麼做,而 100 告訴核心只要有可能,儘量的將記憶體中不常訪問的資料移到 swap 中。在 ubuntu 系統中,swappiness 的預設值是 60。如果我們覺著記憶體充足,可以在 /etc/sysctl.conf 檔案中設定 swappiness:

vm.swappiness=10

如果系統的記憶體不足,則需要根據實體記憶體的大小來設定交換空間的大小。具體的策略網上有很豐富的資料,這裡筆者不再贅述。

/proc/meminfo 檔案

其實 free 命令中的資訊都來自於 /proc/meminfo 檔案。/proc/meminfo 檔案包含了更多更原始的資訊,只是看起來不太直觀:

$ cat /proc/meminfo