天天看點

Linux性能監控-記憶體-free指令1 簡介2 free指令格式3 指令使用輸出簡介buff/cachefree 與 available交換空間(swap space)/proc/meminfo 檔案

1 簡介

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

2 free

指令格式

free [參數]
           

參數說明

-b:以Byte為機關顯示記憶體使用情況;
-k:以KB為機關顯示記憶體使用情況;
-m:以MB為機關顯示記憶體使用情況;
-h: 以合适的機關顯示記憶體使用情況
-o:不顯示緩沖區調節列;
-s<間隔秒數>:持續觀察記憶體使用狀況;
-t:顯示記憶體總和列;
-V:顯示版本資訊。
           

3 指令使用

3.1 free -h

說明:以合适的機關顯示記憶體使用情況

[[email protected] ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            15G         11G        212M        164M        4.0G        3.5G
Swap:          3.9G        4.8M        3.9G
           

3.2 free -h -s 3

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

[[email protected] ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            15G         11G        212M        164M        4.0G        3.5G
Swap:          3.9G        4.8M        3.9G
           

輸出簡介

下面先解釋一下輸出的内容:

Mem 行(第二行)是記憶體的使用情況。

Swap 行(第三行)是交換空間的使用情況。

total 列顯示系統總的可用實體記憶體和交換空間大小。

used 列顯示已經被使用的實體記憶體和交換空間。

free 列顯示還有多少實體記憶體和交換空間可用使用。

shared 列顯示被共享使用的實體記憶體大小。

buff/cache 列顯示被 buffer 和 cache 使用的實體記憶體大小。

available 列顯示還可以被應用程式使用的實體記憶體大小。

3.3 概念介紹

buff/cache

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

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

Linux性能監控-記憶體-free指令1 簡介2 free指令格式3 指令使用輸出簡介buff/cachefree 與 available交換空間(swap space)/proc/meminfo 檔案

注意,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 檔案包含了更多更原始的資訊,隻是看起來不太直覺:

繼續閱讀