内存中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占用的内存过高,想做一些清理,例如下图
系统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)
==有缘的陌生人,如果帮到你,顺手点个赞吧,赞扬他人也会给自己带来好运气😄 ==