buffers与cached
1)、异同点
在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写 数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性 能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,Linux引入了buffers和 cached机制。
buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers 与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操 作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。
#!/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命令之间有时间间隔,计算起来可能会略有不同):
#!/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、内存释放
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 -m total 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