咱們來看一個例子,咱們來看free輸出,free採集數據來源是:/proc/meminfo文件,對於這個文件,會貫穿這個系列。html
root@szdc-calic-2-6:~# free
total used free shared buff/cache available
Mem: 32895096 1698396 8197904 307688 22998796 30343448
Swap: 31250428 114992 31135436
複製代碼
從上面的輸出咱們能夠獲得什麼呢?系統當前內存是否夠用?什麼是buffer,什麼是cache,當前可分配的內存還剩下多少?帶着這些問題,咱們接着往下看。node
首先明確一點,在內存管理中,cache指的是:page cache。page cache即頁面高速緩存,是針對文件系統的,存儲的是文件的文件數據(文件分爲元數據和文件數據)。linux
咱們執行回收cache命令緩存
[root@k8s-dbg-master-1 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@k8s-dbg-master-1 ~]# free -m
total used free shared buff/cache available
Mem: 32117 8622 720 16056 22773 949
Swap: 16383 216 16167
複製代碼
從上面咱們知道,即便咱們執行清理cache命令,仍然有部分cache沒法回收,這些沒法回收的包括:tmpfs,共享內存,mmap申請標誌狀態爲MAP_SHARED的內存。這塊不深刻講解,有興趣的再去本身嘗試下。bash
(1) 在內存管理中,buffer指的是:buffer cache。buffer cache是是塊設備的讀寫緩衝區。咱們繼續補充知識,操做系統是以塊的概念操做磁盤的,一個塊會包含一個或者多個扇區,可是不會超過一個頁面大小。spa
(2) buffers主要用於緩存文件系統中的元數據信息(dentries、inodes),和另一些不是文件數據的塊,例如metadata和raw block I/O,所以仍是須要單獨用buffer cache來緩存。操作系統
在內核2.6之後,二者結構進行統一,都是page cache,page中含有一個個的buffer結構,因此咱們的free命令中,也將二者進行統一。二者是配合使用的,當咱們對一個文件進行寫操做時候,page cache的內容會被改變,而buffer cache則能夠將page標記不一樣的緩衝區(buffer),並記錄哪一個塊被修改,這樣,髒數據回寫時候,就不用回寫整個page,而只要回寫修改的塊。code
咱們將直接使用案例對cache進行分析,看看操做系統中會如何使用。事先準備一個大文件,對大文件進行讀操做。htm
[root@k8s-dbg-master-1 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@k8s-dbg-master-1 ~]# cat /proc/meminfo
MemTotal: 32887860 kB
MemFree: 15764108 kB
MemAvailable: 17081976 kB
Buffers: 1792 kB
Cached: 1191456 kB
複製代碼
[root@k8s-dbg-master-1 ~]# cp hyperkube /tmp/hyperkube
[root@k8s-dbg-master-1 ~]# cat /proc/meminfo
MemTotal: 32887860 kB
MemFree: 15240656 kB
MemAvailable: 17092320 kB
Buffers: 18016 kB
Cached: 1708088 kB
複製代碼
能夠看到,cached和buffer都增多blog
1,如今試着回答剛開始提出的問題:目前的系統內存狀況是怎麼樣的