centos6 free 和 centos 7的free 的差異與對比
在實際的工作中,我們經常會用到free這個命令,但是我們對這個命令的實際含義又知道多少,它在centos6 和centos 7 的顯示又有什麼差異?讓我們一起瞧一瞧,看一看。
一 centos6 free
free 命令預設是使用 kb 作為單位的,free -m 則是以Mb作為單位的,free -g 是以gb作為單位的,gb-->mb-->kb 採用的是1024度量單位(而非1000)
常用引數和含義
-b指定單位為bytes -m指定單位為mb -k指定單位為kb -g指定單位為gb -o顯示老版本的輸出格式也就是不顯示-/+ buffers/cache 這行 -t顯示實體記憶體和虛擬記憶體的總和 -sn 每隔n秒顯示一次 -c顯示多少次 -V顯示free的版本資訊並退出 -l顯示最低和最高的記憶體資料統計
centos6 free 命令示例
[djx@xiaoxiao ~]$ cat /etc/redhat-release CentOS release 6.5 (Final) [djx@xiaoxiao ~]$ free totalusedfreesharedbufferscached Mem:8061376773038033099601786084884772 -/+ buffers/cache:26670005394376 Swap:000 [djx@xiaoxiao ~]$ free -m totalusedfreesharedbufferscached Mem:7872751935201744737 -/+ buffers/cache:26075264 Swap:000 [djx@xiaoxiao ~]$ free -g totalusedfreesharedbufferscached Mem:770004 -/+ buffers/cache:25 Swap:000
free 值講解
我們這裡以free 的值來進行講解(顯得精確些)
[djx@xiaoxiao ~]$ free totalusedfreesharedbufferscached Mem:8061376(total)7730380(used1)330996(free1)0178608(buffers1)4884772(cached1) -/+ buffers/cache:2667000(used2)5394376(free2) Swap:000
Mem
total代表總的記憶體大小, used 代表程式已經使用的記憶體大小,free代表的是空閒的記憶體大小, shared 代表的是共享記憶體,buffers 代表的是 buffers cache, cached 代表的是 Page cache.
-/+ buffers/cache
used 代表的除去buffers和cached實際程式佔用的記憶體, free代表的是 total - 第二行used, 也就是 第一行free + 第一行buffers + 第一行cached
Swap
這行代表的是交換分割槽(虛擬記憶體)。
計算公式
total=used1 + free1 ,總的記憶體大小= 使用的(used1)+ 空閒的(free1) used1 = used2(第二行的2667000) + buffers1(178608)+ cached1(4884772) used2 = total - free2 free2 = free1 + buffers1(178608)+ cached1(4884772)
二 centos7 free
centos7 的free 命令多了一個 -h 引數,它會自動根據記憶體的大小,自動轉換成合適的單位,預設的計算倍數是 1024 。free 的顯示資訊來自於/proc/meminfo
常用的引數
-h以人性化顯示 --si 指定計算倍數為1000. -b指定單位為bytes -m指定單位為mb -k指定單位為kb -g指定單位為gb -t顯示實體記憶體和虛擬記憶體的總和 -sn 每隔n秒顯示一次 -c顯示多少次 -V顯示free的版本資訊並退出 -l顯示最低和最高的記憶體資料統計 -w將buff和cacher 分開顯示,預設是在一起顯示的。
centos7 free 命令示例
[root@localhost ~]# cat/etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@localhost ~]# free -h totalusedfreesharedbuff/cacheavailable Mem:1.8G197M1.3G9.4M272M1.4G Swap:2.0G0B2.0G [root@localhost ~]# free -wh totalusedfreesharedbufferscacheavailable Mem:1.8G197M1.3G9.4M2.1M270M1.4G Swap:2.0G0B2.0G
以 free -h 的值為例,
Mem :
total 代表的總的記憶體 (對應/proc/meminfo 裡的MemTotal) used 代表的是 已經使用的記憶體 free 是代表空閒的記憶體(對應/proc/meminfo 裡的MemFree) shared 代表的是共享的記憶體(對應/proc/meminfo 裡的Shmem) buff/cache 代表的是 buff(對應/proc/meminfo裡的Buffers)和cache的記憶體(對應/proc/meminfo 裡的Cached and Slab), available 代表的是 活躍的記憶體 (官方文件對於available這樣寫到:Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields,thisfield takesintoaccountpagecacheandalso that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free) ) available 代表的是一個新的應用程式可以使用記憶體的估計值,它不等於 free +buff/cache ,因為在centos 7中並不是所有的buffer/cache空間都可以被回收。
計算公式
used=total - free - buffers - cache buff/cache = buffers + cache
三 buffers 和cache 的 介紹
buffers
buffers 指的是 Memory used by kernel buffers(磁碟等塊裝置的緩衝) ,buffers 的字面意思就是緩衝,緩衝存在的目的是為了解決從速度快的地方往速度慢的地方輸出東西,緩衝經常用於像 記憶體寫入資料到磁碟,暫存器資料寫到記憶體等等。位於記憶體buffer中的資料不是即時寫入磁碟,而是系統空閒或者buffer達到一定大小統一寫到磁碟中,所以斷電易失,為了防止資料丟失所以我們最好正常關機或者多執行幾次sync命令,讓位於buffer上的資料立刻寫到磁盤裡。
cached
cached 指的是 Memory used by the page cache and slabs(檔案系統層級的快取),cache 的字面意思是快取,快取存在的目的是為了解決從速度慢的地方獲取資料,比如我們讀取硬盤裡面的檔案,硬碟的傳輸速度是比記憶體慢很多的,當我們讀取完一個檔案後,然後重新開啟這個檔案,如果有快取,也就是將上次讀取檔案後將檔案快取在記憶體裡面,我們會發現,我們開啟檔案會比第一次開啟快很多。
針對於兩者直接的關係,我在網上看到一張圖,可以很清晰的說明

為什麼要清除 buffers 和caches
因為caches是快取的一些資料,當我們實際的資料內容已經更新了的話,那麼當我們需要獲取最新的資料時候,我們就需要清除caches裡面的內容。
或者當我們的記憶體的不足(將被耗盡)時,那麼系統會自動清除buffers 和caches ,以滿足程式對記憶體的需求。
如何清除 buffers 和caches
下圖來自網路

注意
在清除buffers 前,為了防止資料丟失所以我們最好正常關機或者多執行幾次sync命令,讓位於buffer上的資料立刻寫到磁盤裡。
方式一 :
表示清除 pagecache 。
echo 1 > /proc/sys/vm/drop_caches
表示清除回收 slab
分配器中的物件(包括目錄項快取和 inode 快取)。 slab 分配器是核心中管理記憶體的一種機制,其中很多快取資料實現都是用的 pagecache 。
echo 2 > /proc/sys/vm/drop_caches
表示清除 pagecache 和 slab 分配器中的快取物件。
echo 3 > /proc/sys/vm/drop_caches
重啟後會失效
方式二:sysctl 命令更改
sysctl-wvm.drop_caches=1
重啟後會失效
方式三:
編輯配置檔案 sysctl.conf
echo "vm.drop_caches = 1" >>/etc/sysctl.conf sysctl -p/etc/sysctl.conf
重啟後不失效。