Linux工具效能調優系列二:buffer和cache
我們來看一個例子,我們來看free輸出,free採集資料來源是:/proc/meminfo檔案,對於這個檔案,會貫穿這個系列。
root@szdc-calic-2-6:~# free totalusedfreesharedbuff/cacheavailable Mem:32895096169839681979043076882299879630343448 Swap:3125042811499231135436 複製程式碼
從上面的輸出我們可以得到什麼呢?系統當前記憶體是否夠用?什麼是buffer,什麼是cqche,帶著這些問題,我們接著往下看。
二,cache和buffer
2.1 cache
2.1.1 定義
首先明確一點,在記憶體管理中,cache指的是:page cache。page cache即頁面快取記憶體,是針對檔案系統的,儲存的是檔案的檔案資料(檔案分為元資料和檔案資料)。
2.1.2 哪些cache無法被回收
我們執行回收cache命令
[root@k8s-dbg-master-1 ~]# echo 3 > /proc/sys/vm/drop_caches [root@k8s-dbg-master-1 ~]# free -m totalusedfreesharedbuff/cacheavailable Mem:3211786227201605622773949 Swap:1638321616167 複製程式碼
從上面我們知道,即使我們執行清理cache命令,仍然有部分cache無法回收,這些無法回收的包括:tmpfs,共享記憶體,mmap申請標誌狀態為MAP_SHARED的記憶體。這塊不深入講解,有興趣的再去自己嘗試下。
2.2,buffer
2.2.1 定義
(1) 在記憶體管理中,buffer指的是:buffer cache。buffer cache是是塊裝置的讀寫緩衝區。我們繼續補充知識,作業系統是以塊的概念操作磁碟的,一個塊會包含一個或者多個扇區,但是不會超過一個頁面大小。
(2) buffers主要用於快取檔案系統中的元資料資訊(dentries、inodes),和另外一些不是檔案資料的塊,例如metadata和raw block I/O,因此還是需要單獨用buffer cache來快取。
2.3 兩者之間的關係
在核心2.6以後,兩者結構進行統一,都是page cache,page中含有一個個的buffer結構,所以我們的free命令中,也將兩者進行統一。兩者是配合使用的,當我們對一個檔案進行寫操作時候,page cache的內容會被改變,而buffer cache則可以將page標記不同的緩衝區(buffer),並記錄哪個塊被修改,這樣,髒資料回寫時候,就不用回寫整個page,而只要回寫修改的塊。
三,案例分析
3.1 案例分析
我們將直接使用案例對cache進行分析,看看作業系統中會如何使用。事先準備一個大檔案,對大檔案進行讀操作。
(1) 手動清空cache
[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 複製程式碼
(2) 執行命令及結果
[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都增多