【linux】关于内存free转换到buffer/cache之后,内存被用完的解决思路

关于内存free转换到buffer/cache之后,内存被用完的解决思路

文章目录

  • 关于内存free转换到buffer/cache之后,内存被用完的解决思路
    • 1.可用内存不断减少问题现象
    • 2.排查方案:用hcache检查buffer/cache 过高如何排查是由那几个进程引起的
      • 2.1`hcache`命令查询最大buffer/cache进程号
        • 2.1.1 全局显示10个最大的被缓存文件
        • 2.1.2 查询第一个的进程号
        • 2.1.3 取当前进程号所打开的所有文件信息
          • 2.1.3.1 `hcache `
          • 2.1.4 `lsof `
    • 2.3 解决方案
    • 参考文档:

最近跑程序,发现linux在执行大量读写操作后,内存的可用(free)会不断被buffer/cache所占据,导致内存空间被用完,一直以为是代码哪里写的问题,导致内存泄露,后来发现就是发生了I/O读写操作后,会产生buffer/cache,需要定时释放。

这个情况也是第一次遇到,不知道如何解决

问了chatgpt是这么解释的:
在这里插入图片描述

1.可用内存不断减少问题现象

执行free -m查询内存状态
在这里插入图片描述
发现内存越来越少了

2.排查方案:用hcache检查buffer/cache 过高如何排查是由那几个进程引起的

hcache安装

sudo wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache -O /usr/local/bin/hcache ;\
chmod +x /usr/local/bin/hcache

2.1hcache命令查询最大buffer/cache进程号

2.1.1 全局显示10个最大的被缓存文件

hcache --top 10 全局显示10个最大的被缓存文件

hcache --top 10 
+------------------------------------------------------------------+----------------+------------+-----------+---------+
| Name                                                             | Size (bytes)   | Pages      | Cached    | Percent |
|------------------------------------------------------------------+----------------+------------+-----------+---------|
| /usr/bin/dockerd                                                 | 95731632       | 23372      | 16990     | 072.694 |
| /usr/bin/containerd                                              | 52008056       | 12698      | 10690     | 084.186 |
| /usr/lib/x86_64-linux-gnu/libLLVM-13.so.1                        | 99813728       | 24369      | 9785      | 040.153 |
| /snap/snapd/19457/usr/lib/snapd/snapd                            | 33291328       | 8128       | 7488      | 092.126 |
| /usr/lib/x86_64-linux-gnu/dri/crocus_dri.so                      | 25006904       | 6106       | 2986      | 048.903 |
| /usr/lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.63.4           | 73062112       | 17838      | 2641      | 014.805 |
| /usr/lib/x86_64-linux-gnu/libmozjs-91.so.91.10.0                 | 12184728       | 2975       | 2634      | 088.538 |
| /usr/bin/containerd-shim-runc-v2                                 | 9489240        | 2317       | 2306      | 099.525 |
| /var/log/journal/56abef55033544eaab9e41b9caf03250/system.journal | 8388608        | 2048       | 1216      | 059.375 |
| /usr/bin/python3.10                                              | 5913032        | 1444       | 1175      | 081.371 |
+------------------------------------------------------------------+----------------+------------+-----------+---------+

2.1.2 查询第一个的进程号

lsof /usr/bin/dockerd
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF     NODE NAME
dockerd 1099 root txt    REG   8,18 95731632 17564073 /usr/bin/dockerd

2.1.3 取当前进程号所打开的所有文件信息

