buffer/cache导致内存不足的案例分析

目录

一、项目简介

二、问题分析

三、问题处理

什么是buffer/cache?

buffer/cache 需要注意的一些特点

如何进行手动 buffer/cache 回收

手动 buffer/cache 回收可能出现的问题

如何让系统自动回收buffer/cache

vm.min_free_kbytes

四、参考文献


一、项目简介

之前做了一个语音系统,断断续续稳定运行了四年多。前两天突然报故障,系统每10分钟会重启一次。

这个语音系统当时做的比较复杂:冷机主备,双license,带文件同步、数据同步,同时有大量的系统分析文件生成。

二、问题分析

查看系统后,发现free只有700M,但是buff/cache却有7G+。由于系统已经运行四年以上,语音及管理系统代码泄露内存问题已经基本解决完了。而且如果是我们主要进程代码内存泄露一般也不会泄漏到buff/cache。

由于系统有文件同步和数据同步功能,再结合buff/cache的功能,考虑是数据同步或者文件同步引起的buff/cache增长。

怎么得出的结论呢:

  1. 双(主备)系统重启,10分钟内buff/cache会把10G左右内存吃完
  2. 只启动主机,buff/cache基本不会增长到离谱的地步,并能稳定运行。

到这儿基本就分析的差不多了。系统重启的原因是:未知原因的文件或者数据同步导致buff/cache把内存吃完,主要程序申请不到资源异常退出。系统监控到主要程序退出,重新拉起失败后重启设备,让系统转为备机运行。备机上重复此步骤,导致整系统重启。

三、问题处理

原因已经找到,那处理的方法也就有了:

1,找到数据同步/文件同步消耗大量buff/cache的根因。

2,让系统不要进行数据同步/文件同步。

3,找到方法使buff/cache能快速回收,从而不影响系统正常运行。

由于是现场环境所以先采用3稳住局势,然后考虑1,2的操作时间和风险。

什么是buffer/cache?

buffer/cache 其实是作为服务器系统的文件数据缓存使用的,尤其是针对进程对文件存在 read/write 操作的时候,所以当你的服务进程在对文件进行读写的时候,Linux内核为了提高服务的读写速度,则将会把文件放在此处的 buffer/cache 中进行缓存使用,由于 Linux服务的特点便是任何事物都会以文件的形式进行存在,所以你会发现不管你是否对文件做了大规模的读写,机器的 buffer/cache 是一直都存在的,并且持续的增高不下,这是因为服务器所产生的网络连接也好,用户协议的(UDP)套接字也好,这部分的数据系统都会为应用程序创建对应的文件描述符,而这些文件描述符的使用,则又都会重新进入 buffer/cache 中做读写使用,所以这也是你的机器始终都会存在较高 buffer/cache 的原因!

Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小

buffer/cache 需要注意的一些特点

在服务内存够用的情况下,Linux内核为了加快对文件的读写效率会将文件放入之 buffer/cache 中 以保证读写效率,但其实,尽管当你的应用程序对文件的读写运行结束后,buffer/cache 也不会自动释放该部分内存,而是作为缓冲进行保留,等到你的服务进程在下一次进行相同文件的读写时就可以直接使用,省去了各种重新进行内存初始化的操作;所以这将会导致,当你的应用进程频繁对不同的文件进行读写时,你会发现服务所可以直接使用的free内存将会越来越少的一个重要原因;难道 buffer/cache 在这样无休止的缓存当中就不会自动释放?当然不是,当服务器在内存压力较大的情况下时,则将会自动进行内存的回收,作为free空间分给其它进程使用,这其中主要回收的一个内存则是 buffer/cache 的缓冲区内存块;

如何进行手动 buffer/cache 回收

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

三种方式:

1,echo

清理pagecache(页面缓存)
sync;
echo 1 > /proc/sys/vm/drop_caches   
 
清理dentries(目录缓存)和inodes
sync;
echo 2 > /proc/sys/vm/drop_caches  
   
清理pagecache、dentries和inodes
sync;
echo 3 > /proc/sys/vm/drop_caches    

2,sysctl ,有的系统/proc/sys/vm/drop_caches是不可读写的只能用sysctl

清理pagecache(页面缓存)
sync;
sysctl -w vm.drop_caches=1

清理dentries(目录缓存)和inodes
sync;
sysctl -w vm.drop_caches=2

清理pagecache、dentries和inodes
sync;
sysctl -w vm.drop_caches=3

3,还是 sysctl,但是是永久保存的

在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效

手动 buffer/cache 回收可能出现的问题

但是单纯的手动清除buff/cache是可行的?显然不完全可行。开始我也是这么想的,反正是buff/cache占内存,那么定时清理就行,于是写了如下脚本,可能是没有sync还是别的原因这个脚本运行了一天多就发现系统会时不时自动重启。经过分析,应该可能是清除了正在使用的文件描述符导致的功能性故障。

#!/bin/bash  
  
for (( ; ; ))  
do  
  sysctl -w vm.drop_caches=3 
  sleep 120  
done

如何让系统自动回收buffer/cache

