Linux问题排查-内存使用率高如何分析原因
以下是针对 Linux 系统内存使用率高的分步排查方法,结合用户进程占用、tmpfs 内存占用、内核内存泄漏和黑洞内存等特殊情况进行分析:
第一步:初步观察系统整体内存使用情况
1. 查看系统内存概况
- 命令:
free -h
或cat /proc/meminfo
- 关键指标:
MemTotal
:系统总内存。MemFree
:空闲内存。Buffers/Cached
:缓冲/缓存内存(可被回收)。Swap
:交换空间使用情况(若启用)。
- 判断逻辑:
- 若
MemFree
较低但Buffers/Cached
较高,可能是缓存占用较多,不一定是真实内存不足。 - 若
Swap
使用量显著增加,说明物理内存严重不足,需重点排查。
- 若
- 关键指标:
2. 确认内存使用率计算方式
- 内存使用率公式:
内存使用率 = (MemTotal - MemFree - Buffers - Cached) / MemTotal * 100%
- 若计算结果高,需进一步分析各组件占用。
第二步:排查用户进程内存占用
1. 找出高内存占用的用户进程
- 命令:
top
或htop
(动态排序,按M
键以内存占用排序)。ps aux --sort=-rss | head -n 10
(静态排序,查看 RSS 内存占用前 10 的进程)。pmap <PID>
:查看进程的内存映射详情(如堆、栈、共享库等)。
- 重点分析:
- 是否有异常进程(如僵尸进程、内存泄漏的应用)。
- 进程是否正常(如数据库、Java 应用等本身内存占用较高是否合理)。
2. 排查进程内存泄漏
- 工具:
- Valgrind(用户态程序):检测堆内存泄漏(适用于 C/C++ 程序)。
- Java 工具:
jmap
、jconsole
、VisualVM
(分析 Java 进程的堆内存使用)。 - Python 工具:
tracemalloc
(跟踪 Python 程序的内存分配)。
- 方法:
- 观察进程内存是否随时间持续增长(无下降趋势)。
- 对比进程的虚拟内存(VSS)和驻留内存(RSS),若 VSS 远大于 RSS,可能存在内存碎片化。
第三步:排查 tmpfs 内存占用
1. 确认 tmpfs 的使用情况
- tmpfs 简介:基于内存的文件系统(如
/dev/shm
),占用的内存会计入MemUsed
。 - 命令:
df -hT | grep tmpfs
:查看 tmpfs 挂载点及其容量、使用量。du -sh /dev/shm/*
:查看/dev/shm
下文件/目录的内存占用。
- 常见问题:
- 应用是否在
/dev/shm
中生成大文件(如数据库临时文件、日志)。 - 是否存在未清理的临时文件(如进程崩溃后残留的文件)。
- 应用是否在
2. 清理 tmpfs 内存
- 临时清理:删除
/dev/shm
下的无用文件。 - 长期优化:
- 调整 tmpfs 挂载大小(如
mount -o size=2G /dev/shm
)。 - 避免在 tmpfs 中存储持久化数据。
- 调整 tmpfs 挂载大小(如
第四步:排查内核内存泄漏
1. 检查 Slab 内存泄漏
- Slab 内存:内核通过 Slab 分配器管理的对象(如 inode、dentry 等)。
- 命令:
cat /proc/meminfo | grep SUnreclaim
:查看不可回收的 Slab 内存(SUnreclaim
)是否持续增长。cat /proc/slabinfo | sort -k3 -n
:按对象数量排序,观察是否有异常增长的 Slab 缓存(如dentry
、inode
等)。
- 分析逻辑:
- 对比不同时间点的
SUnreclaim
值,若持续增加且无合理原因(如系统负载升高),可能存在内核泄漏。 - 结合
slabtop
工具动态监控 Slab 缓存变化。
- 对比不同时间点的
2. 使用 kmemleak 工具检测
- 前提:内核需启用
CONFIG_DEBUG_KMEMLEAK
配置。 - 操作步骤:
- 加载模块:
modprobe kmemleak
。 - 触发扫描:
echo scan > /sys/kernel/debug/kmemleak
。 - 查看结果:
dmesg | grep kmemleak
或cat /sys/kernel/debug/kmemleak
。
- 加载模块:
- 输出解读:
- 泄漏报告包含内存块地址、大小、调用栈,用于定位内核代码中的泄漏点(如未释放的
kmalloc
内存)。
- 泄漏报告包含内存块地址、大小、调用栈,用于定位内核代码中的泄漏点(如未释放的
第五步:计算黑洞内存
1. 黑洞内存定义
- 内核通过直接操作
page
分配的内存(如alloc_pages
),未通过slab
或vmalloc
管理,无法被/proc/meminfo
统计。
2. 计算公式
黑洞内存 = MemTotal - MemFree - Active - Inactive - Slab - KernelStack - PageTables - VmallocUsed
- 参数说明(通过
cat /proc/meminfo
获取):MemTotal
:总内存。MemFree
:空闲内存。Active/Inactive
:活跃/非活跃内存页(对应Active
和Inactive
字段)。Slab
:Slab
字段值(包含SReclaimable
和SUnreclaimable
)。KernelStack
:内核栈内存(可通过cat /proc/kallsyms | grep "\[k\]"$ | wc -l
估算,每个栈约 16KB)。PageTables
:页表内存(PageTables
字段值)。VmallocUsed
:vmalloc
分配的内存(VmallocUsed
字段值)。
3. 异常判断
- 若黑洞内存数值较大(如超过总内存的 10%),可能存在内核模块或驱动通过
alloc_pages
分配了大量未释放的内存。 - 排查方向:
- 检查内核模块(尤其是自定义模块)是否正确释放
page
内存。 - 使用
pagewalk
等工具分析物理页分配情况。
- 检查内核模块(尤其是自定义模块)是否正确释放
第六步:综合分析与优化
1. 优先级排序
问题类型 | 排查优先级 | 常见解决方式 |
---|---|---|
用户进程泄漏 | 高 | 优化程序、修复泄漏、限制内存上限 |
tmpfs 占用过高 | 中 | 清理临时文件、调整挂载大小 |
内核内存泄漏 | 高 | 升级内核、修复驱动/模块泄漏 |
黑洞内存过大 | 低 | 分析内核代码或模块,优化内存分配 |
2. 优化手段
- 用户进程:
- 对异常进程限流(如通过
cgroups
限制内存)。 - 重启或升级存在泄漏的应用。
- 对异常进程限流(如通过
- tmpfs:
- 定期清理
/dev/shm
下的无用文件。 - 将大文件存储改为磁盘而非内存。
- 定期清理
- 内核泄漏:
- 更新内核至稳定版本(尤其是针对已知泄漏的版本)。
- 禁用或调试有问题的内核模块。
- 黑洞内存:
- 若为内核特性(如透明大页、内存压缩),可评估是否需要调整(如
echo never > /sys/kernel/mm/transparent_hugepage/enabled
)。 - 若为自定义模块导致,修复模块中的内存分配逻辑。
- 若为内核特性(如透明大页、内存压缩),可评估是否需要调整(如
总结:排查流程图
通过以上步骤,可逐步定位内存占用高的根源,并针对不同场景采取相应的优化措施。
相关文章:
Linux问题排查-内存使用率高如何分析原因
以下是针对 Linux 系统内存使用率高的分步排查方法,结合用户进程占用、tmpfs 内存占用、内核内存泄漏和黑洞内存等特殊情况进行分析: 第一步:初步观察系统整体内存使用情况 1. 查看系统内存概况 命令:free -h 或 cat /proc/mem…...

SpringMVC2
一、springmvc 接收请求 类上、方法上 RequestMapping GetMapping PostMapping package com.hl.springmvc02.web; import jdk.nashorn.internal.objects.annotations.Getter; import org.springframework.web.bind.annotation.*; RestController RequestMapping(&qu…...

【每日一题丨2025年5.12~5.18】排序相关题
个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【5.12】P1068 [NOIP 2009 普及组] 分数线划定2. 【5.13】P5143 攀爬者3. 【5.14】P12366 [蓝桥杯 2022 省 Python B] 数位排序4. 【5.15】P10901 [蓝桥杯 2024 省 C] 封闭图形个数5.【5.16】P12165 [蓝桥…...
ElasticSearch性能优化
ES基础概念介绍: 索引:类似于MySQL中的表,它是具有相同特征的一个数据集。文档:格式为JSON格式,类似于MySQL中的一条数据,它是数据存储的基本数据单元,每一条文档都有一个唯一的ID。查询&#x…...

Typora + PicGo + GitHub 配置图床——图片自动上传 详细教程
文章目录 一、创建 GitHub 仓库二、添加私人令牌三、下载 PicGo四、配置 PicGo五、测试 一、创建 GitHub 仓库 进入 Github 官网 注册一个属于自己的账号,点击创建仓库。 2. 创建自己的新仓库。仓库设置为公开,方便上传图片(你设置私有也可以…...

QT+Visual Studio 配置开发环境教程
一、QT架构 Qt Creator 是一个轻量级、跨平台的 IDE,专为 Qt 开发量身打造,内置对 qmake/CMake 的深度支持、Kits 配置管理、原生 QML 调试器以及较低的资源占用维基百科。 而在 Windows 环境下,Visual Studio 配合 Qt VS Tools 扩展则可将 Q…...

缺乏经验的 PCB 过孔建模方法
您是一名背板设计人员,被指派设计一种新的高速、多千兆位串行链路架构,从多个线卡到背板上的多个交换矩阵交换卡。这些链路必须在第一天以 6GB/s 的速度运行,并且为 10GB/s (IEEE 802.3KR) 做好产品演进的准备。时间表很紧,您需要提出一个背板架构,以允许程序的其余部分…...
layui 介绍
layui(谐音:类 UI) 是一套开源的 Web UI 解决方案,采用自身经典的模块化规范,并遵循原生 HTML/CSS/JS 的开发方式,极易上手,拿来即用。其风格简约轻盈,而组件优雅丰盈,从源代码到使用…...
【漫话机器学习系列】265.普拉托变换的相关问题(Issues With Platt Scaling)
Platt Scaling 的相关问题详解 | 模型校准中的隐患分析 在机器学习模型中,模型预测的“置信度”并不一定等于真实的概率。为了提高模型预测结果的可解释性和实用性,我们通常会使用一种后处理的概率校准方法——Platt Scaling(普拉托变换&…...

【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈
【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈 高性能网络学习目录 基础内容(两周完成): 2.1网络编程 2.1.1多路复用select/poll/epoll2.1.2事件驱动reactor2.1.3http服务器的实现 2.2网络原理 百万并发…...

LlamaIndex
1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…...

springboot使用xdoc-report包导出word
背景:项目需要使用xdoc-report.jar根据设置好的word模版,自动填入数据 导出word 框架使用 我的需求是我做一个模板然后往里面填充内容就导出我想要的word文件,问了下chatgpt还有百度,最后选用了xdocreport这个框架,主…...
leetcode 3356. 零数组变换 II 中等
给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri]。 对于每个查询 queries[i]: 在 nums 的下标范围 [li, ri] 内选择一个下标 子集。将选中的每个下标对应的元素值减 1。 零数组 是指所有元素都等于 0 的数组。 …...

重拾GMP
目录 GMP总结 线程协程三家对比GMP调度模型 mgp过一遍流程 g 一个G的生命周期 mpschedt全局队列g0视角看看G的调度流程 四大调度类型 主动调度被动调度正常调度抢占调度 宏观的调度流程上面流程的具体细节 schedule()findRunnable()execute()gosched_m()park_m()与ready()goe…...

实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验
实验背景 流式细胞仪与微流控技术,为细胞及细胞核成像提供新的路径。传统流式细胞仪在细胞核成像检测方面存在检测通量低,荧光信号微弱等局限,故某光学重点实验室开发一种基于高灵敏度sCMOS科学相机并集成在自组荧光显微镜的微流控细胞核成像…...
C++学习:六个月从基础到就业——C++11/14:其他语言特性
C学习:六个月从基础到就业——C11/14:其他语言特性 本文是我C学习之旅系列的第四十四篇技术文章,也是第三阶段"现代C特性"的第六篇,主要介绍C11/14中引入的其他重要语言特性。查看完整系列目录了解更多内容。 引言 在前…...

【Linux笔记】——线程池项目与线程安全单例模式
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹: 【Linux笔记】——简单实习一个日志项目 🔖流水不争,争的是滔滔不息 一、线程池设计二…...
数据驱动的社会舆情监测与分析——用算法洞察世界脉动
数据驱动的社会舆情监测与分析——用算法洞察世界脉动 在信息爆炸的时代,社会舆情的变化可以在极短时间内产生深远影响。从企业品牌到公共政策,社交媒体和新闻平台上的讨论能够直接影响决策者的策略制定。因此,数据驱动的舆情监测与分析 逐渐成为政府、企业以及社会机构的重…...
OD 算法题 B卷 【最佳植树距离】
文章目录 最佳植树距离 最佳植树距离 在直线的公路上种树,给定坑位数量和位置,及需要种多少棵树苗;树苗之间的最小距离是多少时,可以保证种的最均匀(树苗之间的最小距离最大); 输入描述&#…...

ZooKeeper 原理解析及优劣比较
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 引言 在分布式系统中,服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭…...
实战5:个性化数字艺术生成与销售
盈利思路 数字艺术销售: 平台销售:将生成的数字艺术作品上传到像OpenSea、Foundation等NFT平台进行售卖。每一件独特的艺术品可以通过NFT技术保证其唯一性,吸引收藏家和投资者。 定价策略:根据作品的复杂度、创意性以及市场需求来…...

是德科技 | 单通道448G未来之路:PAM4? PAM6? PAM8?
内容来源:是德科技 随着数据中心规模的不断扩大以及AI大模型等技术的兴起,市场对高速、大容量数据传输的需求日益增长。例如,AI训练集群中GPU等设备之间的互联需要更高的传输速率来提升效率。在技术升级方面,SerDes技术的不断进步…...

OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座
5 月 17 号以“当 SQL 遇见 AI”为主题的 OceanBase 开发者大会在广州举行,因为行程的原因未能现场参会,仍然通过视频直播观看了全部的演讲。总体来说,这届大会既有对未来数据库演进方向的展望,也有 OceanBase 新产品的发布&#…...

STM32IIC协议基础及Cube配置
STM32IIC协议基础及Cube配置 一,IC协议简介1,核心特点2,应用场景 二,IC协议基础概念1,总线结构2,主从架构3,设备寻址4,起始和停止条件5,数据传输6,应答机制 三…...

CNN vs ViT:图像世界的范式演进
一、图像建模,是不是也可以“大一统” 在前文中我们提到,多模态大模型打破“只能处理文字”的限制。 在 NLP 世界里,Transformer 已经证明自己是理解语言的王者。那么在图像世界,我们是否也能有一种“通用架构”,让模…...

cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins
cocos 版本2.4.11 在windows上jenkins的具体配置和部署,可参考上一篇文章cocos creator使用jenkins打包流程,打包webmobile_jenkins打包,发布,部署cocoscreator-CSDN博客 特别注意,windows上运行jenkins需要关闭windows自己的jenkins服务&a…...

定时器的两种实现方式
1、基于优先级队列/堆 队列是先进先出,优先级队列是优先级越高就存放在队列之前,我们可以将过期时间越早设置为优先级越高,那么临近过期时间的任务就会在队列前面,距离过期时间越晚的任务就在队列后面。 可以分配一个线程&#…...
Python、Pytorch、TensorFlow、Anconda、PySide、Jupyter
一、Python Python是一种高级、通用、解释型的开源编程语言,由Guido van Rossum于1990年代初设计。它具有以下显著特点: 1.语言特性 (1) 语法简洁易读,接近自然语言(如print(“Hello World!”)) (2) 采用强制缩进而非大括号定义代码块 (3) 支持面向对象、函数式和过…...

[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十)
[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十) 一、MinIO简介与核心原理 MinIO 是一款高性能、开源的分布式对象存储系统,兼容 Amazon S3 API,适用于存储图片、视频、日志等非结构化数据。其核心特…...
MacBook Air A2179(Intel版)安装macOS Catalina所需时间
MacBook Air A2179(Intel版)安装macOS Catalina所需时间如下: 一、标准安装时间范围 常规安装(通过App Store) • 下载时间:约30-60分钟(取决于网络速度,安装包约8GB) •…...