1. 程式人生 > >Linux工具效能調優系列二:buffer和cache

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,現在試著回答剛開始提出的問題:目前的系統記憶體情況是怎麼樣的

五,參考文獻

1,www.cnblogs.com/sparkdev/p/…

2,linuxperf.com/?p=142