linux buffer cache 过高_Linux 中的内存(cache,buffer,)

在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。

内存查看

当我们使用 free -h 命令时,会显示如下的信息

              total        used        free      shared  buff/cache   available
Mem:            15G        1.0G        9.3G        1.9M        5.4G         14G
Swap:            0B          0B          0B

total:内存总数;used:已经使用的内存数;free:空闲的内存数;shared:当前已经废弃不用;buff/cache:缓存内存数;

关系:total = used + freeSwap用途:Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。

swap清理:swapoff -a && swapon -a

cache && buffer

cache

缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。

Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提高系统性能。

Cache 作用域在于 Cpu 与内存之间

buffer

缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。当存储速度快的设备与存储速度慢的设备进行通信时,存储慢的数据先把数据存放到buffer,达到一定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU可以干其他的事情。

linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。

修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。–两者都是RAM中的数据。

cache vs buffer

cache最初用于cpu cache,主要原因是cpu 与memory,由于cpu快,memory跟不上,且有些值使用次数多,所以放入cache中,主要目的是,重复使用,并且一级二级物理cache速度快,

buffer主要用于disk与 memory,主要是保护硬盘或减少网络传输的次数(内存数据表现dataSet).当然也可以提高速度(不会立即写入硬盘或直接从硬盘中读出的数据马上显示),重复使用,最初最主要的目的是保护disk。

cache 也可以用于写,buffer 也可以用于读,两者并未有实实在在明显的界限。

swap

除了以上两种,linux 还引入了 swap 技术,swap的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。

当程序向OS请求内存资源时,OS发现内存不足,则会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT。当程序又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。

那么我们在使用 docker 和 K8s 的时候,为什么要关闭 swap 特性呢?主要还是希望获取更高的性能。kubernetes的思想是将实例紧密打包为尽可能接近100%的利用率。所有部署都应固定有CPU /内存限制。因此,如果调度程序将Pod发送到计算机,则绝对不要使用swap。

手动清理释放

释放缓存区内存的方法1)清理pagecache(页面缓存)

echo 1 > /proc/sys/vm/drop_caches
# 或者
sysctl -w vm.drop_caches=1

2)清理dentries(目录缓存)和inodes

echo 2 > /proc/sys/vm/drop_caches     
#或者 
sysctl -w vm.drop_caches=2

3)清理pagecache、dentries和inodes

echo 3 > /proc/sys/vm/drop_caches     
#或者 
sysctl -w vm.drop_caches=3

上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:

vm.drop_caches=1/2/3

然后sysctl -p生效

另外,可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存

值得一提

上面操作在大多数情况下都不会对系统造成伤害,只会有助于释放不用的内存。但是如果在执行这些操作时正在写数据,那么实际上在数据到达磁盘之前就将它从文件缓存中清除掉了,这可能会造成很不好的影响。

那么如果避免这种事情发生呢?因此,这里不得不提一下/proc/sys/vm/vfs_cache_pressure这个文件,告诉内核,当清理inoe/dentry缓存时应该用什么样的优先级。

> cat /proc/sys/vm/vfs_cache_pressure
100

vfs_cache_pressure=100 这个是默认值,内核会尝试重新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较"合理"的比例。

减少vfs_cache_pressure的值,会导致内核倾向于保留dentry和inode缓存。增加vfs_cache_pressure的值,(即超过100时),则会导致内核倾向于重新声明dentries和inodes

总之,vfs_cache_pressure的值:小于100的值不会导致缓存的大量减少超过100的值则会告诉内核你希望以高优先级来清理缓存。

其实无论vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。如果将此值设置为10000,系统将会将缓存减少到一个合理的水平。

如果喜欢,请关注我的公众号,或者查看我的博客 http:// packyzbq.coding.me . 我会不定时的发送我自己的学习记录,大家互相学习交流哈~

http://weixin.qq.com/r/Zkw2LtvEk4bsrZ9N9xl0 (二维码自动识别)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linuxbuffer cache内存是指用于缓存磁盘数据的一块内存区域。当应用程序需要读取磁盘上的数据时,操作系统会将数据读入buffer cache,以便下次读取时可以直接从内存获取,避免频繁的磁盘访问,提系统性能。同时,当应用程序需要写入数据时,操作系统也会将数据写入buffer cache,然后再异步地将数据写入磁盘,以提写入效率。buffer cache内存的大小可以通过系统参数进行配置,一般情况下会根据系统的内存大小和磁盘访问情况进行调整。 ### 回答2: 在Linux操作系统buffer cache(缓冲区缓存)是用来提文件系统性能的一种机制,是内核将经常访问的数据缓存内存的一部分。它的主要作用是降低磁盘I/O操作的延迟,提文件系统的读取写入速度。 Buffer cache是由内核维护的一块内存区域,它存储了最近被读取写入的文件块数据。当应用程序需要读取文件时,内核会首先查找buffer cache,如果要读取的文件块在cache,则直接从cache读取数据,避免了磁盘I/O操作。如果要写入数据到文件,内核会将数据写入buffer cache,并在适当的时机将数据同步到磁盘上。 buffer cache的大小是动态调整的,根据系统的负载和需求进行自动调整。内核会根据当前系统内存的可用情况和其它进程的需求来判断是否需要释放部分buffer cache内存。如果系统内存紧张,内核会减少buffer cache的大小,以释放内存供其它进程使用;如果系统内存较为充足,内核会增加buffer cache的大小,以提文件系统的性能。 使用buffer cache可以大幅提文件系统的性能,尤其是对于频繁的读取写入操作。通过将经常访问的数据缓存内存,可以减少对磁盘的访问次数,大大降低了I/O延迟带来的性能损耗。同时,缓存内存的数据可以更快地供应给应用程序,提了文件系统的响应速度。 总之,buffer cacheLinux操作系统的一种内存机制,用来提文件系统的性能。它通过将经常访问的数据缓存内存,减少磁盘I/O操作,提文件系统的读取写入速度。同时,buffer cache的大小会根据系统的负载和需求进行动态调整,以确保系统的内存使用和性能的平衡。 ### 回答3: 在Linux操作系统buffer cache是一种磁盘I/O缓存机制,用于提文件系统的访问性能。 当应用程序读取文件时,操作系统将文件的内容从磁盘读取内存buffer cache。如果下次再次读取同样的文件内容,操作系统可以直接从buffer cache读取,而不需要再次去磁盘访问。这样可以显著减少磁盘I/O操作,提读取文件的速度。 类似地,当应用程序对文件进行写入时,数据首先被写入buffer cache,然后操作系统可以根据需要决定何时将数据刷新到磁盘。这样可以将多个小的写入操作合并为一个大的写入操作,减少了磁盘I/O的负担,并提写入文件的效率。 Buffer cache内存的大小是动态分配的,它根据系统的需要自动增加或减少。当文件系统需要更多的内存时,它会从系统获取一部分内存作为buffer cache,用于缓存更多的文件内容。当内存不足时,buffer cache释放一部分内存,以便为其他系统组件提供更多的内存。 使用buffer cache机制可以显著提文件系统的性能,比如读取写入文件的速度。然而,buffer cache的使用也存在一些风险,比如在系统发生意外关机的情况下,尚未被写入磁盘的数据将会丢失。因此,在使用buffer cache时需要注意数据的持久性与一致性的问题,确保数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值