记录一次服务器内存使用率过高达到90%告警问题排查。

news2024/9/25 1:23:33

目录

  • 一、前言
  • 二、问题排查处理
  • 三、 结尾

👩🏽‍💻个人主页:阿木木AEcru

🔥 系列专栏:Docker容器化部署系列

💹每一次技术突破,都是对自我能力的挑战和超越。

一、前言

在这里插入图片描述
一大早就有一个电话过来:“你快看看,这台服务器怎么一直在告警,90%的使用率,一直下不去”。

作为牛马的我立马就起身了,心里想:我也不是专业运维啊,啥事都来找我。抱着试一试的心态就上了堡垒机看那下。

二、问题排查处理

首先肯定是先看看目前服务器占用的内存信息
在这里插入图片描述
指令描述如下:

free: 这是Linux系统中用于显示内存使用情况的命令。

  1. -s 2: 这个选项指定了更新的时间间隔,单位是秒。在这个例子中,设置为2秒,表示每2秒更新一次内存使用情况。
  2. -c 5: 这个选项指定了输出的次数,即显示内存使用情况的次数。在这个例子中,设置为5,表示输出内存使用情况5次。
  3. -h: 这个选项用于以G为单位显示内存使用情况,以便更容易理解。
    整个指令的作用是每2秒更新一次系统的内存使用情况,并且在终端上显示5次内存使用情况。

输出内容的详细解释如下:

  • total: 总内存量,表示系统中总共的可用内存。
  • used: 已使用的内存量,表示系统当前正在使用的内存。
  • free: 空闲内存量,表示系统中当前未被使用的内存。
  • shared: 多个进程共享的内存量。
  • buffers: 用于缓冲的内存量,通常用于临时存储I/O操作的数据。
  • cached: 用于缓存的内存量,通常用于存储最近使用过的数据,以提高系统性能。
  • available: 可用内存量,表示系统中可供进程使用的内存量,包括空闲内存和缓存。

从这里很容易就看出了可用内存仅剩 1.4G 了,但是已使用内存只用了1.5G。

相信大家也看到了 buffers/cached 占用了 12G 之多,而这个就是罪魁祸首。缓存中的数据大部分都是磁盘文件 数据,是为了提高io。而缓存中的内存是可以被自动释放以及手动释放的。当内存短缺的时候系统会进行自动释放。当然手动释放也是很简单的。通过以下命令即可

sync && echo 3 > /proc/sys/vm/drop_caches

sync 用于将内存中的数据同步到磁盘中,所以在清理最好还是先执行此命令,以防数据丢失。
echo 3 > /proc/sys/vm/drop_caches 是将 3  写入到 该文件中,其作用是作用系统中的缓存。
如果写入数字 1,则会清除页缓存(page cache)。
如果写入数字 2,则会清除目录项缓存(dentry cache)。
如果写入数字 3,则会同时清除页缓存和目录项缓存。

可当我执行完成之后发现, buffers/cached 还是占用了12G ,那说明这里的缓存已经不是通过释放能解决的了。

我就在想, 是什么东西占用了这么多内存,也通过了top命令看了,没有发现什么异常的情况。于是我就想看看是什么占用了这么多内存。 在网上找到,可以在 /proc/meminfo 文件中 查看 当前系统内存使用情况详情。执行后如下
在这里插入图片描述
参数解释:

