暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

操作系统异常内存泄露的一个分析

济南小老虎 2025-04-08
97

背景

客户现场出现了一个问题: 
top 发现没有大内存使用的进程
但是free -g 发现 内存几乎耗尽了.

这个服务器上面只有一个nginx 还有部分java相关的进程
但是内存使用量都非常低.
但是可用内存几乎没有了. 

同事拉我进来, 我第一反应是看一下
/proc/meminfo 的信息
但是自己却没有看懂(败笔)

自己曾经遇到过两次
但是自己记笔记太混乱的毛病一直没改
当时的数据没有记录下来.


问题解决过程

清明前遇到问题,一直在分析.
我怀疑是内核内存泄露. 
但是苦于没有证据
最好的消息是: 
客户的操作系统有原厂支持.

然后一直跟现场的交付同事说
一定要让现场给出解决方案. 

清明后周一群里咨询了一下.
告知了问题已经定位到了.
是一个内核的内存泄露的问题
有比较新版本的内核已经解决了. 
因为文档涉密,没法获取原始文档.所以只能根据只言片语来分析


问题核心点

percpu 内存使用量过多
原厂工程师分析: 
在 cgroup 里面的memory 内部非原子性内存分配
会导致 cgroup 内的目录创建增多,并且删除删除目录,导致内存泄露. 

/sys/fs/cgroup/memory
主要是内的文件信息等内容.
(原厂没给资料,只能是自己材料的)


percpu的概念

per-cpu 通常指的是每个 CPU 核心(或处理器)相关的资源分配和性能度量。
Linux 内核提供了多种机制来管理和监控每个 CPU 核心的资源使用情况,
这些机制可以帮助系统管理员和开发者优化应用程序的性能。

在 Linux 系统中,percpu 变量是一种特殊的内存管理机制,
用于为每个 CPU 核心分配独立的内存空间,
以存储与该核心相关的数据。
这种机制可以减少多处理器系统中对共享数据访问时的锁竞争,
从而提高系统性能。
percpu 变量通常用于存储每个 CPU 核心独有的数据,
如 CPU 的 ID、在该核心上运行的线程等信息,
因为该机制可以非常方便地解决一些特定问题,所以在内核编程中被广泛使用。

percpu 变量主要用于存储每个 CPU 核心独有的数据,
以减少多处理器系统中的锁竞争,提高系统性能。

每cpu变量是最简单也是最重要的同步技术。
每cpu变量主要是数据结构数组,
系统的每个cpu对应数组的一个元素。
一个cpu不应该访问与其它cpu对应的数组元素,
另外,它可以随意读或修改它自己的元素而不用担心出现竞争条件,
因为它是唯一有资格这么做的cpu。
这也意味着每cpu变量基本上只能在特殊情况下使用,
也就是当它确定在系统的cpu上的数据在逻辑上是独立的时候。

每个处理器访问自己的副本,无需加锁,
可以放入自己的cache中,极大地提高了访问与更新效率。
常用于计数器。


问题场景确认

1. cat proc/meminfo 里面的 percpu 数据量持续增加.
2. proc/cgroup 内的数据量增加过多.


文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论