2.1.3.1 hcache
hcache -pid 1099
+--------------------------------------------------+----------------+------------+-----------+---------+
| Name                                             | Size (bytes)   | Pages      | Cached    | Percent |
|--------------------------------------------------+----------------+------------+-----------+---------|
| /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2   | 240936         | 59         | 59        | 100.000 |
| /var/lib/docker/buildkit/snapshots.db            | 16384          | 4          | 4         | 100.000 |
| /usr/lib/x86_64-linux-gnu/libnss_systemd.so.2    | 309600         | 76         | 76        | 100.000 |
| /var/lib/docker/volumes/metadata.db              | 65536          | 16         | 11        | 068.750 |
| /usr/lib/x86_64-linux-gnu/libselinux.so.1        | 166280         | 41         | 41        | 100.000 |
| /usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02.1 | 438864         | 108        | 105       | 097.222 |
| /var/lib/docker/buildkit/cache.db                | 32768          | 8          | 5         | 062.500 |
| /usr/lib/x86_64-linux-gnu/libc.so.6              | 2216304        | 542        | 532       | 098.155 |
| /usr/lib/x86_64-linux-gnu/libsystemd.so.0.32.0   | 807936         | 198        | 190       | 095.960 |
| /usr/bin/dockerd                                 | 95731632       | 23372      | 16990     | 072.694 |
| /var/lib/docker/buildkit/containerdmeta.db       | 16384          | 4          | 4         | 100.000 |
| /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.10.4   | 613064         | 150        | 85        | 056.667 |
| /usr/lib/x86_64-linux-gnu/libm.so.6              | 940560         | 230        | 187       | 081.304 |
| /usr/lib/x86_64-linux-gnu/liblzma.so.5.2.5       | 170456         | 42         | 42        | 100.000 |
| /usr/lib/x86_64-linux-gnu/libcap.so.2.44         | 39024          | 10         | 10        | 100.000 |
| /usr/lib/x86_64-linux-gnu/liblz4.so.1.9.3        | 125152         | 31         | 31        | 100.000 |
| /var/lib/docker/buildkit/metadata_v2.db          | 16384          | 4          | 4         | 100.000 |
| /usr/lib/x86_64-linux-gnu/libgpg-error.so.0.32.1 | 149760         | 37         | 37        | 100.000 |
| /usr/lib/x86_64-linux-gnu/libgcrypt.so.20.3.4    | 1296312        | 317        | 114       | 035.962 |
| /usr/lib/x86_64-linux-gnu/libzstd.so.1.4.8       | 841808         | 206        | 163       | 079.126 |
| /usr/lib/x86_64-linux-gnu/libudev.so.1.7.2       | 166240         | 41         | 41        | 100.000 |
+--------------------------------------------------+----------------+------------+-----------+---------+
2.1.4 lsof
lsof -p 1099
COMMAND  PID USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
dockerd 1099 root  cwd       DIR               8,18     4096          2 /
dockerd 1099 root  rtd       DIR               8,18     4096          2 /
dockerd 1099 root  txt       REG               8,18 95731632   17564073 /usr/bin/dockerd
dockerd 1099 root  mem-W     REG               8,18    32768   13250873 /var/lib/docker/buildkit/cache.db
dockerd 1099 root  mem-W     REG               8,18    16384   13250871 /var/lib/docker/buildkit/metadata_v2.db
dockerd 1099 root  mem-W     REG               8,18    16384   13250870 /var/lib/docker/buildkit/snapshots.db
dockerd 1099 root  mem-W     REG               8,18    16384   13250869 /var/lib/docker/buildkit/containerdmeta.db
dockerd 1099 root  mem       REG               8,18   309600   17564128 /usr/lib/x86_64-linux-gnu/libnss_systemd.so.2
dockerd 1099 root  mem-W     REG               8,18    65536   13250858 /var/lib/docker/volumes/metadata.db
dockerd 1099 root  mem       REG               8,18   613064   17569291 /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.10.4
dockerd 1099 root  mem       REG               8,18   149760   17570515 /usr/lib/x86_64-linux-gnu/libgpg-error.so.0.32.1
dockerd 1099 root  mem       REG               8,18   940560   17570772 /usr/lib/x86_64-linux-gnu/libm.so.6
dockerd 1099 root  mem       REG               8,18   166280   17571132 /usr/lib/x86_64-linux-gnu/libselinux.so.1
dockerd 1099 root  mem       REG               8,18  1296312   17570433 /usr/lib/x86_64-linux-gnu/libgcrypt.so.20.3.4
dockerd 1099 root  mem       REG               8,18   841808   17571483 /usr/lib/x86_64-linux-gnu/libzstd.so.1.4.8
dockerd 1099 root  mem       REG               8,18  2216304   17570121 /usr/lib/x86_64-linux-gnu/libc.so.6
dockerd 1099 root  mem       REG               8,18   166240   17564812 /usr/lib/x86_64-linux-gnu/libudev.so.1.7.2
dockerd 1099 root  mem       REG               8,18    39024   17564050 /usr/lib/x86_64-linux-gnu/libcap.so.2.44
dockerd 1099 root  mem       REG               8,18   125152   17570767 /usr/lib/x86_64-linux-gnu/liblz4.so.1.9.3
dockerd 1099 root  mem       REG               8,18   170456   17570769 /usr/lib/x86_64-linux-gnu/liblzma.so.5.2.5
dockerd 1099 root  mem       REG               8,18   438864   17570258 /usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02.1
dockerd 1099 root  mem       REG               8,18   807936   17563757 /usr/lib/x86_64-linux-gnu/libsystemd.so.0.32.0
dockerd 1099 root  mem       REG               8,18   240936   17569784 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
dockerd 1099 root    0r      CHR                1,3      0t0          5 /dev/null
dockerd 1099 root    1u     unix 0xffff8b1548ec0c00      0t0      25224 type=STREAM
dockerd 1099 root    2u     unix 0xffff8b1548ec0c00      0t0      25224 type=STREAM
dockerd 1099 root    3u     unix 0xffff8b1551325400      0t0      25422 /var/run/docker/metrics.sock type=STREAM
dockerd 1099 root    4u     unix 0xffff8b1552019400      0t0      19442 /run/docker.sock type=STREAM
dockerd 1099 root    5u  a_inode               0,14        0       1049 [eventpoll]
dockerd 1099 root    6r     FIFO               0,13      0t0      28206 pipe
dockerd 1099 root    7w     FIFO               0,13      0t0      28206 pipe
dockerd 1099 root    8u     unix 0xffff8b1543359800      0t0      25423 type=STREAM
dockerd 1099 root    9u     unix 0xffff8b1547435c00      0t0      28373 type=STREAM
dockerd 1099 root   10uW     REG               8,18    65536   13250858 /var/lib/docker/volumes/metadata.db
dockerd 1099 root   11r      REG                0,4        0 4026531840 net
dockerd 1099 root   12u  netlink                         0t0      28473 ROUTE
dockerd 1099 root   13u  netlink                         0t0      28474 XFRM
dockerd 1099 root   14u  netlink                         0t0      28475 NETFILTER
dockerd 1099 root   15u     unix 0xffff8b1547434800      0t0      28605 /var/run/docker/libnetwork/fe50f8fc06f9.sock type=STREAM
dockerd 1099 root   16u     FIFO               0,24      0t0       1610 /run/docker/containerd/32d852ca2c732cc2017657530166bedb0d0e34eba9b7cd2eaa82484e4aef7b1d/init-stdout
dockerd 1099 root   17r     FIFO               0,24      0t0       1610 /run/docker/containerd/32d852ca2c732cc2017657530166bedb0d0e34eba9b7cd2eaa82484e4aef7b1d/init-stdout
dockerd 1099 root   18u     FIFO               0,24      0t0       1611 /run/docker/containerd/32d852ca2c732cc2017657530166bedb0d0e34eba9b7cd2eaa82484e4aef7b1d/init-stderr
dockerd 1099 root   19r     FIFO               0,24      0t0       1611 /run/docker/containerd/32d852ca2c732cc2017657530166bedb0d0e34eba9b7cd2eaa82484e4aef7b1d/init-stderr
dockerd 1099 root   20w      REG               8,18    18767   13762653 /var/lib/docker/containers/32d852ca2c732cc2017657530166bedb0d0e34eba9b7cd2eaa82484e4aef7b1d/32d852ca2c732cc2017657530166bedb0d0e34eba9b7cd2eaa82484e4aef7b1d-json.log
dockerd 1099 root   21u     FIFO               0,24      0t0       1615 /run/docker/containerd/c05b580cb355531b61b498476e6b5f61816fc5cfbf2fd74a174452f373fce8d7/init-stdout
dockerd 1099 root   22u     FIFO               0,24      0t0       1616 /run/docker/containerd/c05b580cb355531b61b498476e6b5f61816fc5cfbf2fd74a174452f373fce8d7/init-stderr
dockerd 1099 root   23r     FIFO               0,24      0t0       1615 /run/docker/containerd/c05b580cb355531b61b498476e6b5f61816fc5cfbf2fd74a174452f373fce8d7/init-stdout
dockerd 1099 root   24r     FIFO               0,24      0t0       1616 /run/docker/containerd/c05b580cb355531b61b498476e6b5f61816fc5cfbf2fd74a174452f373fce8d7/init-stderr
dockerd 1099 root   25w      REG               8,18   762036   13500701 /var/lib/docker/containers/c05b580cb355531b61b498476e6b5f61816fc5cfbf2fd74a174452f373fce8d7/c05b580cb355531b61b498476e6b5f61816fc5cfbf2fd74a174452f373fce8d7-json.log
dockerd 1099 root   26uW     REG               8,18    16384   13250869 /var/lib/docker/buildkit/containerdmeta.db
dockerd 1099 root   27uW     REG               8,18    16384   13250870 /var/lib/docker/buildkit/snapshots.db
dockerd 1099 root   28uW     REG               8,18    16384   13250871 /var/lib/docker/buildkit/metadata_v2.db
dockerd 1099 root   29u     sock                0,8      0t0      29001 protocol: NETLINK
dockerd 1099 root   30u     sock                0,8      0t0      29829 protocol: UDP
dockerd 1099 root   31u     sock                0,8      0t0      29003 protocol: UDP
dockerd 1099 root   32u     sock                0,8      0t0      31818 protocol: NETLINK
dockerd 1099 root   33u     sock                0,8      0t0      29004 protocol: TCP
dockerd 1099 root   34u     sock                0,8      0t0      29830 protocol: TCP
dockerd 1099 root   35uW     REG               8,18    32768   13250873 /var/lib/docker/buildkit/cache.db
dockerd 1099 root   38u     FIFO               0,24      0t0       1788 /run/docker/containerd/f3ac3845bcaea0baf810c4ffa89097d34f8dc851c949993c90719dbf2df8cdda/init-stdin
dockerd 1099 root   39u     FIFO               0,24      0t0       1789 /run/docker/containerd/f3ac3845bcaea0baf810c4ffa89097d34f8dc851c949993c90719dbf2df8cdda/init-stdout
dockerd 1099 root   40w     FIFO               0,24      0t0       1788 /run/docker/containerd/f3ac3845bcaea0baf810c4ffa89097d34f8dc851c949993c90719dbf2df8cdda/init-stdin
dockerd 1099 root   41w      REG               8,18      149   13788026 /var/lib/docker/containers/f3ac3845bcaea0baf810c4ffa89097d34f8dc851c949993c90719dbf2df8cdda/f3ac3845bcaea0baf810c4ffa89097d34f8dc851c949993c90719dbf2df8cdda-json.log
dockerd 1099 root   42r     FIFO               0,24      0t0       1789 /run/docker/containerd/f3ac3845bcaea0baf810c4ffa89097d34f8dc851c949993c90719dbf2df8cdda/init-stdout
dockerd 1099 root   46u     sock                0,8      0t0      35021 protocol: NETLINK

