linux中的buffer和cache

红米2年前技术文章977

linux中的buffer和cache

一、buffer和cache的来源及应用

1、来源

Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。那么,这两种“临时存储”有什么区别吗?free出来的数据是来自哪里呢?

通过 man free命令可以找到对应指标的详细说明:

image_BDR_uXVwdp.png

从上图中可以总结得出:

  • buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。

  • cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。

image_2NpzCvCWDL.png

page cache 和buffer cache关系图

2、buffer出现的原因以及与cached的比较

 /proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从 /proc 中查询内核的运行状态和配置选项,查询进程的运行状态、统计数据等,也可以通过 /proc 来修改内核的配置。proc 文件系统同时也是很多性能工具的最终数据来源。比如 free 就是通过读取/proc/meminfo,得到内存的使用情况。

 buffer,它存在的目的适用于速度快的设备往速度慢的设备输出东西。例如内存的数据要写到磁盘,cpu寄存器里的数据写到内存。缓冲(buffers)是根据磁盘的读写设计的,它把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

  • **Buffers **是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。

  • Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。

3、补充解释

写文件时会用到 Cache 缓存数据,而写磁盘则会用到 Buffer 来缓存数据。读文件时数据会缓存到 Cache 中,而读磁盘时数据会缓存到 Buffer 中。

  • Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。

  • Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。这样,我们就回答了案例开始前的两个问题。

    所以,Buffer 是对磁盘数据的缓存, Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

Buffer 和 Cache 分别缓存磁盘和文件系统的读写数据。

(1)、从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。

(2)、从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。

二、page cache的优化以及如何回收cache

1、 page cache的优化

要优化page cache,需要关注两个操作系统参数:

  • vm.dirty_background_ratio:这个参数指定了当文件系统缓存脏页(Page Cache中的数据称为脏页数据)数量达到系统内存百分之多少时(默认10%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入磁盘。增减这个值是最主要的调优手段。

  • vm.dirty_ratio:这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(默认20%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入磁盘);在此过程中很多应用进程可能会因为系统刷新内存数据到磁盘而发生IO阻塞。

这两个系统参数对应的文件为:

vm.dirty_background_ratio:/proc/sys/vm/dirty_background_ratio

vm.dirty_ratio:/proc/sys/vm/dirty_ratio

作为通用优化设置,建议将vm.dirty_background_ratio设置为5%,vm.dirty_ratio设置为10%。具体的设置根据不同环境,需要进行测试、再测试。

2 、回收cache

linux提供了几个参数,用来释放cache,具体如下:

释放page cache

echo 1 > /proc/sys/vm/drop_caches

释放文件节点(inodes)缓存和目录项缓存(dentries),大部分缓存数据都是用的page cach

echo 2 > /proc/sys/vm/drop_caches

释放page cache、dentries和inodes缓存,执行如下命令:

echo 3 > /proc/sys/vm/drop_caches

建议在执行 清理cache 时前,先执行sync命令将缓存数据刷到磁盘,以防丢失脏缓存数据

三、关于swap的使用与优化

1、 swap交换分区的使用

创建交换空间所需的交换文件是一个普通的文件,但是,创建交换文件与创建普通文件不同,必须通过dd命令来完成,同时这个文件必须位于本地硬盘上。

[root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1024 count=65536

要使用swap,首先要激活swap,通过mkswap命令指定作为交换空间的设备或者文件

[root@localhost ~]#mkswap /data/swapfile

最后,通过swapon命令激活swap:

[root@localhost ~]#/usr/sbin/swapon /data/swapfile

2、 swap的优化

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区。

[root@slave034 ~]# cat /proc/sys/vm/swappiness
60

默认值为60,意思是说,系统的物理内存在使用到100-60=40%的时候,就可以开始使用交换分区了。此参数设置了使用交换分区的可能性大小。在/etc/sysctl.conf文件中修改,加上如下内容:

vm.swappiness=10

然后执行命令,永久生效。:

sysctl -p

相关文章

RabbitMQ 集群部署

RabbitMQ 集群部署

1. 两种模式说到集群,小伙伴们可能第一个问题是,如果我有一个 RabbitMQ 集群,那么是不是我的消息集群中的每一个实例都保存一份呢?这其实就涉及到 RabbitMQ 集群的两种模式:1)普通集群...

MySQL运维实战(2)MySQL用户和权限管理

MySQL用户管理基本命令创建用户使用create user命令创建用户create user 'username'@'host' ide...

RDS通过DMS管理登录处理

RDS通过DMS管理登录处理

问题描述无法通过DMS管理登录进入数据库,报错如下:问题处理方式一在RDS控制台新建账号 账号管理--创建账号将此数据库添加进DMS在DMS控制台--数据库实例--新增实例将新建的数据库账号信息进行录...

Redis 内存使用情况查看

内存情况查看1、MEMORY STATS--连接 redisredis-cli--执行 MEMORY STATS命令查询内存使用详情 MEMORY STATSRedis实例的内存开销主要由两部分组成:...

CDP实操--Ranger开启ldap认证

CDP实操--Ranger开启ldap认证

集群中已经部署了ldap主主模式,并且使用haproxy进行负载均衡,keepalive提供了虚拟ip。页面配置:Ranger进行同步用户:验证:使用ldap用户登录页面:FAQ:1、admin超级管...

oracle安装gi执行root.sh报错:PRCR-1079 : Failed to start resource ora.cvu

1、具体报错如下:安装gi执行root.sh报错:PRCC-1014 : LISTENER_SCAN1 was already runningPRCR-1004 : Resource ora.LIST...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。