- 关于缓存清理,小伙伴一定不陌生,个人觉得通过修改drop_caches内核参数的形式来清理缓存,只能是在生产环境用于临时解决问题,本质还是要对应用进行分析,看看是什么原因导致的内存溢出等OOM问题,一般情况下,内存溢出可以通过交换分区来确定
当然,如果是因为业务量的原因,业务高峰,或者需要算力等正常原因,可以定期通过sync将缓存区没有写入数据写入磁盘,然后修改内核参数drop_caches的值来清理缓存,或者通过新建交换分区调整swappiness交换分区频率来解决问题,如果虚机的话可以申请扩内存
系统内存查看 |
|
|
其中:Mem:实际的内存|Swap:交换分区|
- total内存总数
- used已经使用的内存数
- free空闲的内存数
- shared多个进程共享的内存总额
- buff/Cache缓存的内存大小
- available可用内存
系统内存监控
系统内存监控 |
|
|
vmstat:是一个内存监控工具,后面的数字为刷新频率|top不多说
vmstat | 列描述 |
free | 空闲的物理内存的大小。 |
buff | Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存. |
cache | cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。) |
修改drop_caches内核参数清理缓存
我们先看看帮助文档:内核参数的帮助文档查看方式
┌──[root@liruilongs.github.io]-[/proc/sys/vm]└─$man-Kdrop_caches--Man--next:proc(5)[view(return)|skip(Ctrl-D)|quit(Ctrl-C)]
嗯,英文好的小伙伴可以看看
drop_cachesWritingtothiswillcausethekerneltodropcleancaches,aswellasreclaimableslabobjectslikedentriesandinodes.Oncedropped,theirmemorybecomesfree.Tofreepagecache:echo1>/proc/sys/vm/drop_cachesTofreereclaimableslabobjects(includesdentriesandinodes):echo2>/proc/sys/vm/drop_cachesTofreeslabobjectsandpagecache:echo3>/proc/sys/vm/drop_cachesThisisanon-destructiveoperationandwillnotfreeanydirtyobjects.Toincreasethenumberofobjectsfreedbythisoperation,theusermayrun`sync'priortowritingto/proc/sys/vm/drop_caches.Thiswillminimizethenumberofdirtyobjectsonthesystemandcreatemorecandidatestobedropped.Thisfileisnotameanstocontrolthegrowthofthevariouskernelcaches(inodes,dentries,pagecache,etc...)Theseobjectsareautomaticallyreclaimedbythekernelwhenmemoryisneededelsewhereonthesystem.Useofthisfilecancauseperformanceproblems.Sinceitdiscardscachedobjects,itmaycostasignificantamountofI/OandCPUtorecreatethedroppedobjects,especiallyiftheywereunderheavyuse.Becauseofthis,useoutsideofatestingordebuggingenvironmentisnotrecommended.Youmayseeinformationalmessagesinyourkernellogwhenthisfileisused:cat(1234):drop_caches:3Theseareinformationalonly.Theydonotmeanthatanythingiswrongwithyoursystem.Todisablethem,echo4(bit2)intodrop_caches.
手动执行sync命令(描述:sync命令运行sync子例程。如果必须停止系统,则运行sync命令以确保文件系统的完整性。sync命令将所有未写的系统缓冲区写到磁盘中,包含已修改的系统i-node、已延迟地块I/O和读写映射文件)
┌──(rootLiruilong)-[/mnt/c/Users/lenovo]└─#sync
对缓存进行清理
┌──(rootLiruilong)-[/mnt/c/Users/lenovo]└─#free-mtotalusedfreesharedbuff/cacheavailableMem:12480841235504012228Swap:409604096┌──(rootLiruilong)-[/mnt/c/Users/lenovo]└─#echo3>/proc/sys/vm/drop_caches┌──(rootLiruilong)-[/mnt/c/Users/lenovo]└─#free-mtotalusedfreesharedbuff/cacheavailableMem:12480841237202312237Swap:409604096
清理缓存 |
|
|
我们来看看文档
写入drop_caches将导致内核丢弃干净的缓存,以及可回收的slab对象,如dentry和inode。一旦下降,他们内存得到释放。
具体的参数描述
Tofreepagecache:echo1>/proc/sys/vm/drop_cachesTofreereclaimableslabobjects(includesdentriesandinodes):echo2>/proc/sys/vm/drop_cachesTofreeslabobjectsandpagecache:echo3>/proc/sys/vm/drop_caches
使用此文件可能会导致性能问题。因为它丢弃了缓存对象,它可能会花费大量的I/O和CPU来重新创建掉落的物体,特别是大量使用时。由于这个原因,不建议在测试或调试环境之外使用。
在内核的文档里也说不建议在测试或调试环境之外使用,重建一些需要的缓存还是会消耗大量的I/O和CPU,同时这也不是一个必要操作,一些不用的缓存系统会自动的清理掉
一个SHELL
最后在和小伙伴分享一个清理缓存的shell
#!/bin/bash#@File:clear.sh#@Time:2021/12/2723:52:20#@Author:LiRuilong#@Version:1.0#@Desc:清除缓存的shell#@Contact:1224965096@qq.commax=10000#缓存的最大值clearLog=/var/log/clearfreelogif[!-f$clearLog];thentouch$clearLogfifilesize=$(du-m$clearLog|awk'{print$1}')echo"filesize=$filesize"if[$filesize-gt300];thenecho$clearLog>$clearLogficache=$(free-m|grepMem|awk'{print$(NF-1)}')time=$(date)if[$cache-gt$max]thenecho"$timecache=$cacheflushcachestart!">>$clearLogsyncecho3>/proc/sys/vm/drop_cachesecho"$timeFreeMemorySuccess!">>$clearLogelseecho"$timecache=$cacheMemoryisnormal">>$clearLogfi