free命令中的buffers和cached
Posted on January 17, 2012 by admin
原創(chuàng)文章,轉(zhuǎn)載請注明 最近有好幾位同事問我關(guān)于free(1)結(jié)果中buffers和cached的區(qū)別,一直很佩服@淘寶褚霸 對知識的無私分享,所以今天就以這個話題開始我的blog吧,但愿有機會時常更新它,爭取2012年能夠做到至少一個月一篇吧,呵呵!閑話少說,進入正題。 free命令大家都經(jīng)常使用, taotaoma@tma-laptop1:~/kernel/linux-2.6$ free 各個內(nèi)容的顯示應該還算是簡單明了的,唯一比較讓人困惑的兩項就是buffers和cached。一般的認識都是說buffers指的是元數(shù)據(jù)的數(shù)量,而cached是指文件的page cache的數(shù)量。那么真的是這樣么? 其 實現(xiàn)在的linux內(nèi)核中對于緩存的管理都是以page的形式進行的,也就是說在系統(tǒng)底層只存在各種page,這些page保存在不同的tree 中,buffer這個概念實際上已經(jīng)過時了,但是為了保持對過往系統(tǒng)的兼容性,linux內(nèi)核中還保留了這個概念,并仍然用它來代表文件系統(tǒng)中的一些所謂的元數(shù)據(jù),但是由于已經(jīng)沒有buffer了,那么free該怎么顯示buffers呢?內(nèi)核巧妙的利用了一個特性,那就是文件系統(tǒng)在讀取元數(shù)據(jù)的時候一般都是通過它所對應的塊設(shè)備來進行,也就是說元數(shù)據(jù)存儲的page一般都是保存在塊設(shè)備對應的tree中,而一般文件的page cache則是保存在它的宿主文件的tree中。有了這個假設(shè),我們就可以通過統(tǒng)計所有在塊設(shè)備的tree上的page來得出系統(tǒng)的buffers數(shù)量。 這一塊對應的代碼是這樣的(以2.6.32的代碼為例): free是通過讀取/proc/meminfo里面的數(shù)據(jù)來顯示的,而/proc/meminfo的具體實現(xiàn)代碼在Linux內(nèi)核中的fs/proc/meminfo.c里面。 sysinfo.bufferram是通過函數(shù)si_meminfo得到的,查看si_memeinfo可以看到這樣一行: val->bufferram = nr_blockdev_pages(); 而對應的函數(shù)就很簡單了 long nr_blockdev_pages(void) 遍歷所有的塊設(shè)備,然后把所有的塊設(shè)備tree上的pages數(shù)目加起來,然后返回,是不是一目了然呢! 問題到這里真的就結(jié)束了么?非也非也,這樣的算法明顯很不精確,因為如果我直接操作裸設(shè)備,那內(nèi)核如何區(qū)分呢?大家可以做一個簡單的測試。 echo 3 > /proc/sys/vm/drop_caches free dd if=/dev/sda of=/dev/null bs=1M count=1000 free 相信大家一定都看到了buffers的劇烈增長了吧!由于你像文件系統(tǒng)一樣直接通過塊設(shè)備來讀取設(shè)備的內(nèi)容,所以內(nèi)核把你這次操作讀取的page都算作了buffers,也就從側(cè)面驗證了free命令中計算buffers所用的算法。 |
|
來自: astrotycoon > 《hack》