服务器buff/cache过高 ,定时任务自动清理缓存

image-20250322172835108

新建 清理缓存脚本

vim  /opt/script/cron/cleanCache.sh
#!/bin/bash
echo "开始清除缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 10 #延迟10秒
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "清理结束"

设置 定时任务

打开配置文件:

crontab -e

添加需要定时执行的脚本文件
以下为每5分钟自动执行脚本文件

*/5 * * * * sh /opt/script/cron/cleanCache.sh

设置crond开机自启动

systemctl start crond.service
systemctl enable crond.service

查看定时任务

cat /var/log/cron | grep cleanCachecat /var/log/cron | grep cleanCache

image-20250322173236674

Linux 系统中,**Buff/Cache(缓冲区/缓存)过**是常见现象,但有时会被误认为“内存泄漏”或“内存不足”。实际上,Linux 会主动利用空闲内存来缓存磁盘数据(如文件系统缓存、块设备缓冲),以提升系统性能。当应用程序需要更多内存时,系统会自动释放这些缓存。 --- ### ✅ 如何查看 Buff/Cache 使用情况? 使用 `free` 命令查看内存使用: ```bash free -h ``` 输出示例: ``` total used free shared buff/cache available Mem: 15Gi 2.0Gi 8.0Gi 200Mi 5.5Gi 12Gi Swap: 2.0Gi 0B 2.0Gi ``` - **buff/cache**:表示被用作缓冲区(buffer)和页面缓存cache)的内存。 - **available**:才是真正可用于新程序的内存,包含了可回收的 cache。 > 🔍 关键点:只要 `available` 内存充足, buff/cache 并不表示有问题。 --- ### ❓什么时候才需要排查? 只有当出现以下情况时,才需要深入排查: 1. 系统响应变慢,频繁卡顿; 2. 应用程序申请内存失败(OOM); 3. `available` 内存很低(接近 0); 4. Swap 使用率持续升。 否则, Cache 是正常且有益的行为。 --- ### 🔎 排查步骤 #### 步骤 1:确认是否真的内存紧张 ```bash # 查看详细内存信息 cat /proc/meminfo | grep -i 'memfree\|memavailable\|buffers\|cached' # 输出类似: # MemFree: 8000000 kB # MemAvailable: 12000000 kB # Buffers: 300000 kB # Cached: 4500000 kB ``` - 如果 `MemAvailable` 远大于 `MemFree`,说明大量内存是可回收的 cache,系统健康。 #### 步骤 2:分析哪些进程或文件导致大量缓存 使用 `pcstat` 工具查看文件缓存情况(需安装): ```bash # 安装 pcstat(基于 Go) go install github.com/tobert/pcstat/cmd/pcstat@latest # 查看某个文件是否被缓存 pcstat /var/log/syslog # 查看目录下所有文件的缓存状态 find /var/log -type f -exec pcstat {} \; ``` 或者使用 `cachestat`(来自 bcc-tools)监控内核缓存行为: ```bash # 安装 bcc-tools sudo apt install bpfcc-tools linux-tools-common # 实时查看 page cache 命中/未命中统计 sudo cachestat 1 ``` 输出字段含义: - `HITS`: 缓存命中次数 - `MISSES`: 缓存未命中(从磁盘读取) - `DIRTY`: 脏页数量 - `BUFFERS_MB`: 缓冲区大小(MB) > MISSES 表示 I/O 性能瓶颈,可能需要优化存储或增加内存。 #### 步骤 3:识别大量读写文件的进程 使用 `iotop` 查看实时 I/O 活动: ```bash sudo iotop -o # 只显示有 I/O 的进程 ``` 重点关注: - `SWAPIN` 和 `IO>` 列的进程; - 持续大量读写文件的进程(如数据库、日志服务、备份脚本等)。 --- ### 🛠️ 处理办法 #### 方法 1:手动释放缓存(仅用于测试或紧急情况) ⚠️ 注意:生产环境慎用!这只是临时释放,并不能解决根本问题。 ```bash # 必须先同步数据到磁盘 sync # 释放 pagecache、dentries 和 inodes echo 3 > /proc/sys/vm/drop_caches ``` 数字含义: - `1`:释放 pagecache - `2`:释放 dentries 和 inodes - `3`:全部释放 > ⚠️ 该操作会导致后续 I/O 变慢,因为缓存被清空了。 #### 方法 2:调整脏页回写策略(避免突发 I/O 压力) 修改 `/etc/sysctl.conf` 中的 VM 参数: ```conf # 减少脏页驻留内存时间(默认 30 秒) vm.dirty_expire_centisecs = 1500 # 提前开始写回脏页(默认 10%) vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 # 加快写回线程速度 vm.dirty_writeback_centisecs = 500 ``` 应用配置: ```bash sudo sysctl -p ``` #### 方法 3:限制特定进程的缓存影响(cgroup v2) 对于容器化或关键业务,可通过 cgroup 控制内存使用: ```bash # 创建一个 cgroup mkdir /sys/fs/cgroup/nocache # 限制内存使用(例如 1GB) echo 1G > /sys/fs/cgroup/nocache/memory.max # 将进程加入该组 echo $PID > /sys/fs/cgroup/nocache/cgroup.procs ``` --- ### ✅ 最佳实践建议 | 建议 | 说明 | |------|------| | ✔ 不要盲目清理缓存 | Linux缓存机制是为了加速访问,不是内存泄漏 | | ✔ 监控 `MemAvailable` 而非 `used` | 才是真正可用内存 | | ✔ 使用 `iotop`, `cachestat`, `pcstat` 分析根源 | 找出是谁在大量读写 | | ✔ 优化 I/O 密集型应用 | 如数据库调优、日志轮转、异步写入等 | | ✔ 升级硬件或加内存 | 若确实存在 I/O 瓶颈 | --- ### 示例:一键诊断脚本 ```bash #!/bin/bash echo "=== Memory Info ===" free -h echo -e "\n=== Detailed MemInfo (Buffers/Cached) ===" grep -i 'memfree\|memavailable\|buffers\|cached' /proc/meminfo echo -e "\n=== Top 5 processes by memory (including cache impact) ===" ps aux --sort=-%mem | head -6 echo -e "\n=== I/O Activity (top 5 by read+write) ===" iotop -b -n 1 | head -10 | tail -6 ``` 保存为 `check_cache.sh` 并运行即可快速诊断。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值