MemTotal: 系统可用的总内存大小,单位为kB(千字节)。
MemFree: 当前未被使用的内存大小,单位为kB。
MemAvailable: 估计当前可用的内存大小,单位为kB。该值是根据当前系统负载和进程执行需要估计出的可用内存大小。
Buffers: 用于存放文件系统的缓存的内存大小,单位为kB。
Cached: 用于存放缓存的内存大小,单位为kB。缓存包括文件系统缓存和页面缓存。
SwapCached: 用于存放交换缓存的内存大小,单位为kB。
Active: 当前活跃的内存大小,单位为kB。活跃内存指正在被使用的内存。
Inactive: 当前不活跃的内存大小,单位为kB。不活跃内存指最近未被访问的内存。
Active(anon): 当前活跃的非匿名内存大小,单位为kB。
Inactive(anon): 当前不活跃的非匿名内存大小,单位为kB。
Active(file): 当前活跃的文件缓存内存大小,单位为kB。
Inactive(file): 当前不活跃的文件缓存内存大小,单位为kB。
Unevictable: 无法被交换出内存的大小,单位为kB。
Mlocked: 已锁定的内存大小,单位为kB。
SwapTotal: 交换空间的总大小,单位为kB。
SwapFree: 交换空间中当前可用的大小,单位为kB。
Dirty: 当前等待被写回磁盘的脏页大小,单位为kB。
Writeback: 当前正在被写回磁盘的页大小,单位为kB。
AnonPages: 匿名页的大小,单位为kB。匿名页指进程私有的内存页,无法被其他进程共享。
Mapped: 已被映射到进程地址空间的页的大小,单位为kB。
Shmem: 共享内存的大小,单位为kB。
Slab: 内核内存管理缓存的大小,单位为kB。
SReclaimable: 可回收的Slab内存大小,单位为kB。
SUnreclaim: 不可回收的Slab内存大小,单位为kB。
KernelStack: 内核栈的大小,单位为kB。
PageTables: 存放页表所占用的内存大小,单位为kB。
NFS_Unstable: 不稳定NFS内存大小,单位为kB。
Bounce: 弹跳缓冲区大小,单位为kB。
WritebackTmp: 临时的待写回页大小,单位为kB。
CommitLimit: 当前系统支持的最大内存使用量,单位为kB。
Committed_AS: 已分配但还未分配物理内存的内存大小,单位为kB。
VmallocTotal: 可用的虚拟内存大小,单位为kB。
VmallocUsed: 已使用的虚拟内存大小,单位为kB。
VmallocChunk: 最大可分配的单个虚拟内存块大小,单位为kB。
HardwareCorrupted: 硬件错误导致的内存损坏大小,单位为kB。
AnonHugePages: 匿名巨页的大小,单位为kB。
CmaTotal: 连续内存区域的总大小,单位为kB。
CmaFree: 当前可用的连续内存区域的大小,单位为kB。
HugePages_Total: 巨页的总数量。
HugePages_Free: 当前可用的巨页数量。
HugePages_Rsvd: 保留的巨页数量。
HugePages_Surp: 超过总数量的巨页数量。
Hugepagesize: 巨页的大小,单位为kB。
DirectMap4k: 直接映射到物理内存的4KB页面的大小,单位为kB。
DirectMap2M: 直接映射到物理内存的2MB页面的大小,单位为kB。
DirectMap1G: 直接映射到物理内存的1GB页面的大小,单位为kB。
从这里就能看出问题了, 在slab 内核内存管理缓存 就占用了大部分, 而且在 SUnreclaim 中就能看出 大部分是不可以被回收的。

导致slab 缓存这么巨大的原因可能有哪些呢?

1、频繁的内存分配和释放:如果系统中有大量的进程或应用程序频繁地进行内存分配和释放操作,就会导致 Slab 缓存中的内存不断增长。这可能是因为系统在分配内存时无法满足连续的内存需求,导致内核频繁地使用 Slab 分配器进行小块内存的分配。
2、过多的文件系统缓存:文件系统缓存(Cached)也是由 Slab 缓存来管理的。如果系统中有大量的文件被读取到内存中,并且没有及时释放,就会导致 Cached 缓存占用过多的内存,进而导致 Slab 缓存占用过大。
3、内核模块的使用:内核模块也会使用 Slab 缓存来管理内存。如果系统中有大量的内核模块被加载,并且这些模块占用了大量的内存,就会导致 Slab 缓存占用过大。
4、内核bug:在一些情况下,可能会存在内核中的 bug 导致 Slab 缓存占用过大。这可能是由于内核中的内存管理机制存在问题,导致 Slab 缓存无法正确地释放内存

到这,我就知道了,因为这台服务器是用做文件存储,应该是比较久之前开发的时候用了 openssh,没有用到专门的对象存储应用,然后留下的坑。频繁的文件操作导致了 slab缓存的累积,只增不减,就出现了这个问题。

