Linux下清理Cache方法

本文介绍了当系统因频繁文件访问导致缓存占用过大时,如何通过运行sync命令及利用proc系统下的drop_caches参数来释放缓存,提高系统运行效率。同时提供了调整系统配置以避免内存持续增加的方法。


频繁的文件访问会导致系统的Cache使用量大增
$ free -m
             total       used       free     shared    buffers     cached
Mem:          3955       3926         28          0         55       3459
-/+ buffers/cache:        411       3544
Swap:         5726          0       5726
free内存减少到几十兆,系统运行缓慢

运行sync将dirty的内容写回硬盘
$sync

通过修改proc系统的drop_caches清理free的cache
$echo 3 > /proc/sys/vm/drop_caches

drop_caches的详细文档如下:

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.

To free pagecache:

    * echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

    * echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

    * echo 3 > /proc/sys/vm/drop_caches

As this is a non-destructive operation, and dirty objects are not freeable, the user should run "sync" first in order to make sure all cached objects are freed.

This tunable was added in 2.6.16.

修改/etc/sysctl.conf 添加如下选项后就不会内存持续增加
 
vm.dirty_ratio = 1
 
vm.dirty_background_ratio=1
 
vm.dirty_writeback_centisecs=2
 
vm.dirty_expire_centisecs=3
 
vm.drop_caches=3
 
vm.swappiness =100
 
vm.vfs_cache_pressure=163
 
vm.overcommit_memory=2
 
vm.lowmem_reserve_ratio=32 32 8
 
kern.maxvnodes=3
上面的设置比较粗暴,使cache的作用基本无法发挥。需要根据机器的状况进行适当的调节寻找最佳的折衷。

### 如何在Linux系统中清理缓存 #### 使用命令行工具清理DNS缓存 对于希望清除域名解析记录的用户来说,在Linux上可以采用多种方式来刷新DNS缓存。如果使用的是`nscd`(名称服务高速缓存守护程序),那么可以通过重启该服务达到目的: ```bash sudo systemctl restart nscd ``` 当环境中配置有`Systemd-resolved`作为本地解析器时,则应执行如下指令[^1]: ```bash sudo systemd-resolve --flush-caches ``` 这会清空由`resolved`管理的所有类型的查询结果存储。 #### 清理文件系统缓冲区与页面缓存 为了释放被占用的内存资源,包括但不限于磁盘读写操作所产生的临时数据副本,可利用同步机制配合特定参数调用来完成此任务。下面给出了一种常见做法[^2]: ```bash sync; echo 3 | sudo tee /proc/sys/vm/drop_caches ``` 上述脚本首先确保所有未保存的数据都被写入到持久化介质之中;接着通过向内核发送信号的方式指示其丢弃当前持有的各类缓存项。“3”的含义涵盖了pagecache、inodes以及directory entries三者。 #### 定期自动清理策略设置 考虑到长期运行的服务可能会逐渐积累大量不再使用的缓存对象从而影响性能表现,建立周期性的维护作业显得尤为重要。借助于cron定时调度功能,能够轻松实现每小时一次的自动化处理流程[^3]: ```bash 0 * * * * root sync; echo 3 > /proc/sys/vm/drop_caches ``` 这段crontab表达式定义了一个简单的计划任务,它会在每天整点时刻触发前述提到的一系列动作序列。 #### 编程接口层面的操作方法 针对那些倾向于直接嵌入应用程序逻辑内部解决此类需求的情况而言,C++开发者同样拥有可行的选择方案。具体来讲就是运用标准库函数结合操作系统特性达成目标效果[^4]: ```cpp #include <unistd.h> #include <fcntl.h> void clearCache() { int fd = open("/proc/sys/vm/drop_caches", O_WRONLY); if (fd != -1) { write(fd, "3\n", 2); // Drop all caches close(fd); } } ``` 以上代码片段展示了怎样编写一段简洁有效的跨平台兼容性强的小型辅助函数用于即时清除指定范围内的缓存条目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值