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异同相关推荐

  1. linux cache buffer区别,Linux buffer/cache异同

    buffers与cached 1).异同点 在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序:当需要往文件中 ...

  2. linux buffer cache 过高_你真的理解Linux的内存监控吗?

    如果你平时工作使用Windows系统,对Windows的内存监控应该不陌生,在"任务管理器"中显示90%的内存占用,这些内存就全部由进程占用了,如果这时产生了新的进程,没有内存可用 ...

  3. Linux buffer/cache解读

     cache与buffer解读 cache出现的原因与功能 计算机硬件中CPU.内存.磁盘是最主要的三大部分,其中,CPU发展到今天,执行速度最快,而内存相对CPU而言,就慢多了,CPU执行的指令是从 ...

  4. Linux buffer/cache 内存占用过高的原因以及解决办法

    表现现象 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个 CoreOS 的系统上,free命令的显示内容大概是这样一个状态: core@localhost ~ $ free ...

  5. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?

    1|0缓存 从 free 命令可以看到,缓存其实就是 Buffer 和 Cache 两部分的总和 字面意思,Buffer 是缓存区,Cache 是缓存,两者都是数据再内存中的临时存储 2|0Buffe ...

  6. linux buffer cache 过高_工作中经常用的linux命令 free

    free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区,不带参数默认将会以kb单位展示 CentOS 7.6上显示如下 free -m 以M为单位显示 total:表 ...

  7. linux buffer/cache手动释放

    内存使用情况 [root@tst-yangsq2-2 ~]# free -htotal used free shared buff/cache available Mem: 7.6G 1.0G 1.2 ...

  8. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  9. 和linux关系_Linux内核Page Cache和Buffer Cache关系及演化历史

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘.这里提到的脏页(dirty ...

最新文章

  1. React 2019年路线图发布!Hooks明年一季度上线
  2. vhd 镜像 备份Linux,差分VHD 系统秒备份、秒还原教程 完胜GHOST
  3. android 判断http编码格式,安卓入门笔记之HttpURLConnection的使用
  4. python 爬虫代码_python之路(一)_爬虫—爬一下网页代码输出到文件
  5. LeetCode OJ - Valid Palindrome
  6. idea搭建maven项目关于数据库连接jar包版本问题解决方案
  7. oracle的数据库由,Oracle数据库系统主要由Oracle______组成。
  8. git checkout切换到指定commit
  9. HorizontalScrollView实现侧滑效果
  10. java 噪声信道模型_噪声信道模型zz
  11. PreparedStatement 原理
  12. 【用户画像】从0到1掌握用户画像知识体系
  13. 计算机其它离的360云盘,win7系统将360云盘文件快速转移到百度云盘的方法
  14. 2015杭州云栖大会
  15. 小厮吃货:智能便利店不是新零售的风口?!
  16. FFmpeg指令(./configure 其他)
  17. java pdf转jpg清晰度_java 库 pdfbox 将 pdf 文件转换成高清图片方法
  18. 数据库数据迁移失败,如何进行修复操作
  19. 案例:用户信息管理系统
  20. 真的假的?中国科学技术大学软件学院今年报考人数4366人?

热门文章

  1. ubutnu16.04搭建LAMP环境(搭建wordpress博客)
  2. java 一般方法_一般覆盖Java中的方法
  3. python三个点画正弦线_python3绘图示例5(基于matplotlib:正弦图等)
  4. c++:MFC中sqlite3的使用(附实际案例)
  5. 分类模型的评估方法-F分数(F-Score)
  6. Python的浅拷贝和深拷贝
  7. Python的列表推导式
  8. 【知识星球】有没有网络模型是动态变化的,每次用的时候都不一样?
  9. 【杂谈】一招,同时可视化18个开源框架的网络模型结构和权重
  10. Linux 环境下umount, 报 device is busy 的问题分析与解决方法