一 buffer和cache产生原因
1.1 buffer和cache产生的原因
1.当你的服务进程
在对文件进行读写的时候
,Linux内核为了
提高服务的读写速度,则将会把文件放在此处的 buffer/cache 中进行缓存使用
,由于 Linux服务的特点
便是任何事物都会以文件的形式进行存在,所以你会发现不管你是否对文件做了大规模的读写,机器的 buffer/cache 是一直都存在的,并且持续的增高不下
,这是因为服务器所产生的网络连接也好,
用户协议的(UDP)套接字也好,这部分的数据系统都会为应用程序创建对应的文件描述符
,而这些文件
描述符的使用,则又都会重新进入 buffer/cache 中做读写使用
,所以这也是你的机器始终都会存在较高 buffer/cache 的原因。
2.
在服务内存够用的情况下,
Linux内核为了加快对文件的读写效率会将文件放入buffer/cache 中 以保证读写效率
,
但其实,尽管当
你的应用程序对文件的读写运行结束后,buffer/cache 也不会自动释放该部分内存,而是作为缓冲进行保留
,等到你的服务进程在下一次进行相同文件的读写时就可以直接使用,省去了各种重新进行内存初始化的操作;所以这将会导致,
当你的应用进程频繁对不同的文件进行读写时,你会发现服务所可以直接使用的free内存将会越来越少的一个重要原因
;难道 buffer/cache 在这样无休止的缓存当中就不会自动释放?当然不是,
当服务器在内存压力较大的情况下时,则将会自动进行内存的回收,作为free空间分给其它进程使用
,这其中主要回收的一个内存
,则是 buffer/cache 的缓冲区内存块;
Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令 – 陈咬金 – 博客园
1.2 手动回收机制
除了在系统进程内存使用较大压力的情况下进行内存的回收外,我们也可以进行手动buffer/cache回收,但由于buffer/cache主要是用于文件的读写使用,所以进行文件回收时,一般常伴随系统的IO彪高,因为系统内核也对比cache中的数据与硬盘中的数据是否一致,如果不一致需要写会,然后才能进行内存的回收;
Linux具有先进的缓存机制,
会针对dentry、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。
但是在进行了大量文件操作之后,缓存会把内存资源基本用光,虽然文件读取效率提高了,但是物理内存会逐渐被吃光。
因为服务进行了频繁的文件读写操作,但是为什么操作系统不会主动回收呢,
原来是因为drop_caches的默认参数设置的就是不释放的。
drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存
# sync
# echo 1 > /proc/sys/vm/drop_caches
# echo 2 > /proc/sys/vm/drop_caches
# echo 3 > /proc/sys/vm/drop_caches
手动执行后,只是暂时解决问题,我们可以写一个脚本配合定时任务来定时检查清除缓存:
#!/bin/bash
Mem=$(free -m | awk 'NR==2' | awk '{print $4}')
if [ $Mem -gt 1024 ];
then
echo "Service memory capacity is normal!" > /dev/null
else
sync
echo "1" > /proc/sys/vm/drop_caches
echo "2" > /proc/sys/vm/drop_caches
echo "3" > /proc/sys/vm/drop_caches
sync
fi
最后,只需将脚本加入定时任务,即可!
Linux的buff/cache占用内存过高解决方法_一条很咸的的博客-CSDN博客_buff/cache过高
二 hcache插件
2.1 hcache插件的作用
hcache是基于pcstat的,pcstat可以查看某个文件是否被缓存和根据进程pid来查看都缓存了哪些文件。hcache在其基础上增加了
查看整个操作系统Cache和根据使用Cache大小排序的特性。
2.2 hache的安装
2.2.1 go语言环境的安装
1.下载地址:
wget
https://dl.google.com/go/go1.17.8.linux-amd64.tar.gz
2.将软件包上传到服务器上
3.将go安装包解压到/usr/local目录下
tar -zxvf go1.17.8.linux-amd64.tar.gz -C /usr/local
4.配置环境变量
vim /etc/profile
[root@localhost bigdata-software]# cd /usr/local/
[root@localhost local]# ls
bin etc games go include java lib lib64 libexec sbin share src
[root@localhost local]# cd go
[root@localhost go]# ls
api AUTHORS bin codereview.cfg CONTRIBUTING.md CONTRIBUTORS doc lib LICENSE misc PATENTS pkg README.md SECURITY.md src test VERSION
[root@localhost go]# pwd
/usr/local/go
[root@localhost go]# vim /etc/profile
配置内容如下:
export GO_ROOT=/usr/local/go
export PATH=$GO_ROOT/bin:$PATH
5.启用环境变量: source /etc/profile
6.查看go是否安装成功:
[root@localhost go]# source /etc/profile
[root@localhost go]# go version
go version go1.17.8 linux/amd64
2.2.2 hache的安装
1.下载地址
https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache
2.上传服务器,赋予执行权限
chmod +x hcache
3.移动到
/usr/local/bin/
mv hcache /usr/local/bin/
4.输入命令: hcahe -top 10
查看占用最多的10个文件
2.2.3 内容显示解释
结果展示含义如下:
name: 占有缓存的文件全路径
size: 文件大小
pages: 站了多少个Block
cached: 缓存使用了多少个Block
Percent: cached与pages的比值
三 关于清除journal日志
3.1 清除journal日志
清理方法可以采用按照日期清理,或者按照允许保留的容量清理
journalctl –vacuum-time=2d
journalctl –vacuum-size=500M
journalctl 清理journal日志 – 九重霄 – 博客园