Linux工具效能調優系列二:buffer和cache
一,案例入門
我們來看一個例子,我們來看free輸出,free採集資料來源是:/proc/meminfo檔案,對於這個檔案,會貫穿這個系列。
[email protected]:~# free
total used free shared buff/cache available
Mem: 32895096 1698396 8197904 307688 22998796 30343448
Swap: 31250428 114992 31135436
複製程式碼
從上面的輸出我們可以得到什麼呢?系統當前記憶體是否夠用?什麼是buffer,什麼是cqche,帶著這些問題,我們接著往下看。
二,cache和buffer
2.1 cache
2.1.1 定義
首先明確一點,在記憶體管理中,cache指的是:page cache。page cache即頁面快取記憶體,是針對檔案系統的,儲存的是檔案的檔案資料(檔案分為元資料和檔案資料)。
2.1.2 哪些cache無法被回收
我們執行回收cache命令
[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# 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的記憶體。這塊不深入講解,有興趣的再去自己嘗試下。
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
[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# cat /proc/meminfo
MemTotal: 32887860 kB
MemFree: 15764108 kB
MemAvailable: 17081976 kB
Buffers: 1792 kB
Cached: 1191456 kB
複製程式碼
(2) 執行命令及結果
[[email protected] ~]# cp hyperkube /tmp/hyperkube
[[email protected] ~]# cat /proc/meminfo
MemTotal: 32887860 kB
MemFree: 15240656 kB
MemAvailable: 17092320 kB
Buffers: 18016 kB
Cached: 1708088 kB
複製程式碼
可以看到,cached和buffer都增多
四,問題
1,現在試著回答剛開始提出的問題:目前的系統記憶體情況是怎麼樣的