记录一次服务器内存使用率过高达到90%告警问题排查。_服务物理内存一直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_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 系统,以分配所需大小的内存块。

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

三、 结尾

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43336075/article/details/136734069

智能推荐

Python常用组件、命令大总结(持续更新)_セックス邀请码-程序员宅基地

文章浏览阅读1.5w次,点赞15次,收藏134次。Python后端开发常用组件、命令(干货)持续更新中…1、生成6位数字随机验证码import randomimport stringdef num_code(length=6): """ 生成长度为length的数字随机验证码 :param length: 验证码长度 :return: 验证码 """ return ''.jo....................._セックス邀请码

C#实现短信猫通信(无开发包)-程序员宅基地

文章浏览阅读99次。因为项目的需要,简简单单的做了个DEMO,能够打电话和发送短信,不是很完善,都可以举一反三! 代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows..._csca: "+8613010314500",145

Nginx配置-程序员宅基地

文章浏览阅读4.4w次,点赞38次,收藏344次。Nginx配置一、nginx常用配置命令二、nginx配置文件(一)、第一部分:全局块(二)、第二部分:events块(三)、第三部分:http块1、http全局块2、server块三级目录一、nginx常用配置命令配置命令路径/usr/local/nginx/sbin查看nginx版本./nginx -v停止nginx服务./nginx -s stop启动nginx服务./nginx重新加载nginx,适用于当nginx.conf配置文件修改后,使用下面命令可以使得配置文件生效_nginx配置

使用VS2017编译Boost库(MSVC)_vs2017 msvc-程序员宅基地

文章浏览阅读3.4k次,点赞4次,收藏16次。1、首先得拿到VS2017,Boost,下载链接:Visual Studio Community 2017:http://xz.cncrk.com:8080/soft/keygen/visual studio 2017.rarboost_1_71_0.zip:https://dl.bintray.com/boostorg/release/1.71.0/source/boost_1_..._vs2017 msvc

前端技术搭建飞机大战小游戏(内含源码)_前端小游戏代码-程序员宅基地

文章浏览阅读7.7w次,点赞177次,收藏116次。上周我们实通过前端基础实现了弹珠游戏,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节奏来带领大家完成一个飞机大战游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是循序渐进从简单到复杂的过程,后续会带领大家用前端实现翻卡片、扫雷、贪吃蛇等有趣的小游戏,纯前端语言实现,都会陆续带给大家。欢迎大家订阅我们这份前端小游戏的专栏。_前端小游戏代码

抖音引流跳转到微信加好友?免费教你创建一个链接!_抖音跳转加微信程序源码-程序员宅基地

文章浏览阅读770次,点赞9次,收藏8次。为了降低大家的门槛,可以使用开源的【引流宝】快速创建一个链接,这个链接生成的二维码,用抖音扫码,然后分享出去就是一张卡片,点击卡片就跳转到微信。在抖音想要跳转到微信,现在常规的做法就是通过微信小程序的Url Scheme跳转到微信并打开小程序指定的页面,这个已经有非常成熟的方案。你可以下载这个开源软件的代码,自行搭建引流宝系统,然后创建抖音跳转到微信的卡片即可。_抖音跳转加微信程序源码

随便推点

手写openFeign_手写opefeign客户端-程序员宅基地

文章浏览阅读873次,点赞3次,收藏3次。总的来说,OpenFeign简化了基于RESTful的HTTP请求的创建和使用过程,帮助你构建更加简洁、可维护、可扩展的微服务应用。与Spring Cloud集成:OpenFeign是Spring Cloud的一部分,因此与Spring Cloud的其他组件(如Eureka、Hystrix等)无缝集成,形成完整的微服务生态系统。整合服务发现:OpenFeign可以与Eureka等服务发现组件集成,使得你可以通过服务名来访问其他微服务,而无需硬编码服务的具体地址。被调用方和应用级别的被调用方一样。_手写opefeign客户端

metasploit 快速入门(二)信息收集和扫描-续_elasticsearch unrestricted access information disc-程序员宅基地

文章浏览阅读1.7k次。目录一、与Nessus结合二、与NeXpose结合三、与OpenVAS结合一、与Nessus结合到目前为止,我们已经了解了端口扫描的基础知识,以及学会了Nmap的使用。通过其他一些工具的学习,进一步提高了扫描和信息收集的技术。在接下来的小节中,我们将介绍其他几种扫描目标可用服务和端口的工具,这些工具还可以帮助我们确定特定服务和端口可能存在的漏洞类型。让我们开始漏洞扫描之旅。..._elasticsearch unrestricted access information disclosure

语义Web和本体开发相关技术-程序员宅基地

文章浏览阅读155次。摘自:http://iMarine.blog.163.com/在技术实现方面,语义Web和本体理论的研究日趋成熟,已经有许多成熟的工具或程序接口,诸如Jena、OWL API等API是系统实现的关键技术。这里介绍系统的可行性分析以及系统开发设计的关键技术。1 JenaJena[69]是来自于惠普实验室语义Web研究项目的开放资源,是用于创建语义Web应用..._java org.semanticweb

使用FastJson对实体类和Json还有JSONObject之间的转换_fastjson json和jsonobject-程序员宅基地

文章浏览阅读1.6k次。1. 实体类或集合转JSON串String jsonString = JSONObject.toJSONString(实体类);2.JSON串转JSONObjectJSONObject jsonObject = JSONObject.parseObject(jsonString);3.JSON串转实体类实体类 javaBean = JSON.parseObject(json,..._fastjson json和jsonobject

[ 移植 ] ___ Library : Xml2_libxml2_library-程序员宅基地

文章浏览阅读1.2k次。[ 移植 ] ___ Library : LibXml2简介下载配置安装整合查看资料简介是在MIT许可下提供的免费软件;为Gnome项目开发的XML C解析器和工具包;(但可在Gnome平台之外使用)尽管该库是用C编写的,但各种语言绑定使其在其他环境中可用;是一种用于设计标记语言的元语言,即是用尖括号之间的额外标记信息将语义和结构添加到内容中的文本语言。下载LibXml2最新的源码包可以从官方发布的页面下载配置创建安装目录并安装依赖包localhost@linux:~$ m_libxml2_library

C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解_c++ json-程序员宅基地

文章浏览阅读10w+次,点赞190次,收藏1k次。目录前言一、json文件简介1、json文件2、json与其他存储数据方式比较二、C++操作json文件1、jsoncpp 库下载2、C++从字符串中读取json3、C++从文件中读取json4、C++写入json文件5、主函数附:jsoncpp库配置1、解压并转移2、配置属性3、配置项目前言json文件是比较轻量级的文件,格式简单..._c++ json

推荐文章

热门文章

相关标签