生活随笔
收集整理的這篇文章主要介紹了
Linux buffer/cache异同
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
buffers與cached 1)、異同點(diǎn) 在Linux 操作系統(tǒng)中,當(dāng)應(yīng)用程序需要讀取文件中的數(shù)據(jù)時(shí),操作系統(tǒng)先分配一些內(nèi)存,將數(shù)據(jù)從磁盤讀入到這些內(nèi)存中,然后再將數(shù)據(jù)分發(fā)給應(yīng)用程序;當(dāng)需要往文件中寫 數(shù)據(jù)時(shí),操作系統(tǒng)先分配內(nèi)存接收用戶數(shù)據(jù),然后再將數(shù)據(jù)從內(nèi)存寫到磁盤上。然而,如果有大量數(shù)據(jù)需要從磁盤讀取到內(nèi)存或者由內(nèi)存寫入磁盤時(shí),系統(tǒng)的讀寫性 能就變得非常低下,因?yàn)闊o論是從磁盤讀數(shù)據(jù),還是寫數(shù)據(jù)到磁盤,都是一個(gè)很消耗時(shí)間和資源的過程,在這種情況下,Linux引入了buffers和 cached機(jī)制。 buffers與cached都是內(nèi)存操作,用來保存系統(tǒng)曾經(jīng)打開過的文件以及文件屬性信息,這樣當(dāng)操作系統(tǒng)需要讀取某些文件時(shí),會(huì)首先在buffers 與cached內(nèi)存區(qū)查找,如果找到,直接讀出傳送給應(yīng)用程序,如果沒有找到需要數(shù)據(jù),才從磁盤讀取,這就是操作系統(tǒng)的緩存機(jī)制,通過緩存,大大提高了操 作系統(tǒng)的性能。但buffers與cached緩沖的內(nèi)容卻是不同的。 buffers是用來緩沖塊設(shè)備做的,它只記錄文件系統(tǒng)的元數(shù)據(jù)(metadata)以及 tracking in-flight pages,而cached是用來給文件做緩沖。更通俗一點(diǎn)說:buffers主要用來存放目錄里面有什么內(nèi)容,文件的屬性以及權(quán)限等等。而cached直接用來記憶我們打開過的文件和程序。buffer理解為find,ll,ls 時(shí)的緩存,cache理解為vi,vim的緩存 為了驗(yàn)證我們的結(jié)論是否正確,可以通過vi打開一個(gè)非常大的文件,看看cached的變化,然后再次vi這個(gè)文件,感覺一下兩次打開的速度有何異同,是不 是第二次打開的速度明顯快于第一次呢?這里提供一個(gè)小腳本打印首次及第二次打開一個(gè)大文件(catalina.logaa? 約2G)耗時(shí)及cached/buffers的變化:
#!/bin/bash
sync
sync
echo 3 > /proc/sys/vm/drop_caches
echo -e "----------------------緩存釋放后,內(nèi)存使用情況(KB):----------------------"
free
cached1=`free |grep Mem:|awk '{print $7}'`
buffers1=`free |grep Mem:|awk '{print $6}'`
date1=`date +"%Y%m%d%H%M%S"`
cat catalina.logaa >1
date2=`date +"%Y%m%d%H%M%S"`
echo -e "----------------------首次讀取大文件后,內(nèi)存使用情況(KB):----------------------"
free
cached2=`free |grep Mem:|awk '{print $7}'`
buffers2=`free |grep Mem:|awk '{print $6}'`
#echo $date1
#echo $date2
interval_1=`expr ${date2} - ${date1}`
cached_increment1=`expr ${cached2} - ${cached1}`
buffers_increment1=`expr ${buffers2} - ${buffers1}` date3=`date +"%Y%m%d%H%M%S"`
cat catalina.logaa >1
date4=`date +"%Y%m%d%H%M%S"`
echo -e "----------------------再次讀取大文件后,內(nèi)存使用情況(KB):----------------------"
free
cached3=`free |grep Mem:|awk '{print $7}'`
buffers3=`free |grep Mem:|awk '{print $6}'`
#echo $date3
#echo $date4
interval_2=`expr ${date4} - ${date3}`
cached_increment2=`expr ${cached3} - ${cached2}`
buffers_increment2=`expr ${buffers3} - ${buffers2}`
echo -e "----------------------統(tǒng)計(jì)匯總數(shù)據(jù)如下:----------------------"
echo -e "首次讀取大文件,cached增量:${cached_increment1},單位:KB"
echo -e "首次讀取大文件,buffers增量:${buffers_increment1},單位:KB"
echo -e "首次讀取大文件,耗時(shí):${interval_1},單位:s \n"
echo -e "再次讀取大文件,cached增量:${cached_increment2},單位:KB"
echo -e "再次讀取大文件,buffers增量:${buffers_increment2},單位:KB"
echo -e "再次讀取大文件,耗時(shí):${interval_2},單位:s"
執(zhí)行結(jié)果如下(由于打印出來的free結(jié)果跟參數(shù)賦值時(shí)用的free命令之間有時(shí)間間隔,計(jì)算起來可能會(huì)略有不同): 接著執(zhí)行下面的命令:find /* -name? *.conf ,看 看buffers的值是否變化,然后重復(fù)執(zhí)行find命令,看看兩次顯示速度有何不同。如下腳本(需要注意使用bc計(jì)算浮點(diǎn)型數(shù)據(jù)時(shí)需要安裝相應(yīng)軟件,我 的系統(tǒng)是centos7.0,內(nèi)核4.3.3的版本,安裝的是bc-1.06.95-13.el7.x86_64服務(wù)):
#!/bin/bash
sync
sync
echo 3 > /proc/sys/vm/drop_caches
echo -e "----------------------緩存釋放后,內(nèi)存使用情況(KB):----------------------"
free
cached1=`free |grep Mem:|awk '{print $7}'`
buffers1=`free |grep Mem:|awk '{print $6}'`
date1=`date +%s.%N`
find /* -name *.conf >2
date2=`date +%s.%N`
echo -e "----------------------首次查詢后,內(nèi)存使用情況(KB):----------------------"
free
cached2=`free |grep Mem:|awk '{print $7}'`
buffers2=`free |grep Mem:|awk '{print $6}'`
#echo $date1
#echo $date2
interval_1=`echo "scale=3; ${date2} - ${date1}" | bc`
cached_increment1=`expr ${cached2} - ${cached1}`
buffers_increment1=`expr ${buffers2} - ${buffers1}` date3=`date +%s.%N`
find /* -name *.conf >2
date4=`date +%s.%N`
echo -e "----------------------再次查詢后,內(nèi)存使用情況(KB):----------------------"
free
cached3=`free |grep Mem:|awk '{print $7}'`
buffers3=`free |grep Mem:|awk '{print $6}'`
#echo $date3
#echo $date4
interval_2=`echo "scale=3; ${date4} - ${date3}" | bc`
cached_increment2=`expr ${cached3} - ${cached2}`
buffers_increment2=`expr ${buffers3} - ${buffers2}`
echo -e "----------------------統(tǒng)計(jì)匯總數(shù)據(jù)如下:----------------------"
echo -e "首次查詢,cached增量:${cached_increment1},單位:KB"
echo -e "首次查詢,buffers增量:${buffers_increment1},單位:KB"
echo -e "首次查詢,耗時(shí):${interval_1},單位:s \n"
echo -e "再次查詢,cached增量:${cached_increment2},單位:KB"
echo -e "再次查詢,buffers增量:${buffers_increment2},單位:KB"
echo -e "再次查詢,耗時(shí):${interval_2},單位:s"
結(jié)果如下(最后那個(gè)應(yīng)該是0.470702440,使用bc計(jì)算的時(shí)候那個(gè)0被去掉了): 2、內(nèi)存釋放 ??? linux系統(tǒng)中/proc是一個(gè)虛擬文件系統(tǒng),我們可以通過對(duì)它的讀寫操作做為與kernel實(shí)體間進(jìn)行通信的一種手段。也就是說可以通過修改 /proc中的文件,來對(duì)當(dāng)前kernel的行為做出調(diào)整。那么我們可以通過調(diào)整/proc/sys/vm/drop_caches來釋放內(nèi)存。關(guān)于drop_caches,官方給出的說法是:
Writing to this will cause thekernel to drop clean caches, dentries and inodes from memory, causing thatmemory to become free. To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries andinodes: echo 3 > /proc/sys/vm/drop_caches As this is a non-destructiveoperation and dirty objects are not freeable, the user should run `sync' first. http://www.kernel.org/doc/Documentation/sysctl/vm.txt
# cat /proc/sys/vm/drop_caches 0 默認(rèn)是0,1表示清空頁緩存,2表示清空inode和目錄樹緩存,3清空所有的緩存
[root@hps103 ~]# sync
[root@hps103 ~]# free -mtotal used free shared buffers cached
Mem: 499 323 175 0 52 188
-/+ buffers/cache: 82 416
Swap: 2047 0 2047[root@hps103 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@hps103 ~]# free -m //發(fā)現(xiàn)緩存明顯減少了total used free shared buffers cached
Mem: 499 83 415 0 1 17
-/+ buffers/cache: 64 434
Swap: 2047 0 2047
轉(zhuǎn)載于:https://www.cnblogs.com/AmilyWilly/p/9285048.html
總結(jié)
以上是生活随笔 為你收集整理的Linux buffer/cache异同 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。