Liunx提供了一些内核参数来管理虚拟内存子系统,这些参数可以用来配置系统的虚拟内存管理策略,包括内存分配、页面置换、内存压缩、NUMA 等方面的设置。用户和系统管理员可以通过修改这些内核参数来调整系统的内存管理行为,以优化系统性能或满足特定的应用需求。

# ls /proc/sys/vm/ -al

 admin_reserve_kbytes
 block_dump
 compact_memory
 compact_unevictable_allowed
 dirty_background_bytes
 dirty_background_ratio
 dirty_bytes
 dirty_expire_centisecs
 dirty_ratio
 dirty_writeback_centisecs
 dirtytime_expire_seconds
 drop_caches  #写入这个文件可以释放页缓存、目录项缓存和inode缓存。
              #写入1释放页缓存,写入2释放目录项和inode缓存,写入3释放所有缓存
 extfrag_threshold
 highmem_is_dirtyable
 laptop_mode
 legacy_va_layout
 lowmem_reserve_ratio
 max_map_count
 min_free_kbytes #设置系统保留的最小空闲内存量。当空闲内存低于这个值时,内核会尽力释放内存
 mmap_min_addr
 mmap_rnd_bits
 oom_dump_tasks
 oom_kill_allocating_task
 overcommit_kbytes
 overcommit_memory
 overcommit_ratio
 page-cluster
 panic_on_oom
 percpu_pagelist_fraction
 stat_interval
 stat_refresh
 swappiness
 user_reserve_kbytes
 vfs_cache_pressure #调整内核回收用于目录项和inode对象缓存的倾向。
                    #值越高,内核回收这些缓存的频率越高
 watermark_boost_factor
 watermark_scale_factor

这次处理问题我只关注写有注释的三个参数:

  • drop_caches

        手动清除buffer/cache时用的

  • min_free_kbytes

        设置系统保留的最小空闲内存量。当空闲内存低于这个值时,内核会尽力释放内

  • vfs_cache_pressure

        调整内核回收用于目录项和inode对象缓存的倾向。值越高,内核回收这些缓存的频率越高

 vfs_cache_pressure这个值经过分析,如果调大会导致cpu和io中断增加所以本次问题处理未使用。所以这次问题处理只使用了min_free_kbytes这个参数。

vm.min_free_kbytes

min_free_kbytes参数是Linux内核中的一个重要参数,它指定了在系统内存使用达到一定闻值时,必须保留的最小空闲内存量。当系统内存使用量达到vm.min_free_ktes指定的值时,Linux内核将不得不过回收缓存和页面等方式来释放内存,以确保系统的稳定性和可靠性。

通常情况下,vm.min_free_kbytes的默认值已经足够满足大多数系统的需求,但是在某些情况下,比如进行大量内存操作的系统,可能需要适当调整vm.min free kbytes的值,以避免内存不足导致系统崩溃或性能下降。

需要注意的是,vm.min_free_kbytes的设置需要根据具体的系统环境和应用场景来确定,如果设置不当可能会带来负面影响。比如你系统内存只有4G,你设置40G,会导致系统原地死机,必须手动重启(不要问我时怎么知道的)

设置方法同drop_caches

1,echo

echo "2048000" > /proc/sys/vm/min_free_kbytes

2,sysctl

sysctl -w vm.min_free_kbytes=2048000

2,sysctl 永久保存

在/etc/sysctl.conf文件中配置:vm.min_free_kbytes=2048000,然后sysctl -p生效

四、参考文献

Linux:/proc/sys/vm/目录各文件详解-CSDN博客

linux下的缓存机制及清理buffer/cache/swap的方法梳理_linux 缓存机制 swap-CSDN博客

vm.min_free_kbytes - CSDN文库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亚信安慧AntDB:AntDB-M元数据锁(八)

5.6 死锁检测 图4-死锁等待 每个线程在进入锁等待前,都会先进行死锁检测,避免陷入死锁等待。在检测前,会先将自己获取到的unobtrusive锁进行物化,即将锁放入锁的授予列表中,以便死锁检测能区分锁的归属线程。然后设置…

Proto文件如何生成JavaProto对象?

