生活随笔
收集整理的這篇文章主要介紹了
Linux buffer/cache异同
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
buffers與cached 1)、異同點 在Linux 操作系統中,當應用程序需要讀取文件中的數據時,操作系統先分配一些內存,將數據從磁盤讀入到這些內存中,然后再將數據分發給應用程序;當需要往文件中寫 數據時,操作系統先分配內存接收用戶數據,然后再將數據從內存寫到磁盤上。然而,如果有大量數據需要從磁盤讀取到內存或者由內存寫入磁盤時,系統的讀寫性 能就變得非常低下,因為無論是從磁盤讀數據,還是寫數據到磁盤,都是一個很消耗時間和資源的過程,在這種情況下,Linux引入了buffers和 cached機制。 buffers與cached都是內存操作,用來保存系統曾經打開過的文件以及文件屬性信息,這樣當操作系統需要讀取某些文件時,會首先在buffers 與cached內存區查找,如果找到,直接讀出傳送給應用程序,如果沒有找到需要數據,才從磁盤讀取,這就是操作系統的緩存機制,通過緩存,大大提高了操 作系統的性能。但buffers與cached緩沖的內容卻是不同的。 buffers是用來緩沖塊設備做的,它只記錄文件系統的元數據(metadata)以及 tracking in-flight pages,而cached是用來給文件做緩沖。更通俗一點說:buffers主要用來存放目錄里面有什么內容,文件的屬性以及權限等等。而cached直接用來記憶我們打開過的文件和程序。buffer理解為find,ll,ls 時的緩存,cache理解為vi,vim的緩存 為了驗證我們的結論是否正確,可以通過vi打開一個非常大的文件,看看cached的變化,然后再次vi這個文件,感覺一下兩次打開的速度有何異同,是不 是第二次打開的速度明顯快于第一次呢?這里提供一個小腳本打印首次及第二次打開一個大文件(catalina.logaa? 約2G)耗時及cached/buffers的變化:
#!/bin/bash
sync
sync
echo 3 > /proc/sys/vm/drop_caches
echo -e "----------------------緩存釋放后,內存使用情況(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 "----------------------首次讀取大文件后,內存使用情況(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 "----------------------再次讀取大文件后,內存使用情況(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 "----------------------統計匯總數據如下:----------------------"
echo -e "首次讀取大文件,cached增量:${cached_increment1},單位:KB"
echo -e "首次讀取大文件,buffers增量:${buffers_increment1},單位:KB"
echo -e "首次讀取大文件,耗時:${interval_1},單位:s \n"
echo -e "再次讀取大文件,cached增量:${cached_increment2},單位:KB"
echo -e "再次讀取大文件,buffers增量:${buffers_increment2},單位:KB"
echo -e "再次讀取大文件,耗時:${interval_2},單位:s"
執行結果如下(由于打印出來的free結果跟參數賦值時用的free命令之間有時間間隔,計算起來可能會略有不同): 接著執行下面的命令:find /* -name? *.conf ,看 看buffers的值是否變化,然后重復執行find命令,看看兩次顯示速度有何不同。如下腳本(需要注意使用bc計算浮點型數據時需要安裝相應軟件,我 的系統是centos7.0,內核4.3.3的版本,安裝的是bc-1.06.95-13.el7.x86_64服務):
#!/bin/bash
sync
sync
echo 3 > /proc/sys/vm/drop_caches
echo -e "----------------------緩存釋放后,內存使用情況(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 "----------------------首次查詢后,內存使用情況(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 "----------------------再次查詢后,內存使用情況(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 "----------------------統計匯總數據如下:----------------------"
echo -e "首次查詢,cached增量:${cached_increment1},單位:KB"
echo -e "首次查詢,buffers增量:${buffers_increment1},單位:KB"
echo -e "首次查詢,耗時:${interval_1},單位:s \n"
echo -e "再次查詢,cached增量:${cached_increment2},單位:KB"
echo -e "再次查詢,buffers增量:${buffers_increment2},單位:KB"
echo -e "再次查詢,耗時:${interval_2},單位:s"
結果如下(最后那個應該是0.470702440,使用bc計算的時候那個0被去掉了): 2、內存釋放 ??? linux系統中/proc是一個虛擬文件系統,我們可以通過對它的讀寫操作做為與kernel實體間進行通信的一種手段。也就是說可以通過修改 /proc中的文件,來對當前kernel的行為做出調整。那么我們可以通過調整/proc/sys/vm/drop_caches來釋放內存。關于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 默認是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 //發現緩存明顯減少了total used free shared buffers cached
Mem: 499 83 415 0 1 17
-/+ buffers/cache: 64 434
Swap: 2047 0 2047
轉載于:https://www.cnblogs.com/AmilyWilly/p/9285048.html
總結
以上是生活随笔 為你收集整理的Linux buffer/cache异同 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。