问题:

服务器用一段时间,buff/cache就会特别高

处理办法:

1.清理,但是发现很大一部分清理不掉

2.查看占用过高的进程,然后进行处理

3.清理journal日志

1.清理

创建脚本(直接执行也行,我是创建脚本便于后期清理,也可将脚本加入到定时任务中)

vi clear_cahe.sh

#!/bin/bash
echo "开始清除缓存"
sync;sync;sync
sleep 10
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
sync

授权

chmod 755 clear_cache.sh

然后执行,./clear_chache.sh

清理后发现,的确清理了一部分,但是很大一部分还是清理不掉

因此这个不能完全解决问题

2.查看占用过高的进程,然后进行处理

github 地址:https://github.com/silenceshell/hcache  
直接下载:
wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache 
chmod 755 hcache
mv hcache /usr/local/bin

使用hcache -top 10 查看占用最大的进程

cd /usr/local/bin

./hcache --top 10

发现 journal日志占用过高

3.清理journal日志

systemd-journal 的坑

默认的配置文件,配置了 Storage=auto。含义为:

  • 如果设置为 volatile,journal 将会保存在内存中,使用位于内存盘的 /run/log/journal 目录(会自动创建)
  • 如果设置为 persistent,journal 将会保存在磁盘中,使用 /var/log/journal 目录 (会自动创建),如果自动创建失败,以及针对启动早期磁盘尚未挂载成功的部分日志, 仍然记录在内存盘。
  • 如果设置为 auto,那么,如果 /var/log/journal 目录存在,则使用该目录记录到磁 盘,如果目录不存在(不会自动创建),则使用内存盘。
  • 如果设置为 none,完全不记录任何日志(但是仍然可以转发给 rsyslog)
  • 默认是 auto

而 默认并不会创建 /var/log/journal 目录,所以都在内存中,占中就会很高

清理 journal 的内存

  • 清除到只剩下最新的 100M 空间:journalctl --vacuum-size=100M
  • 清除到只剩下最近两小时:journalctl --vacuum-time=2h
  • 将内存盘中的数据刷到硬盘:journalctl --flush
  • 或者采用很黄很暴力的清除方法(不推荐):rm -rf /run/log/journal && systemctl restart systemd-journal

建议的解决办法:

以下方法任选一种即可

  • 方法一:创建 /var/log/journal 目录,然后使用 journalctl --flush 将内存盘中 的数据刷到硬盘
  • 方法二:修改 /etc/systemd/journald.conf,配置 Storage=persistent,然后重启 systemd-journal 并使用 journalctl --flush 将内存盘中的数据刷到硬盘
  • 方法三:修改 /etc/systemd/journald.conf,配置 Storage=none,然后重启 systemd-journal

重启命令

systemctl restart systemd-journald.service

我是更改了配置,并且创建了/var/log/journal,然后清理了journal的内存

清理后journal 降下来了

其他的程序再处理即可

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