然后就去查了怎么看slab 中 的使用情况 。 使用 slabtop 指令就可以查看了。情况如下:

在这里插入图片描述
从这里就能看出来被kmalloc占用了大部分,而这个kmalloc又是什么?

在 Linux 内核中,kmalloc 是一种用于动态分配小块内存的函数。它是 Slab 分配器中的一部分,用于分配大小小于等于页面大小的内存块。kmalloc 主要用于内核中的数据结构、缓冲区和其他小型对象的动态分配。

kmalloc 函数的一些特点和用途:

分配小块内存:kmalloc 函数用于分配大小小于等于页面大小(通常为4KB或更大)的内存块。它通常用于分配小型数据结构、缓冲区和其他小型对象所需的内存。
支持高速缓存:kmalloc 分配的内存块可以被 Slab 分配器缓存,以提高分配和释放内存的速度。这意味着相同大小的内存块可能会被缓存起来,以便下次分配时可以更快地完成。
对齐要求:kmalloc 分配的内存块通常会按照一定的对齐要求进行分配。这可以确保分配的内存块在物理内存中的地址是对齐的,以提高访问效率。
实现方式:kmalloc 函数的具体实现会根据系统架构和内核版本而有所不同。在实现上,它可能会调用底层的物理内存分配器,如 Buddy 系统或 Slab 系统,以分配所需大小的内存块。

接下来也找了很久,也没有发现什么好的解决方案,然后目前就是准备重启服务器来解决问题了。如果各位大佬有什么好的解决方案还麻烦在评论区指导一二,感谢!

三、 结尾

感谢您的观看! 如果本文对您有帮助,麻烦用您发财的小手点个三连吧!您的支持就是作者前进的最大动力!再次感谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式 | 工厂方法模式

工厂方法模式 针对简单工厂模式案例中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。简单工厂模式只有一个工厂类,负责创建所有产品,如果要添加新的产品,就需要修改工厂类的代码。而工厂方法模式引入了…

通过人工智能驱动的交互提升客户体验

用AI创造无限可能:打造极致客户体验的秘诀 在当今竞争激烈的市场中,客户体验至关重要。 企业正在迅速采用人工智能驱动的交互来彻底改变与客户的互动。 人工智能技术不仅简化了运营,还带来了以前无法达到的个性化和效率水平。 对于寻求满足客…

【Java - 框架 - SpringMVC】(01) SpringMVC框架的简单创建与使用,快速上手

"SpringMVC"框架的简单创建与使用,快速上手; 环境 Java版本"1.8.0_202";Spring Boot版本"2.5.9";Windows 11 专业版_22621.2428;IntelliJ IDEA 2021.1.3(Ultimate Edition)&#xff1…

8.2K star!史上最强Web应用防火墙

🚩 0x01 介绍 长亭雷池SafeLine是长亭科技耗时近 10 年倾情打造的WAF(Web Application Firewall),一款敢打出口号 “不让黑客越雷池一步” 的 WAF,我愿称之为史上最强的一款Web应用防火墙,足够简单、足够好用、足够强的免费且开源…

【Spring 篇】走进Java NIO的奇妙世界:解锁高效IO操作的魔法

欢迎来到Java NIO的神奇之旅!在这个充满活力的世界里,我们将一起揭示Java NIO(New I/O)的奥秘,探索其在高效IO操作中的神奇魔法。无需担心,即使你是Java的小白,也能轻松领略这个强大而灵活的IO框…

如何设置IDEA远程连接服务器开发环境并结合cpolar实现ssh远程开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

SpringBoot+Vue前后端分离项目在Linux系统中基于Docker打包发布

文章目录 SpringBootVue前后端分离项目在Linux系统中基于Docker打包发布一、Java项目基于Docker打包发布1.打包应用,将打好的jar包放到我们的linux系统中2.新建dockerfile3.打包镜像4.测试运行5.上传镜像到阿里云免费私仓 二、Vue项目打包到docker镜像1.编译打包前端…

记一次由于buff/cache导致服务器内存爆满的问题

