内存中buffer和cache的区别

内存中buffer和cache的区别

前言:这篇文章我们主要讲Linux系统的缓存,关于windows系统的内存及缓存可以通过以下命令查看,有兴趣的同学可以下去详细查一查,这里就不详细展开了:

PS C:\Users\Administrator> wmic
wmic:root\cli>memorychip
Attributes  BankLabel  Capacity    Caption   ConfiguredClockSpeed  ConfiguredVoltage  CreationClassName     DataWidth  Description  DeviceLocator  FormFactor  HotSwappable  InstallDate  InterleaveDataDepth  InterleavePosition  Manufacturer  MaxVoltage  MemoryType  MinVoltage  Model  Name      OtherIdentifyingInfo  PartNumber        PositionInRow  PoweredOn  Removable  Replaceable  SerialNumber  SKU  SMBIOSMemoryType  Speed  Status  Tag                TotalWidth  TypeDetail  Version
1           BANK 0     8589934592  物理内存  2400                  1200               Win32_PhysicalMemory  64         物理内存     DIMM A         12                                     0                    0                   80AD000080AD  1200        0           1200               物理内存                        HMA81GS6JJR8N-VK  1                                                 3382517D           26                2667           Physical Memory 0  64          128

首先我们来讲一下定义
buffer:A buffer is something that has yet to be “written” to disk对物理设备上的数据的缓存,或者说是对磁盘块的读写,是指内存中的buffer cache,被用来当成对io设备写的缓存,也可以称为内核缓冲区所用的内存

cache:A cache is something that has been “read” from the disk and stored for later use是文件数据的缓存,是针对文件inode的读写,是指内存中的page cache,被用来当作对io设备读的缓存;

即缓存文件内容+slab(linux内存的一种分配机制,用来解决小对象分配,从而避免常见的碎片问题—参考)

查看方法
在linux系统中,我们有许多方法可以查看缓存,常见的如下

# free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        4.3G        131M        6.9M        3.2G        3.0G
Swap:          4.0G        134M        3.9G
# top
top - 18:25:48 up 27 days, 21:21,  1 user,  load average: 0.02, 0.06, 0.05
Tasks:  98 total,   1 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8008340 total,   133852 free,  4512440 used,  3362048 buff/cache
KiB Swap:  4194300 total,  4056572 free,   137728 used.  3182888 avail Mem
vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0    138    204    173   3040    0    0    13    73    4    2  0  0 100  0  0
# sar -r 2 1 
Linux 3.10.0-1062.el7.x86_64 (jirab) 	04/10/2023 	_x86_64_	(4 CPU)

07:08:39 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
07:08:41 PM    206736   7801604     97.42    177608   2931308   4479776     36.71   5069864   2413140        20
Average:       206736   7801604     97.42    177608   2931308   4479776     36.71   5069864   2413140        20
buffer&cache的作用:

Linux为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buff和cahce其实都属于已经被使用的内存,但当应用程序申请内存时,如果free不够,内核就会回收buff和cache的内存来满足应用程序的读写要求,或者使用交换空间。
注意: buff/cache中的内存都是临时的,一旦关机数据都会丢失
**清理缓存的方法:**有时我们通过free -h等命令查看内存时发现buffer和cache占用的内存过高,想做一些清理,例如下图
iguaigua
系统8个G的内存,程序使用了4.3G,buffer/cache 占用了3.1G,完全free的只有200M,虽然available有3个G,即在其他程序需要使用内存时,系统可以从buffer/cache中回收一部分内存,但是回收内存必然会紧跟着高I/O的产生,有些我们想要完全free的内存多些或者需要关机时,我们得保存缓存中的文件,这时候应该怎么做呢,步骤如下:

1,连续执行三次,sync,将内存中的数据强制写入到磁盘中,避免                                          数据丢失。
2,linux提供了三种清除数据的方式
a. echo 1 > /proc/sys/vm/drop_caches #仅清除页面缓存
b. echo 2 > /proc/sys/vm/drop_caches #清除dentry(目录                                          项)和inode
c. echo 3 > /proc/sys/vm/drop_caches #清除页面缓存,目                                          录项以及inode 
3.再次执行sync命令
注意点:

1,上面a、b、c三个命令任选一个执行,在生产环境中第一个命令a是最安全的,不建议选择选项c;
2,由于buff/cache主要是用于文件读写使用,所以在进行缓存回收时,常常会伴随系统的IO飙升,因为系统内核会比对缓存中的数据与硬盘中的数据是否一致,如果不一致需要写入,然后才能进行内存的回收。
3,这个方式只能一时减轻系统内存的压力,当清理缓存后,它也将减慢系统运行速度,系统会将每一个被请求的资源再次加载到磁盘缓存中,这种方法不能从根本解决系统卡顿问题,如果要解决系统卡顿的问题,需要分析系统瓶颈在哪加以改善,也可以建立一个定时任务在空闲时去定时清理RAM缓存,例如:

#!/bin/bash
Mem=$(free -m | awk 'NR==2' | awk '{print $4}')
if [ $Mem -gt 1024 ];
then
echo "Service memory capacity is normal!" > /dev/null
else
sync
echo "1" > /proc/sys/vm/drop_caches
sync

附:
buff/cache中的内存并不是都可以被释放的,有且至少有三种无法在系统内存不够时不能被回收,所以最后真正剩余的可用内存有多少,就得评估能回收多少,就有了avaliable这个参数:
tmpfs等ram disk申请的内存
shard共享内存
mmap申请的,未被释放的共享内存
最合理的,通用的内存空闲率计算方式是free+(buff&cache/2)

==有缘的陌生人,如果帮到你,顺手点个赞吧,赞扬他人也会给自己带来好运气😄 ==

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值