首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
开篇词 | 如何让Linux内核更好地服务应用程序?
01 基础篇 | 如何用数据观测Page Cache?
02 基础篇 | Page Cache是怎样产生和释放的?
03 案例篇 | 如何处理Page Cache难以回收产生的load飙高问题?
04 案例篇 | 如何处理Page Cache容易回收引起的业务性能问题?
05 分析篇 | 如何判断问题是否由Page Cache产生的?
06 基础篇 | 进程的哪些内存类型容易引起内存泄漏?
07 案例篇 | 如何预防内存泄漏导致的系统假死?
08 案例篇 | Shmem:进程没有消耗内存,内存哪去了?
09 分析篇 | 如何对内核内存泄漏做些基础的分析?
10 分析篇 | 内存泄漏时,我们该如何一步步找到根因?
11 基础篇 | TCP连接的建立和断开受哪些系统配置影响?
12 基础篇 | TCP收发包过程会受哪些配置项影响?
13 案例篇 | TCP拥塞控制是如何导致业务性能抖动的?
14 案例篇 | TCP端到端时延变大,怎样判断是哪里出现了问题?
15 分析篇 | 如何高效地分析TCP重传问题?
16 套路篇 | 如何分析常见的TCP问题?
17 基础篇 | CPU是如何执行任务的?
18 案例篇 | 业务是否需要使用透明大页:水可载舟,亦可覆舟?
19 案例篇 | 网络吞吐高的业务是否需要开启网卡特性呢?
20 分析篇 | 如何分析CPU利用率飙高问题 ?
21 | 我是如何使用tracepoint来分析内核Bug的?
当前位置:
首页>>
技术小册>>
Linux内核技术实战
小册名称:Linux内核技术实战
### 08 案例篇 | Shmem:进程没有消耗内存,内存哪去了? 在深入探讨Linux内核技术的征途中,我们时常会遇到一些看似矛盾却实则蕴含深刻原理的现象。本章“Shmem:进程没有消耗内存,内存哪去了?”便是一个典型的案例,它揭示了Linux内存管理机制中一个既复杂又关键的部分——共享内存(Shmem)。通过这一章节,我们将揭开共享内存的神秘面纱,理解它如何在不增加进程直接内存占用的情况下,实现高效的数据共享与通信,并探讨当遇到“进程未显示消耗内存,但系统内存却告急”的情况时,应如何分析与解决。 #### 一、共享内存概述 在Linux系统中,共享内存是一种允许多个进程访问同一块内存区域的机制。与传统的消息传递(如管道、消息队列)或内存映射文件相比,共享内存具有更高的数据传输效率,因为它减少了数据的复制次数,直接在物理内存中进行数据的读写操作。在Linux中,共享内存的实现主要依赖于`tmpfs`(临时文件系统)或`shmget`、`shmat`等POSIX共享内存接口。 #### 二、Shmem与内核内存管理 当我们谈论“Shmem”时,通常指的是由内核管理的、专门用于共享内存目的的内存段。这些内存段并非直接分配给某个进程,而是由内核维护,供多个进程通过特定的接口访问。因此,在查看进程的内存使用情况(如通过`ps`、`top`等工具)时,这些共享内存段可能不会被计入单个进程的内存消耗中,从而造成了“进程没有消耗内存,但内存却减少了”的错觉。 #### 三、案例分析:内存去哪儿了? ##### 3.1 场景设定 假设在一个高负载的Linux服务器上,运行着多个使用共享内存进行通信的进程。随着系统的运行,系统管理员发现虽然各个进程的内存使用量看似正常,但系统的整体可用内存却在持续下降。此时,通过常规的内存分析工具(如`free`、`vmstat`)可能无法直接找到内存减少的源头。 ##### 3.2 排查步骤 1. **检查`/proc/[pid]/maps`**: 对于怀疑使用共享内存的进程,首先可以查看其内存映射文件`/proc/[pid]/maps`。这个文件列出了进程地址空间中的所有映射,包括文件映射、匿名映射(包括堆和栈)以及共享内存段。通过搜索文件中包含`[shm]`或`[heap]`等标识的条目,可以识别出进程使用的共享内存区域。 2. **使用`ipcs`和`ipcs -m`命令**: 这些命令可以帮助列出系统中所有的IPC(进程间通信)对象,包括消息队列、信号量和共享内存段。`ipcs -m`特别用于列出共享内存段的信息,如段ID、所有者、大小、权限等。 3. **分析`/proc/meminfo`**: 该文件提供了系统内存使用的详细统计信息,包括总内存、已用内存、空闲内存、共享内存(Shmem)等。关注`Shmem`项的变化,可以大致了解系统中共享内存的使用情况。 4. **跟踪内存分配与释放**: 如果上述方法未能直接定位问题,可能需要通过更高级的调试工具(如`strace`、`perf`或`SystemTap`)来跟踪进程的内存分配与释放行为,特别是与共享内存相关的操作。 ##### 3.3 解决方案 - **优化共享内存的使用**:确保共享内存段的大小合理,避免不必要的内存浪费。 - **监控与预警**:建立系统的内存使用监控机制,及时发现并解决内存泄漏或异常使用问题。 - **代码审查与重构**:对于使用共享内存的代码,定期进行审查,确保其符合最佳实践,避免潜在的问题。 - **升级或调整内核参数**:根据系统的实际情况,调整内核中与内存管理相关的参数,如`vm.overcommit_memory`、`vm.overcommit_ratio`等,以提高系统的稳定性和性能。 #### 四、深入理解Shmem与内核内存分配 共享内存之所以能够在不增加进程直接内存占用的前提下实现高效的数据共享,关键在于内核对内存分配的精细管理。在Linux中,内存分配并非简单地划分为“属于某个进程”或“不属于任何进程”,而是根据内存的使用目的和性质进行更细致的分类和管理。共享内存段虽然由内核创建和维护,但其访问权限和方式却受到严格的控制,以确保数据的安全性和一致性。 此外,Linux内核还通过一系列复杂的机制来管理内存的分配与回收,包括页表管理、物理页帧分配、内存回收算法(如kswapd、Direct Reclaim)等。这些机制共同协作,确保了系统在面对各种复杂场景时,仍能保持高效、稳定的内存使用状态。 #### 五、总结 本章通过“Shmem:进程没有消耗内存,内存哪去了?”这一案例,深入探讨了Linux内核中共享内存的管理机制及其与进程内存占用的关系。我们了解到,共享内存作为一种高效的进程间通信方式,在提升系统性能的同时,也带来了内存管理上的复杂性和挑战。通过合理的使用和优化,我们可以充分发挥共享内存的优势,为构建高性能、高可靠的Linux系统奠定坚实的基础。
上一篇:
07 案例篇 | 如何预防内存泄漏导致的系统假死?
下一篇:
09 分析篇 | 如何对内核内存泄漏做些基础的分析?
该分类下的相关小册推荐:
云计算那些事儿:从IaaS到PaaS进阶(四)
Linux性能优化实战
Linux零基础到云服务
ZooKeeper实战与源码剖析
人人都会用的宝塔Linux面板
shell脚本编程高手速成
云计算那些事儿:从IaaS到PaaS进阶(一)
云计算那些事儿:从IaaS到PaaS进阶(二)
系统性能调优必知必会
企业级监控系统Zabbix
分布式技术原理与算法解析
高并发系统设计核心