由于Linux的buff/cache缓存占用了大量的内存导致没有足够的物理内存可以使用,内存不足也会导致无法申请新资源创建云主机。
云平台环境:ZStack4.3.28
存储环境:本地存储
云主机操作系统:CentOS7.6
网络环境:公有网络
在日常的使用中,Linux系统的读写操作会产生对应的I/O缓存和高速缓存数据,也叫作buff/cache(buff是I/O缓存:用于内存和硬盘的缓冲、cache是高速缓存:用于CPU和内存之间的缓冲;),它们会占用内存空间,用来提高操作系统使用性能,但是缓存数据并不会立即释放,当到达一定阀值时会自动释放,通常linux操作系统在频繁存取文件后,会导致buff/cache的占用量增高,导致可用的内存降低。
针对物理机buff/cache占用内存过高,可以按照以下步骤进行优化和释放。
1、在操作前建议将物理机上面的云主机全部停止或者迁移业务到其他物理机(保证物理机上没有业务运行),物理机进入维护模式(维护模式会将物理机上无法在线迁移走的云主机和vpc路由器全部关机),防止在清除缓存时候,有内存数据丢失风险。

(图1 停止物理机上面的云主机)

(图2 物理机进入维护模式)
2、Linux可对buff/cache的参数进行调整,设置缓存占用内存的最大百分比以及强制将缓存写入磁盘的临界点,ZStack物理机默认已调优;
普通linux按照一下步骤依次执行:
echo 'vm.dirty_background_ratio = 5' >> /etc/sysctl.conf ##调整缓存占用内存的百分比,通常默认为10 echo 'vm.dirty_ratio = 10' >> /etc/sysctl.conf ##控制内存最多占用的比例,通常默认为30 sysctl -p ##查看/etc/sysctl.conf中设置的值
注意:减少百分比、临界点的数值,可以更快的将缓存写入磁盘防止占用过多的内存空间,但是更改之后缓存的空间会减少。同时设置的数值最好不要设置为0,缓存过低可能会降低整体运行速度

(图3 手动调优相关参数并且生效)
3、手动释放buff/cache的数据
执行以下命令即可:
sync #将缓冲区的数据写到磁盘,防止数据丢失 echo 1 > /proc/sys/vm/drop_caches #清除pagecache echo 2 > /proc/sys/vm/drop_caches #回收slab分配器中的对象 echo 3 > /proc/sys/vm/drop_caches #清除slab和pagecache中的缓存对象
这样操作可以将内存中的缓存数据释放,空闲出内存空间,当再次查看内存中的缓存,发现已经减少(如图4),需要注意释放内存前确保没有重要数据或者业务在运行,以免数据丢失风险。

(图4 手动释放buff/cache缓存数据)