首先安装好Protocol Buffer的编译器 Protocol Buffer: version:2.6.1 link: 链接直达 根据电脑环境进行下载,Widnwos 32/64位就选择win32是没问题的,楼主亲测 1.proto文件编写 Person.proto public class Person {String name;int id;String email…

【高阶数据结构】AVL树

文章目录 前言1. 什么是二叉搜索树2. 什么是AVL树3. AVL树节点的定义4. AVL树的插入4.1 新节点插入较高右子树的右侧4.2 新节点插入较高左子树的左侧4.3 新节点插入较高左子树的右侧4.4 新节点插入较高右子树的左侧插入操作完整代码插入操作总结 AVL树的验证AVL树的删除AVL树性…

git push后,如何撤销git log上的错误注释

修改了本地的代码,执行了下面的操作,提交之后,怎么样修改 git add ********(文件名)//git add 添加修改文件名之后 git commit //git commit 在当前分支提交,编写提交注释 git push //git push 提交修…

虹科干货 | 如何使用nProbe Cento构建100 Gbit NetFlow 传感器

本文是一份全面的指南,解释了如何使用nProbe Cento构建一个高效的100 Gbit NetFlow传感器。旨在帮助大家充分利用NetFlow技术,以监控和分析高速网络流量。 当需要监控分布式网络,了解流经上行链路或关键网段的网络流量时,NetFlow…

ES实战回顾

1、你用的集群节点情况? 一个ES集群,18个节点,其中3个主节点,15个数据节点,500G左右的索引数据量,没有单独的协调节点,它的每个节点都可以充当协调功能; 2、你们常用的索引有哪些&a…

【游戏服务器部署】幻兽帕鲁服务器一键部署保姆级教程,游戏私服还是自己搭建的香

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。—幻兽帕鲁 想要…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提前方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期(待优化)2.3.5 实测 3.总结 1.简…

RocketMq5源码搭建

最近公司使用到了RocketMQ,所以打算研究一下RocketMQ 准备自己动手搭建一下RocketMq源码 前提 需要搭建jdk环境,jdk版本需要高于1.8 首先 从github 拉源码 源码地址:rocketMq源码传送门 启动namesrv 启动之前需要配置一下ROCKERMQ_HOME 配置如下&a…

力扣hot100 括号生成 递归回溯 超简洁版

Problem: 22. 括号生成 Code 使用 static 会被复用 class Solution {List<String> ans new ArrayList<>();public List<String> generateParenthesis(int n){dfs(n, n, "");return ans;}/*** param l 左括号待补个数* param r 右括号待补个数*…

基于SpringBoot+Vue的甘肃非物质文化网站(V2.0),附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

如何在Shopee泰国站点进行有效的选品

在Shopee泰国站点进行选品时&#xff0c;卖家可以采取一些策略来提高产品的市场竞争力和销售业绩。以下是一些可以遵循的策略&#xff1a; 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff08;复制浏览器打开&#xff09;&#xff1a;D。dDqbt。Com/JU5o知虾…

财务数据可视化大屏:企业决策的智慧之眼

在大数据时代&#xff0c;财务数据的管理与分析对于企业的决策和发展至关重要。然而&#xff0c;面对海量的数据&#xff0c;如何快速、准确地获取有价值的信息&#xff0c;一直是企业面临的挑战。这时&#xff0c;财务数据可视化大屏的出现&#xff0c;为企业提供了一个全新的…

Pandas--数据结构 - DataFrame(4)

DataFrame 是一个表格型的数据结构&#xff0c;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索引也有列索引&#xff0c;它可以被看做由 Series 组成的字典&#xff08;共同用一个索引&#xff09;…

1_Matlab基本操作

文章目录 工作环境操作界面运行命令窗口使用历史窗口当前目录浏览器工作空间浏览器帮助系统 工作环境 操作界面 命令窗口&#xff1a;用户进行操作的主要窗口。可以输入各种MATLAB的命令。函数和表达式。同时操作的运算结构也会在该窗口出现。历史命令窗口&#xff1a;记录用户…

【vue】vue.config.js里面获取本机ip:

文章目录 一、效果&#xff1a;二、实现&#xff1a; 一、效果&#xff1a; 二、实现&#xff1a; const os require(os);function getLocalIpAddress() {const interfaces os.networkInterfaces();for (let key in interfaces) {const iface interfaces[key];for (let i …

直播观看人次破30W | 极新「2024未来直播电商科技峰会」圆满落幕

“共话直播电商&#xff06;消费科技行业破局之道” 文&#xff5c;德江&凯丰 编辑 | 云舒 出品&#xff5c;极新 1月27日&#xff0c;由极新携手北京电子商务协会联合举办的「2024未来直播电商科技峰会」圆满落幕&#xff01;在峰会上&#xff0c;共进行了10 场演讲 &a…

解决npm安装phantomjs失败

失败信息 Progress: resolved 102, reused 102, downloaded 0, added 0, done .pnpm/phantomjs2.1.7/node_modules/phantomjs: Running install script, failed in 21.3s .../node_modules/phantomjs install$ node install.js │ PhantomJS not found on PATH │ Downloading…

PyTorch自动微分机制的详细介绍

PyTorch深度学习框架的官方文档确实提供了丰富的信息来阐述其内部自动微分机制。在PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;和计算图&#xff08;Computation Graph&#xff09;的设计与实现使得整个系统能够支持动态的、高效的自动求导过程。 具体来说&#…

07.领域驱动设计:掌握整洁架构、六边形架构以及3种常见微服务架构模型的对比和分析

目录 1、概述 2、整洁架构 3、六边形架构 4、三种微服务架构模型的对比和分析 5、从三种架构模型看中台和微服务设计 5.1 中台建设要聚焦领域模型 5.2 微服务要有合理的架构分层 5.2.1 项目级微服务 5.2.2 企业级中台微服务 5.3 应用和资源的解耦与适配 6、总结 1、概…