2.3 解决方案

除了在系统进程内存使用较大压力的情况下进行内存的回收外,我们也可以进行手动的·buffer/cache·回收,但由于·buffer/cache·主要是用于文件的读写使用,所以进行文件回收时,一般常伴随系统的IO飙高,因为系统内核也对比cache中的数据与硬盘中的数据是否一致,如果不一致需要写入,然后才能进行内存的回收;

$ sync
# 将内存中数据强制先刷新到磁盘中清理Buffer缓存区域
$ echo 1 > /proc/sys/vm/drop_caches  # 表示清除pagecache。
$ echo 2 > /proc/sys/vm/drop_caches  # 表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
$ echo 3 > /proc/sys/vm/drop_caches  # 表示清除pagecache和slab分配器中的缓存对象

如果你必须清除磁盘高速缓存,第一个命令在企业和生产环境中是最安全,"...echo 1> ..."只会清除页面缓存。 在生产环境中不建议使用上面的第三个选项"...echo 3 > ..." ,除非你明确自己在做什么,因为它会清除缓存页目录项inodes

创建一个 shell 脚本,通过一个 cron 调度任务在每天下午2点自动清除RAM缓存。如下创建一个 shell 脚本 clearcache.sh 并在其中添加以下行:

 #!/bin/bash# 注意,我们这里使用了 "echo 3",但是不推荐使用在产品环境中,应该使用 echo 1echo 3 > /proc/sys/vm/drop_caches"

