free命令詳解


free命令詳解

1. 簡介

free 命令是一個既簡單又復雜的命令。簡單是因為這個命令的參數少,輸出結果清晰。說它復雜則是因為它背后是比較晦澀的操作系統中的概念,如果不清楚這些概念,即便看了 free 命令的輸出也 get 不到多少有價值的信息。

2. free常用參數介紹

1.free 命令顯示系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩沖區內存。

#默認 free 會以 KB 為單位顯示信息
[root@free ~]# free
              total        used        free      shared  buff/cache   available
Mem:         995880       86356      796512        7644      113012      767208
Swap:       2097148           0     2097148

2.也可以后面加上一些計量的單位

[root@free ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972          84         777           7         110         749
Swap:          2047           0        2047
[root@free ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:              0           0           0           0           0           0
Swap:             1           0           1
#free 同樣提供了-h選項,這意味着適於人類可讀(比較友好)
[root@free ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           972M         84M        777M        7.5M        110M        749M
Swap:          2.0G          0B        2.0G
#有時我們需要持續的觀察內存的狀況,此時可以使用 -s 選項並指定間隔的秒數:
[root@free ~]# free -hs 3
              total        used        free      shared  buff/cache   available
Mem:           972M         84M        777M        7.5M        110M        749M
Swap:          2.0G          0B        2.0G

              total        used        free      shared  buff/cache   available
Mem:           972M         84M        777M        7.5M        110M        749M
Swap:          2.0G          0B        2.0G

              total        used        free      shared  buff/cache   available
Mem:           972M         84M        777M        7.5M        110M        749M
Swap:          2.0G          0B        2.0G


#上面的命令每隔 3 秒輸出一次內存的使用情況,直到你按下 ctrl + c。
#如果我們想要知道高低內存統計,我們可以使用-l選項
[root@free ~]# free -l
              total        used        free      shared  buff/cache   available
Mem:         995880       86428      796328        7644      113124      767032
Low:         995880      199552      796328
High:             0           0           0
Swap:       2097148           0     2097148
#如果需要每列的總計信息,也可以在 free 命令后面跟上 -t 選項。
[root@free ~]# free -t
              total        used        free      shared  buff/cache   available
Mem:         995880       86608      796148        7644      113124      766852
Swap:       2097148           0     2097148
Total:      3093028       86608     2893296
#更多選項請欣賞 free -help
[root@free ~]# free -help
free:無效選項 -- e

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
     --peta          show output in petabytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit
 -w, --wide          wide output

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

3. 參數詳解

參數 釋義
Mem 內存的使用情況
total 內存總數,物理內存總數
used 已經使用的內存數
free 空閑的內存數
shared 多個進程共享的內存總額
buff/cache 被 buffer 和 cache 使用的物理內存大小
available 還可以被應用程序使用的物理內存大小
Swap 交換分區,虛擬內存

4. 名詞詳解

4.1 buff/cache

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

buffer 在操作系統中指 buffer cache, 中文一般翻譯為 "緩沖區"。要理解緩沖區,必須明確另外兩個概念:"扇區" 和 "塊"。扇區是設備的最小尋址單元,也叫 "硬扇區" 或 "設備塊"。塊是操作系統中文件系統的最小尋址單元,也叫 "文件塊" 或 "I/O 塊"。每個塊包含一個或多個扇區,但大小不能超過一個頁面,所以一個頁可以容納一個或多個內存中的塊。當一個塊被調入內存時,它要存儲在一個緩沖區中。每個緩沖區與一個塊對應,它相當於是磁盤塊在內存中的表示:

image.png-36.6kB

注意,buffer cache 只有塊的概念而沒有文件的概念,它只是把磁盤上的塊直接搬到內存中而不關心塊中究竟存放的是什么格式的文件

cache 在操作系統中指 page cache,中文一般翻譯為 "頁高速緩存"。頁高速緩存是內核實現的磁盤緩存。它主要用來減少對磁盤的 I/O 操作。具體地講,是通過把磁盤中的數據緩存到物理內存中,把對磁盤的訪問變為對物理內存的訪問。頁高速緩存緩存的是內存頁面。緩存中的頁來自對普通文件、塊設備文件(這個指的就是 buffer cache 呀)和內存映射文件的讀寫

頁高速緩存對普通文件的緩存我們可以這樣理解:當內核要讀一個文件(比如 /etc/hosts)時,它會先檢查這個文件的數據是不是已經在頁高速緩存中了。如果在,就放棄訪問磁盤,直接從內存中讀取。這個行為稱為緩存命中。如果數據不在緩存中,就是未命中緩存,此時內核就要調度塊 I/O 操作從磁盤去讀取數據。然后內核將讀來的數據放入頁高速緩存中。這種緩存的目標是文件系統可以識別的文件(比如 /etc/hosts)。
頁高速緩存對塊設備文件的緩存就是我們在前面介紹的 buffer cahce。因為獨立的磁盤塊通過緩沖區也被存入了頁高速緩存(緩沖區最終是由頁高速緩存來承載的)。

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

4.2 free 與 available

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

4.3 交換空間(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

如果系統的內存不足,則需要根據物理內存的大小來設置交換空間的大小。

4.4 /proc/meminfo 文件

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

image.png-101kB


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM