詳解CentOS的free命令

1.在CentOS6及以前的版本中

在CentOS6及以前的版本中,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 也負責了大部分的塊設備文件的緩存工作。

詳解CentOS的free命令詳解CentOS的free命令

什麼是 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 中的數據和對應硬盤文件上的數據是否一致,如果不一致需要寫回,之後才能回收。

在系統中除了內存將被耗盡的時候可以清緩存以外,我們還可以使用下面這個文件來人工觸發緩存清除的操作:

[root@tencent64 ~]# 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 分配器中的緩存對象。

本文地址:https://www.linuxprobe.com/centos-free-command.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章