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

目录

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

👩🏽‍💻个人主页:阿木木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_cachessync 用于将内存中的数据同步到磁盘中,所以在清理最好还是先执行此命令,以防数据丢失。
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.mzph.cn/news/760734.shtml

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

相关文章

“我的海外代购,卖起了香灰手串”

【潮汐商业评论/文】 “这个琉璃手串,去年在雍和宫请的,招财的;这个朱砂挂件,当时直播说可以补八字缺火,果断下单的;这个博主讲星座很准;这篇帖子八字说得很详细;我前两天买了‘财神…

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

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

linux下用docker安装mysql及导入文件

目录 1. 非root用户设置docker权限2. user账号安装mysql2. root账号打开防火墙3. 启动mysql容器3.1 在指定工作目录下建立文件夹3.2 配置文件3.3 开启mysql容器 4. 进入容器4.1 通过容器进入mysql4.1 设置账号4.2 建立数据库4.3 导入文件 5. windows连接数据库参考文件 1. 非ro…

【说好的情怀呢】

友情提示: 抄本篇文章答案之前,请务必提前下载好 反诈APP。 多年情怀粉,今日粉转黑.... 问题: Q1: 将附件中 ip_china.csv.zip文件加载为 Hive 内部表,保持格式与 csv header一致,表需要开启压缩 Q2: 将…

k8s系列之十四安装Istio

Istio 是一个开源的服务网格(Service Mesh),用于连接、管理和保护微服务。它提供了一组功能强大的工具,包括流量管理、安全性、监控和跟踪等,以帮助在微服务架构中更好地管理服务之间的通信。 一些主要的 Istio 功能包…

ubuntu内存不足,用Swap扩展增加虚拟内存

Linux增大Swap分区,可以增加虚拟内存,以解决电脑卡机,内存不足等问题 top可以查看cpu的使用情况 lscpu可以查看本机配置的cpu硬件情况 查看内存使用情况 free -h (下面显示"交换"或者Swap等字样说明系统已经启动了Swap&#xff…

GUROBI案例实战(六)——排产排程问题(2)

更多可参考:https://github.com/Gurobi/modeling-examples/blob/master/food_manufacturing/food_manufacture_1.ipynb 一、问题简介 (1) 某厂商生产一种香皂的原材料有植物油脂和非植物油脂,其中植物油脂有两种,非植物油脂有三种&#xff…

【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…

Protobuf 的介绍与使用(入门级)

背景 在移动互联网时代,手机流量、电量是最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点。 解决流量过大的基本方法就是使用高度压缩的通信协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必…

提升效率!商务电子邮件在WorkPlace中如何高效运用?安全保障!

高效和安全的沟通是任何组织成功的核心。在我们关于电子邮件类型的系列文章的第二期中,我们将重点关注商业电子邮件在促进无缝交互中的关键作用。当你身处重要的工作场环境时,本系列的每篇文章都提供了电子邮件的不同维度的视角。 “2024年,全…

算法系列--递归

一.如何理解递归 递归对于初学者来说是一个非常抽象的概念,笔者在第一次学习时也是迷迷糊糊的(二叉树遍历),递归的代码看起来非常的简洁,优美,但是如何想出来递归的思路或者为什么能用递归这是初学者很难分析出来的 笔者在学习的过程中通过刷题,也总结出自己的一些经验,总结来…

Java开发---上海得帆(一面)

面试感受 这是我的第一次面试,我感觉我这次面试的很差,很糟糕,十分的糟糕,万分的糟糕。第一次面试,面试了半个小时。我去真的好紧张,脑子里一篇空白。脑子空白还不是最惨的,最惨的是那个八股文…

RabbitMQ--04--Spring Cloud Stream(消息驱动)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.Spring Cloud Stream1. 基本介绍https://spring.io/projects/spring-cloud-stream#overview 2.Spring Cloud Stream 解决的痛点问题3.设计思想Stream为什么可以统…

2024网络安全-自学笔记

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…

新火种AI|国产手机抢滩“AI+折叠屏”赛道,行业洗牌大战就此开启?

作者:小岩 编辑:彩云 从2023年到2024年,随着新一波人工智能浪潮的加速,消费电子产品也迎来了全新的话题——AI。更重要的是,这场战争看似没有硝烟,但各大厂商都已经暗自角力了许久,特别是手机…

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

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

Qt调用内置图标

int IconIndex0; QIcon icon QApplication::style()->standardIcon((QStyle::StandardPixmap)IconIndex);按以上代码可以调用Qt内置的71个图标,只要变换IconIndex就可以了,IconIndex为[0,70]。显示如下:图标index名称。

图论中的最小生成树:Kruskal与Prim算法深入解析

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:アンビバレント—Uru 0:24━━━━━━️💟──────── 4:02 🔄 ◀️ ⏸ ▶️ ☰ …

西井科技与安通控股签署战略合作协议 共创大物流全新生态

2024年3月21日,西井科技与安通控股在“上海硅巷”新象限空间正式签署战略合作框架协议。双方基于此前在集装箱物流的成功实践与资源优势,积极拓展在AI数字化产品、新能源自动驾驶解决方案和多场景应用,以及绿色物流链等领域的深度探索、强强联…

视频号下载助手失效了?如何解决下载视频问题!

在刷短视频的时候难免会遇到部分的视频号视频下载不下来,那我们该如何解决视频号下载问题呢? 视频号下载助手解决方案 视频号下载助手失效分为两种情况! 1、可以解析,但不能下载 根据使用视频号下载助手常见的问题,我们发现会有…