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

这篇具有很好参考价值的文章主要介绍了【linux】关于内存free转换到buffer/cache之后,内存被用完的解决思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

问了chatgpt是这么解释的:
【linux】关于内存free转换到buffer/cache之后,内存被用完的解决思路,linux,运维,服务器

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

执行free -m查询内存状态
【linux】关于内存free转换到buffer/cache之后,内存被用完的解决思路,linux,运维,服务器
发现内存越来越少了

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 1
 echo 3 > /proc/sys/vm/drop_caches"

clearcache.sh文件设置执行权限

chmod 755 clearcache.sh

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

crontab -e

添加以下行,保存并退出。文章来源地址https://www.toymoban.com/news/detail-629382.html

 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

到了这里,关于【linux】关于内存free转换到buffer/cache之后,内存被用完的解决思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux学习之内存查看命令free和top

    我用来演示的系统使用 CentOS Linux release 7.6.1810 (Core) ,内核版本是 3.10.0-957.el7.x86_64 。 Linux在进程申请内存的时候,一般都是尽可能给进程内存,因为进程在申请内存的时候有损耗。 free 命令可以看以 k 为单位的内存。 free -m 以 MB 为单位显示内存。 可以看得出 free = total - us

    2024年02月12日
    浏览(34)
  • 实战|掌握Linux内存监视:free命令详解与使用技巧

    大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第53篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。 如果文章有什么需要改进的地方还请

    2024年01月25日
    浏览(29)
  • Buffer(缓冲)、Cache(缓存)

    Buffer 用途:缓冲通常用于临时存储数据,以平衡不同速度的数据传输过程直接的差异。它可以用来解决数据传输速度不匹配的问题。 例如: 当您在观看视频时,视频播放器会缓冲一段时间的视频数据,以便在网络速度慢或不稳定的情况下也能够流畅的播放 用完之后,就清除

    2024年02月03日
    浏览(37)
  • Linux中buff/cache内存占用过高,手动释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图:(可以看到总内存就251G,buff/cache占用了174G) 什么是buff buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。 什么是cache cache(Page

    2024年02月12日
    浏览(32)
  • linux中 buff/cache占用内存过多

    Linux服务器用一段时间就会出现buff/cache占用内存过多的情况,导致free空闲内存变得非常少,严重影响使用; 这个时候就可以用如下命令去清除一下cache内存 echo 1 /proc/sys/vm/drop_caches echo 2 /proc/sys/vm/drop_caches echo 3 /proc/sys/vm/drop_caches ##/proc/sys/vm/drop_caches的值为是0-3之间的数字,代

    2024年01月18日
    浏览(30)
  • linux下的buff/cache内存占用过高-手动清除释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图: 可以看到占用了377M的内存 什么是buff buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。 什么是cache cache(Page Cache)是一种高速缓

    2024年02月07日
    浏览(84)
  • 《Linux系列》buff/cache占用太多内存,如何释放内存?

      当遇到很多日志文件时,想要清理部分日志,但是一个一个清理太过麻烦。所以希望通过从文件时间上做逻辑判断,实现把某一时间之前的文件删除。 ll查看所有的日志信息 wc -l统计数量 find查找文件命令 -name指定查找文件的名称 -mtime +n, 查找n天前的文件 -exec 执行脚本固

    2024年02月16日
    浏览(29)
  • Linux下内存buff/cache占用过多问题解决

    在Linux下经常会遇到buff/cache内存占用过多问题, 尤其是使用云主机的时候最严重,由于很多是虚拟内存,因此如果buff/cache占用过大的, free空闲内存就很少,影响使用; 通常内存关系是: 普通机器:total=used+free 虚拟机器:total=used+free+buff/cache 比如说用阿里云云主机,就是

    2024年02月16日
    浏览(36)
  • linux内核内存分配函数kmalloc()、kzalloc()、vmalloc()与__get_free_page()

    目录 1、值得注意的点 2、函数原型 2.1 kmalloc()与kfree() 2.2 kzalloc与kfree() 2.3 vmalloc与vfree() 2.4 __get_free_page()与free_pages() 2.5 __get_free_pages()与free_pages() 2.6 get_zeroed_page() 1、内核把物理 页 作为内存管理的基本单位,尽管处理器的最小寻址单位通常为字(或者为字节),但是MMU(内存

    2024年02月12日
    浏览(31)
  • Linux查看CPU和内存使用情况(ps、free、htop、atop、nmon、/proc/meminfo等)

    1.CPU占用最多的前10个进程: 2.内存消耗最多的前10个进程 3.虚拟内存使用最多的前10个进程 查看某一类进程占用总资源 思路:使用ps命令,对内存相关的列进行求和。 查看哪一列是内存、哪一列是内存百分比 由上图,内存百分比 我们就使用$4, 具体内存(KB)我们就用$6 如下

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包