clearcache.sh文件设置执行权限

chmod 755 clearcache.sh

现在设置一个每天下午2点的定时任务来清除RAM缓存,打开crontab进行编辑。

crontab -e

添加以下行,保存并退出。

 0 3 * * * /root/shell_script/clear_cache.sh

参考文档:

  1. https://blog.csdn.net/imliuqun123/article/details/130149771
  2. https://huaweicloud.csdn.net/63566961d3efff3090b5e461.html?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-1-125906007-blog-130149771.235%5Ev38%5Epc_relevant_anti_vip&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-1-125906007-blog-130149771.235%5Ev38%5Epc_relevant_anti_vip&utm_relevant_index=2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55234.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源项目--稻草】Day04

【开源项目--稻草】Day04 1. 续 VUE1.1 完善VUEAJAX完成注册功能 Spring验证框架什么是Spring验证框架使用Spring-Validation 稻草问答-学生首页显示首页制作首页的流程开发标签列表标签列表显示原理 从业务逻辑层开始编写控制层代码开发问题列表开发业务逻辑层开发页面和JS代码…

Mysql面试突击班索引,事务与锁

Mysql面试突击班索引,事务与锁 1.为什么Mysql要使用B树做为索引而不用B树 B树能显著减少IO次数,提高效率B树的查询效率更加稳定,因为数据放在叶子节点B树能提高范围查询的效率,因为叶子节点指向下一个叶子节点B树采取顺序读 2.…

