您的位置:

LinuxBuff/Cache过高的原因分析

一、唤起对缓存和缓冲区的理解

首先我们需要理解什么是缓存和缓冲区。

缓存(cache)是一种临时存储技术,用于提高数据访问时的速度。缓存通常是一个小而快的存储器,可存储经常访问的数据。如果需要访问特定数据,则可以在较慢的存储器或存储设备中搜索数据,读取后将其存储在缓存中。后续的访问会从缓存中读取数据,而不是从较慢的存储器或设备中读取。

缓冲区(buffer)是为了解决两个不同速度的设备之间进行数据传输时的问题而设立的一段内存空间。缓冲区的作用就是为了提高数据处理的效率,将要处理的数据传入缓冲区后,根据缓冲区的大小再以一定速率将数据输入。这样就可以使快设备和慢设备之间进行数据传输时达到平衡,实现平衡调度。

而对于LinuxBuff/Cache过高,则是指Linux的Buffer和Cache占用了大量的内存,导致该机器的可用内存很小,从而导致机器变得很慢或者僵死。

二、Linux Cache和Buffer的区别

Linux中的Cache和Buffer都是用于缓存磁盘I/O的,它们可以极大地加速系统的磁盘I/O。但它们的实现机制有所不同。

Linux的Buffer Cache是用于磁盘I/O的,其中数据块是以文件的形式存储的。当系统把数据写到磁盘的时候,它先把这些数据放到Buffer Cache中,然后慢慢地写到磁盘上。因此,Buffer Cache是用于重复读写数据块的,这样可以避免频繁地进行磁盘I/O。Buffer Cache内的数据不是由应用程序频繁访问而产生的,而是由系统对磁盘进行访问而产生的。

Linux的Page Cache是用于文件I/O的,它把文件中的数据缓存到内存中。当应用程序需要访问数据块时,系统会先检查Page Cache中是否有该数据块的缓存,如果有的话,直接返回缓存的数据块,否则向磁盘发出读请求。当访问频繁的时候,Page Cache中的数据块缓存满了,此时就会把一些数据块从缓存中移除。

三、LinuxBuff/Cache过高的可能原因

当我们发现Linux机器出现了Buff/Cache过高的情况,我们需要找出可能的原因,针对性地进行解决。

1. 内存不足导致

当机器的内存不足时,Linux系统会把一些经常使用的信息存储到Cache中,以优化读写速度。

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           2000         644         989           4         366        1294
Swap:          2047           0        2047

上图中的buff/cache字段为使用的Buffer Cache和Page Cache的总和。这里Buff/Cache占用了366MB,它们和已使用内存占用的644MB加起来,就是系统总共已占用的内存。所以,系统剩余可用内存就是free字段的989MB。

当空闲内存变得很少时,Linux系统会尝试释放Cache和Buffer,然后回收内存。但是当内存不足时,系统无法适应Cache大小的变化,以至于Buff/Cache占用的内存变得过大,这个时候就会导致内存不足而出现Buff/Cache过高的情况。

2. 文件系统写入缓存太大

当应用程序需要同时读取大量的数据(例如,使用cat,grep等命令查看大文件),系统会将这些数据缓存到Page Cache中。但是,当写入Cache的数据量太大时,所占内存就会变得过大而导致Buff/Cache过高。

3. 文件系统页回收效果差

当文件系统的页回收效果差时,页缓存中的数据不会及时地被释放出来,导致Buff/Cache过高。

可以通过合理地配置内存和swap分区,来优化页回收效果。

4. 系统对Swap分区使用过多

Linux系统会将内存中的数据写入Swap分区,来释放内存。但是,当机器中的可用内存不足时,系统会逐渐将数据从Swap分区中读出到内存中,而这个过程可能会导致Buff/Cache过高。

四、解决LinuxBuff/Cache过高的方法

1.升级内核

在较早版本的Linux系统中,内核对Cache机制的处理较为低效,导致Buff/Cache过高。通过升级内核版本,可以解决这个问题。

2.调整Sync和Dirty参数

通过修改Sync和Dirty参数的值,可以控制Linux缓存空间的大小。

Sync参数:它控制着在多久时间内,系统必须把部分Buffer Cache中数据写入磁盘。默认值是5秒。可以通过修改Sync参数将其调整到较小的值。

Dirty参数:它控制着一个内存页面被标记为脏页面时的阈值。默认值是20%,这意味着当缓存大小超过物理内存的20%时,系统会尝试回收缓存。可以通过修改Dirty参数将其调整到较小的值。

# 查看系统的Sync参数和Dirty参数值
$ cat /proc/sys/vm/dirty_ratio 
20
$ cat /proc/sys/vm/dirty_background_ratio 
10

# 修改系统的Sync参数和Dirty参数值
$ sudo sysctl -w vm.dirty_ratio=10
$ sudo sysctl -w vm.dirty_background_ratio=5

3.手动清理缓存

用户可以手动清理缓存来释放缓存空间,从而降低Buff/Cache。

# 清理Page Cache
$ sudo echo 1 > /proc/sys/vm/drop_caches

# 清理Buffer Cache,以及Page Cache
$ sudo echo 3 > /proc/sys/vm/drop_caches

4.修改内存和Swap分区的大小

如果机器的物理内存不够大,可以通过增加Swap分区的大小来扩充内存。但是,过多地使用Swap分区也会导致Buff/Cache过高,因此需要根据机器配置和应用程序需求来做出合理的决策。

总结

通过以上分析,我们可以知道发现LinuxBuff/Cache过高并不是一个麻烦的事情,我们可以通过多种方式优化Linux系统的缓存机制,来使系统运行更加稳定和高效。