运维排查-使用hcache插件排查Buffer/cache占用过高

  • Post author:
  • Post category:其他


一 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的比值


hcache查看系统缓存 – 走看看

三 关于清除journal日志

3.1 清除journal日志

清理方法可以采用按照日期清理,或者按照允许保留的容量清理

journalctl –vacuum-time=2d

journalctl –vacuum-size=500M


journalctl 清理journal日志 – 九重霄 – 博客园



版权声明:本文为u011066470原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。