博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux buffer/cache异同
阅读量:5091 次
发布时间:2019-06-13

本文共 5437 字,大约阅读时间需要 18 分钟。

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 -m                     total       used        free     shared    buffers     cachedMem:              499         323        175             0          52         188-/+ buffers/cache:            82         416Swap:            2047            0       2047[root@hps103 ~]# echo 3 > /proc/sys/vm/drop_caches[root@hps103 ~]# free -m     //发现缓存明显减少了                    total       used        free     shared    buffers     cachedMem:             499          83         415            0            1           17-/+ buffers/cache:           64         434Swap:           2047            0        2047

转载于:https://www.cnblogs.com/AmilyWilly/p/9285048.html

你可能感兴趣的文章
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
第一阶段冲刺06
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>
HDU 4635 Strongly connected
查看>>
格式化输出数字和时间
查看>>
页面中公用的全选按钮,单选按钮组件的编写
查看>>
java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>