linux中的buffer和cache

红米2年前技术文章1402

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

相关文章

Hbase region移动

Hbase region移动

1、背景由于hbase 表在创建时没有进行预分区,导致自动分裂的region分布到同一region server上。现将region 手动移动到其他节点,使分布均匀2、操作步骤1、找到要移动的regi...

HDFS FQA-Active Namenode does not exit SafeMode with error :"Protocol message was too large.

1、背景重新启动 Active Namenode 时,它卡在安全模式并报告以下错误:Caused by: java.lang.IllegalStateException: ...

Linux解锁线程基本概念和线程控制,步入多线程学习的大门(2)

Linux解锁线程基本概念和线程控制,步入多线程学习的大门(2)

2.4.线程等待:为什么需要线程等待?已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。不然也会造成内存泄露问题!创建新的线程不会复用刚才退出线程的地址空间。主线程退出 == 进程退出 ==...

 MySQL运维实战之Clone插件(10.1)使用Clone插件

MySQL运维实战之Clone插件(10.1)使用Clone插件

clone插件介绍mysql 8.0.17版本引入了clone插件。使用clone插件可以对本地l或远程的mysql实例进行clone操作。clone插件会拷贝innodb存储引擎表,clone得到的...

CDP实操--集群配置Auto-TLS

CDP实操--集群配置Auto-TLS

1.1手动创建CA证书# mkdir -p /tls/ca # ls /tls # cd /tls/ca # openssl genrsa -out ca.key 2048 # cat ca....

开启kerberos配置HiveServer2负载均衡

开启kerberos配置HiveServer2负载均衡

1.HAProxy配置HiveServer2负载均衡1.编辑/etc/haproxy/haproxy.cfg文件,在文件末尾增加如下配置listen stats     bind 0.0.0.0:1...

发表评论    

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