目录 前言 复现 登录服务器查看占用内存进程排行 先了解一下什么是buff/cache? 尝试释放buffer/cache /proc/sys/vm/drop_caches dirty_ratio dirty_background_ratio dirty_writeback_centisecs dirty_expire_centisecs drop_caches page-cluster swap…

罗技G29游戏方向盘试玩拆解,带震动力反馈

1.正好有时间记录下 自己的爱好 一千多的罗技G29游戏方向盘试玩拆解,带震动力反馈,值这个价吗_哔哩哔哩_bilibili 一千多的罗技G29游戏方向盘试玩拆解,带震动力反馈,值这个价吗_哔哩哔哩_bilibili 2.拆解 3.2个大电机 4.主控芯…

智能模型新篇章:RAG + Fine-Tuning 混合增强策略

一、前言 在之前的探讨中,我们已经分别深入了解了RAG(检索增强生成)和 Fine-tuning(微调)这两种优化大型语言模型的方法,探讨了它们在不同业务场景下的适用性、优势及局限。然而,我们很少讨论将…

深度学习——微积分基础

目录 1、导数和微分 1.1 定义函数: 1.2 趋近过程: 1.3 绘图表示: 2、偏导数 3、梯度 4、链式法则 5、学习心得 在2500年前,古希腊人把一个多边形分成三角形,并把它们的面积相加,才找到计算多边形面积…

【记录39】html element-ui 加载

环境 html使用element-ui组件、用vue框架搭建 方法一: 方法二(推荐) 将相关资源下载下来,在对应的html文件中相对路径引入。注意:css加载放在js之前

Windows 11 鼠标右键可选择 cmd 命令行选项

** Windows 11 鼠标右键可选择 cmd 命令行选项 ** 在文件夹内打开命令行,只能使用 Windows 自带的 PowerShell , 作为一个 cmd 重度使用用户来说很是折磨,需要打开 cmd 然后切换盘符再 cd 。。。 现在咱们自己创建一个可以打开 cmd 的方法…

【C++庖丁解牛】stack的介绍和使用 | queue的介绍和使用 | priority_queue的介绍和使用

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. stack的介绍和使用1.1…

微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现)

项目介绍 自从计算机发展开始,计算机软硬件相关技术的发展速度越来越快,在信息化高速发展的今天,计算机应用技术似乎已经应用到了各个领域。 在餐饮行业,除了外卖以外就是到店里就餐,在店里就餐如果需要等待点餐的话…

VUE2 Day08智慧商城案例

shift alt f 格式化代码快捷键 vant组件库的安装 安装出错在指令后面加 --force 安装出错在指令后面加 --force **封装api模块的好处: 请求与页面逻辑分离相同的请求可以直接复用请求进行了统一管理** ![在这里插入图片描述](https://img-blog.…

c语言扫雷改进版

目录 文章目录 主体 整体架构流程 技术名词解释 技术细节 测试情况 文章目录 概要整体架构流程技术名词解释技术细节测试情况 主体 主体包括菜单,游戏规则简绍,选择进行与否 int main() {int input;srand((unsigned int)time(NULL));do{ menu()…

Linux--gdb调试

一.安装gdb sudo apt install gdb 二.使用gdb 三.gdb的相关操作 gdb 可执行文件名 显示代码: l 加断点: b 行号 启动程序:r(运行之前一定要加断点) 查看断点信息: info break/info b 删除断点信息:delete 断点编号 单步执行:n 打印 :p 显示:display 变量名: 退出:q …

Vue字符串里的中文数字转换为阿拉伯数字

js字符串里的汉字数字转化为数字 <template><view><view><view class"inpbox" ><textarea v-model"voiceMane" input"convert" ></textarea></view></view></view> </template> &…

清华大模型ChatGLM3部署初体验

正文共&#xff1a;1555 字 17 图&#xff0c;预估阅读时间&#xff1a;2 分钟 ChatGLM3是智谱AI和清华大学KEG实验室联合发布的对话预训练模型。该项目在GitHub的工程链接为&#xff1a; https://github.com/THUDM/ChatGLM3 在人工智能领域中&#xff0c;类似“3B”、“6B”、…