【SCSS】网格布局中的动画

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container">&l…

【云原生K8s】二进制部署单master K8s+etcd集群

一、实验设计 mater节点master01192.168.190.10kube-apiserver kube-controller-manager kube-scheduler etcd node节点node01192.168.190.20kubelet kube-proxy docker (容…

【100天精通python】Day27:文件与IO操作_CSV文件处理

目录 专栏导读 1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取CSV文件的特定行 5 csv 文件的特殊处理 5.1 处理包含逗号、换行符、引号的字段 5.…

Linux下TCP网络服务器与客户端通信程序入门

文章目录 目标服务器与客户端通信流程TCP服务器代码TCP客户端代码 目标 实现客户端连接服务器&#xff0c;通过终端窗口发送信息给服务器端&#xff0c;服务器接收到信息后对信息数据进行回传&#xff0c;客户端读取回传信息并返回。 服务器与客户端通信流程 TCP服务器代码 …

【JAVA】-【IO流】

文章目录 FileReader读入数据的基本操作FileReader中使用reader()FileWrite写出数据的操作使用FileInputStream、FileOutputStream操作图片缓冲流&#xff08;字节型&#xff09;实现非文本文件的复制 复制文本文件也可以使用字节流&#xff0c;但是不要在内存中读出来&#xf…

【Spring Boot】(二)Spring Boot 配置文件的探索之旅

文章目录 前言一、配置文件的作用二、配置文件的格式2.1 Spring Boot 配置文件格式2.2 properties 和 yml 的区别 三、properties 配置文件3.1 properties 基本语法3.2 配置文件的读取3.3 properties 优缺点分析 四、yml 配置文件说明4.1 yml 基本语法4.2 yml 使用案例4.3 yml …

Python自动化实战之使用Pytest进行API测试详解

概要 每次手动测试API都需要重复输入相同的数据&#xff0c;而且还需要跑多个测试用例&#xff0c;十分繁琐和无聊。那么&#xff0c;有没有一种方法可以让你更高效地测试API呢&#xff1f;Pytest自动化测试&#xff01;今天&#xff0c;小编将向你介绍如何使用Pytest进行API自…

Linux 下设置开机自启动的方法

文章目录 事先准备对于普通的 Linux对于 RedHat Enterprise Linux 9 笔者的运行环境&#xff1a; 设置成功过的 Linux&#xff1a; RedHat Enterprise Linux 9 x86_64 CentOS 8 x86_64 事先准备 进行这个教程之前&#xff0c;必须要先安装好一个 Linux 操作系统。这个 Linux…

前端js--扩展卡片

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet" href"…

安卓:BottomNavigationBar——底部导航栏控件

目录 一、BottomNavigationBar介绍 二、BottomNavigationBar的常用方法及其常用类 &#xff08;一&#xff09;、常用方法 1. 添加菜单项 2. 移除菜单项 3. 设置选中监听器 4. 设置当前选中项 5. 设置徽章 6. 样式和颜色定制 7. 动画效果 8. 隐藏底部导航栏。 9、设…