CentOS上free命令詳解
$free -m
total used free shared buffers cached
Mem: 1002 769 233 0 62 421
-/+ buffers/cache: 286 716
Swap: 1153 0 1153
第一行:
系統記憶體主要分為四部分:used(程式已使用記憶體),free(空閒記憶體),buffers(buffer cache),cached(Page cache)。
系統總記憶體total = used + free; buffers和cached被算在used裡,因此第一行系統已使用記憶體used = buffers + cached + 第二行系統已使用記憶體used
由於buffers和cached在系統需要時可以被回收使用,因此係統可用記憶體 = free + buffers + cached;
shared為程式共享的記憶體空間,往往為0。
第二行:
正因為buffers和cached在系統需要時可以被回收使用,因此buffer和cached其實可以可以算作可用記憶體,因此:
系統可用記憶體,即第二行的free = 第一行的free + buffers + cached。
系統已使用記憶體,即第二行的used = total - 第二行free
第三行:
swap記憶體交換空間使用情況
2. CentOS7及以後
CentOS7及以後free命令的輸出如下:
# free -m
total used free shared buff/cache available
Mem: 3440 213 2276 168 950 2778
Swap: 0 0 0
buffer和cached被合成一組,加入了一個available,關於此available,文件上的說明如下:
•MemAvailable: An estimate of how much memory is available for starting new applications, without swapping.
即系統可用記憶體,之前說過由於buffer和cache可以在需要時被釋放回收,系統可用記憶體即 free + buffer + cache,在CentOS7之後這種說法並不準確,因為並不是所有的buffer/cache空間都可以被回收。
即available = free + buffer/cache - 不可被回收記憶體(共享記憶體段、tmpfs、ramfs等)。
因此在CentOS7之後,使用者不需要去計算buffer/cache,即可以看到還有多少記憶體可用,更加簡單直觀。
3. buffer/cache相關介紹
##什麼是buffer/cache?
buffer 和 cache 是兩個在計算機技術中被用濫的名詞,放在不通語境下會有不同的意義。在 Linux 的記憶體管理中,這裡的 buffer 指 Linux 記憶體的: Buffer cache 。這裡的 cache 指 Linux 記憶體中的: Page cache 。翻譯成中文可以叫做緩衝區快取和頁面快取。在歷史上,它們一個( buffer )被用來當成對 io 裝置寫的快取,而另一個( cache )被用來當作對 io 裝置的讀快取,這裡的 io 裝置,主要指的是塊裝置檔案和檔案系統上的普通檔案。但是現在,它們的意義已經不一樣了。在當前的核心中, page cache 顧名思義就是針對記憶體頁的快取,說白了就是,如果有記憶體是以 page 進行分配管理的,都可以使用 page cache 作為其快取來管理使用。當然,不是所有的記憶體都是以頁( page )進行管理的,也有很多是針對塊( block )進行管理的,這部分記憶體使用如果要用到 cache 功能,則都集中到 buffer cache 中來使用。(從這個角度出發,是不是 buffer cache 改名叫做 block cache 更好?)然而,也不是所有塊( block )都有固定長度,系統上塊的長度主要是根據所使用的塊裝置決定的,而頁長度在 X86 上無論是 32 位還是 64 位都是 4k 。
明白了這兩套快取系統的區別,就可以理解它們究竟都可以用來做什麼了。
##什麼是 page cache
Page cache 主要用來作為檔案系統上的檔案資料的快取來用,尤其是針對當程序對檔案有 read / write 操作的時候。如果你仔細想想的話,作為可以對映檔案到記憶體的系統呼叫: mmap 是不是很自然的也應該用到 page cache ?在當前的系統實現裡, page cache 也被作為其它檔案型別的快取裝置來用,所以事實上 page cache 也負責了大部分的塊裝置檔案的快取工作。
##什麼是 buffer cache
Buffer cache 則主要是設計用來在系統對塊裝置進行讀寫的時候,對塊進行資料快取的系統來使用。這意味著某些對塊的操作會使用 buffer cache 進行快取,比如我們在格式化檔案系統的時候。一般情況下兩個快取系統是一起配合使用的,比如當我們對一個檔案進行寫操作的時候, page cache 的內容會被改變,而 buffer cache 則可以用來將 page 標記為不同的緩衝區,並記錄是哪一個緩衝區被修改了。這樣,核心在後續執行髒資料的回寫( writeback )時,就不用將整個 page 寫回,而只需要寫回修改的部分即可。
##如何回收 cache ?
Linux 核心會在記憶體將要耗盡的時候,觸發記憶體回收的工作,以便釋放出記憶體給急需記憶體的程序使用。一般情況下,這個操作中主要的記憶體釋放都來自於對 buffer / cache 的釋放。尤其是被使用更多的 cache 空間。既然它主要用來做快取,只是在記憶體夠用的時候加快程序對檔案的讀寫速度,那麼在記憶體壓力較大的情況下,當然有必要清空釋放 cache ,作為 free 空間分給相關程序使用。所以一般情況下,我們認為 buffer/cache 空間可以被釋放,這個理解是正確的。
但是這種清快取的工作也並不是沒有成本。理解 cache 是幹什麼的就可以明白清快取必須保證 cache 中的資料跟對應檔案中的資料一致,才能對 cache 進行釋放。所以伴隨著 cache 清除的行為的,一般都是系統 IO 飆高。因為核心要對比 cache 中的資料和對應硬碟檔案上的資料是否一致,如果不一致需要寫回,之後才能回收。
在系統中除了記憶體將被耗盡的時候可以清快取以外,我們還可以使用下面這個檔案來人工觸發快取清除的操作:
[[email protected] ~]# cat /proc/sys/vm/drop_caches
1
方法是:
echo 1 > /proc/sys/vm/drop_caches
當然,這個檔案可以設定的值分別為 1 、 2 、 3 。它們所表示的含義為:
echo 1 > /proc/sys/vm/drop_caches:表示清除 pagecache 。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收 slab 分配器中的物件(包括目錄項快取和 inode 快取)。 slab 分配器是核心中管理記憶體的一種機制,其中很多快取資料實現都是用的 pagecache 。
echo 3 > /proc/sys/vm/drop_caches:表示清除 pagecache 和 slab 分配器中的快取物件。