0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享一种更加隐秘且更难排查的"内存泄漏"案例

冬至配饺子 来源:OpenAnolis龙蜥 作者:系统运维SIG 2022-08-04 18:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、 问题现象

客户收到系统告警,K8S 集群某些节点 used 内存持续升高,top 查看进程使用的内存并不多,剩余内存不足却找不到内存的使用者,内存神秘消失,需要排查内存去哪儿了。

pYYBAGLrm-yAY6-2AAA1XFawne0737.png

执行 top 指令并按内存排序输出,内存使用最多的进程才 800M 左右,加起来远达不到 used 9G 的使用量。

pYYBAGLrm_-AAYBXAADnqlgfASU613.png

二、问题分析

2.1 内存去哪儿了?

在分析具体问题前,我们先把系统内存分类,便于找到内存使用异常的地方,从内存使用性质上,可以简单把内存分为应用内存和内核内存,两种内存使用量加上空闲内存,应该接近于 memory total,这样区分能够快速定位问题的边界。

pYYBAGLrnBGAPOyzAACyaqDzfTs924.png

其中 allocpage 指通过 __get_free_pages/alloc_pages 等 API 接口直接从伙伴系统申请的内存量(不包含 slab 和 vmalloc)。

2.1.1 内存分析

根据内存大图分别计算应用内存和内核内存,就可以知道是哪部分存在异常,但这些指标计算比较繁琐,很多内存值还存在重叠。针对这个痛点,SysOM 运维平台的内存大盘功能以可视化的方式展示内存的使用情况,并直接给出内存是否存在泄漏,本案例中,使用 SysOM 检测,直接显示 allocpage 存在泄漏,使用量接近 6G。

pYYBAGLrnCaALRiZAACT7Ctp8W0635.png

2.1.2 allocpage 内存

那既然是 alloc page 类型的内存占用多,是否可以直接从 sysfs、procfs 文件节点查看其内存使用了?很遗憾,这部分内存是内核/驱动直接调用 __get_free_page/alloc_pages 等函数从伙伴系统申请单个或多个连续的页面,系统层面没有接口查询这部分内存使用详情。如果这类内存存在泄漏,就会出现"内存凭空消失"的现象,比较难发现,问题原因也难排查。针对这个难点,我们的SysOM系统运维能够覆盖这类内存统计和原因诊断

所以需要进一步通过SysOM的诊断利器 SysAK 动态抓取这类内存的使用情况。

2.2 allocPage 类型内存排查

2.2.1 动态诊断

对于内核内存泄漏,我们直接可以使用SysAK工具来动态追踪,启动命令并等待 10 分钟。


sysak memleak -t page -i 600

pYYBAGLrnEWAFRNxAADn3Kd8KNE363.png

诊断结果显示 10 分钟内 receive_mergeable 函数分配的内存有 4919 次没有释放,内存大小在 300M 左右,分析到这里,我们就需要结合代码来确认 receive_mergeable 函数的内存分配和释放逻辑是否正确。

2.2.2 分配和释放总结

1)page_to_skb 每次会分配一个线性数据区为 128 Byte 的 skb。

2)数据区调用 alloc_pages_node 函数,一次性从伙伴系统申请 32k 内存(order=3)。

3)每个 skb 会对 32k 的 head page 产生一次引用计数,也就是只有当所有 skb 都释放时,这 32k 内存才释放回伙伴系统。

4)receive_mergeable 函数负责申请内存,但不负责释放这部分内存,只有当应用从 socket recvQ 中把数据读走才会对 head page 引用计数减一,当 page refs 为 0 时,释放回伙伴系统。

当应用消费数据比较慢,可能会导致 receive_mergeable 函数申请的内存释放不及时,而且最坏情况一个 skb 会占用 32k 内存,使用 sysak skcheck 检查 socket 接收队列和发送队列残留情况。

poYBAGLrnGeAbSX5AAAxjxKtPD4176.png

从输出可以知道,系统中只有 nginx 进程的接收队列有残留数据,socket fd=11 的 Recv-Q 有接近 3M 的数据没有接收,通过直接 kill 146935,系统内存恢复正常了,所以问题根本原因就是 nginx 没有及时收走数据了。

三、问题结论

经过与业务方沟通,最终确认是业务配置问题,导致 nginx 有一个线程没有处理数据,从而导致网卡驱动申请的内存没有及时释放,而 allocpage 内存又是无法统计的,从而出现内存凭空消失的现象。

3.1 结论验证

接收队列真的有数据残留吗,这里结合 crash 工具的 files 指令通过 fd 找到对应的sock:

pYYBAGLrnIaAdnjfAAAkz9cyEIM313.pngpoYBAGLrnIqAF_KfAABs_kiIow8718.png

通过多次观察,发现 sk_receive_queue 上的 skb 长时间没有变化,这也证明了 nginx 没有及时处理接收队列上的 skb,导致在网卡驱动中分配的内存没有释放。

四、内存泄漏疑点

在排查过程还遇到一个非常较困惑的地方,sockstat 和 slabtop 看检查 tcp mem 和 skbuff_head_cache 使用都很正常,导致进一步掩盖了网络占用的内存。

tcp mem = 32204*4K=125M

pYYBAGLrnJuAU40-AABuwzHCwEM413.png

skb 数量在 1.5万~3 万之间。

pYYBAGLrnLCAB8kbAACuYu-fgi8001.png

按照前面分析,一个skb最坏情况占用 32k 内存,那么 2 万个 skb 最大也就占 600M 左右,怎么会占用几个 G 了,难道分析有问题?如下图所示,skb 的非线性区可能还存在若干个 frag page,而每个 frag page 又可能由 compund page 组成。

poYBAGLrnMOAVTdnAACp_fOZ6gk818.png

用 crash 实际读取 skb 内存发现,有些 skb 存在 17 个 frag page,并且数据大小只有 10 Byte。

poYBAGLrnNiAYRhmAAC9APZ8D8g090.png

解析 frag page 的 order 为 3,意味着一个 frag page 占用 32k 内存。

poYBAGLrnOqALTZFAABW7fT4PTk229.png

极端情况下,一个 skb 可能占用(1+17)*8=144 页,上图 slabinfo 中skbuff_head_cache 活跃 object 数量为 15033 个,所以理论最大总内存 =144*15033*4K = 8.2G,而我们现在遇到的场景消耗 6G 的内存是完全有可能的。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9636

    浏览量

    157814
  • 驱动
    +关注

    关注

    12

    文章

    2002

    浏览量

    88797
  • 内存泄漏
    +关注

    关注

    0

    文章

    42

    浏览量

    9552
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    分享一种内存泄漏定位排查技巧

    的调试工具,下面分享一种内存泄漏定位排查技巧。1.对malloc,free进行封装首先,我们对malloc,f
    发表于 12-17 08:13

    教你如何搭建浅层神经网络"Hello world"

    作为图像识别与机器视觉界的 "hello world!" ,MNIST ("Modified National Institute of Standards and Technology&
    的头像 发表于 12-10 18:35 1731次阅读

    "STM32F0 Error: Flash Download failed - ""Cortex-M0""解决"

    开发工具CUbemx + Keil uVision5(MDK V5)错误现象在STM32F0烧录程序是出现了Error: Flash Download failed - &quot
    发表于 12-01 12:06 34次下载
    &<b class='flag-5'>quot</b>;STM32F0 Error: Flash Download failed  -  &<b class='flag-5'>quot</b>;&<b class='flag-5'>quot</b>;Cortex-M0&<b class='flag-5'>quot</b>;&<b class='flag-5'>quot</b>;解决&<b class='flag-5'>quot</b>;

    芯片工艺的&amp;quot;7nm&amp;quot; 、&amp;quot;5nm&amp;quot;到底指什么?

    近几年,芯片产业越来越火热,些行业内的术语大家也听得比较多了。那么工艺节点、制程是什么,&quot;7nm&quot; 、&quot;5nm&qu
    的头像 发表于 07-28 17:34 1.3w次阅读
    芯片工艺的&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;7nm&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>; 、&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;5nm&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;到底指什么?

    全方位精准测量技术助力:中国经济加力发展向前&amp;amp;quot;进&amp;amp;quot;

    全方位精准测量技术助力:中国经济加力发展向前&quot;进&quot;
    的头像 发表于 07-15 09:53 2575次阅读
    全方位精准测量技术助力:中国经济加力发展向前&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;进&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    3分钟读懂 | 气密性检测仪如何&amp;amp;quot;揪出&amp;amp;quot;泄漏点?原理全拆解!

    地&quot;揪出&quot;泄漏点的呢?今天,我们就用3分钟,带你彻底搞懂气密性检测仪的工作原理!、气密性检测仪是什么?气密性检测仪,顾名思义,就是用来检测物体密封性能的设备。它通
    的头像 发表于 03-15 16:13 1549次阅读
    3分钟读懂 | 气密性检测仪如何&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;揪出&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;<b class='flag-5'>泄漏</b>点?原理全拆解!

    电缆局部放电在线监测:守护电网安全的&amp;amp;quot;黑科技&amp;amp;quot;

    文章由山东华科信息技术有限公司提供在万家灯火的背后,有张覆盖全国的&quot;能源神经网络&quot;昼夜不息地运转。电缆作为电力输送的&quot;主动脉&
    的头像 发表于 04-14 18:12 1178次阅读
    电缆局部放电在线监测:守护电网安全的&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;黑科技&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    仓储界的&amp;quot;速效救心丸&amp;quot;,Ethercat转PROFINET网关实战案例

    实战案例,Ethercat转PROFINET网关,仓储界的&quot;速效救心丸&quot;
    的头像 发表于 05-11 10:32 990次阅读
    仓储界的&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;速效救心丸&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;,Ethercat转PROFINET网关实战案例

    为什么GNSS/INS组合被誉为导航界的&amp;amp;quot;黄金搭档&amp;amp;quot;?

    在导航技术领域,GNSS(全球导航卫星系统)和INS(惯性导航系统)的结合,直被业界誉为&quot;黄金搭档&quot;。它们优势互补,克服了单系统的局限性,为高精度、高可靠性的导
    的头像 发表于 07-09 17:12 1275次阅读
    为什么GNSS/INS组合被誉为导航界的&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;黄金搭档&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;?

    光耦合器:电子世界的 &amp;quot;光桥梁&amp;quot;

    在现代电子设备的复杂电路中,信号的传输与隔离至关重要。就像城市交通中需要桥梁来跨越障碍、连接不同区域样,电子电路里也需要座 &quot;桥梁&quot; 来实现信号的安全、高效传输
    的头像 发表于 08-22 16:58 1271次阅读

    为什么变频器开,监控画面就&amp;amp;quot;雪花&amp;amp;quot;?

    当你的工厂监控画面总是&quot;雪花&quot;闪烁,变频器启动就跳线,你是不是以为是摄像头老化了?其实,90%的这类问题都是变频器谐波在作怪!这不是摄像头的错,而是变频器输出的高次谐波干扰了
    的头像 发表于 09-23 14:17 818次阅读
    为什么变频器<b class='flag-5'>一</b>开,监控画面就&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;雪花&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;?

    &amp;quot;Access violation&amp;quot; 错误,复位位置,重新打印

    &quot;Access violation&quot; 错误
    的头像 发表于 11-08 07:16 858次阅读

    选EtherCAT模块,别只看价格,先看&amp;amp;quot;体检报告&amp;amp;quot;

    ±8kV静电、±2kV浪涌、-42℃极寒、1500V高压—这不是极限运动,而是DPort-ECT模块的出厂&quot;必修课&quot;。本文详解工业级EtherCAT从站如何通过严苛测试关
    的头像 发表于 02-04 11:46 624次阅读
    选EtherCAT模块,别只看价格,先看&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;体检报告&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    从&amp;amp;quot;替代人力&amp;amp;quot;到&amp;amp;quot;智能协同&amp;amp;quot;:履带式巡检机器人的产业跃迁

    2026年的工业智能化转型浪潮中,个显著的趋势正在形成——工业巡检机器人正从单纯的&quot;人力替代工具&quot;升级为具备感知、决策与协同能力的&quot;智能体&
    的头像 发表于 02-05 10:42 529次阅读

    从&amp;amp;quot;端子排丛林&amp;amp;quot;到&amp;amp;quot;总线拓扑&amp;amp;quot;:海纳A8/H8互联式温控器的嵌入式系统剖析

    在塑料挤出机的控制柜里,曾流传着一种令人窒息的布线方式:每台温控器需要独立的电源线、传感器线、输出线、通信线。十六台温控器意味着六十多根线汇聚在端子排上,像团纠缠的藤蔓。工程师排查故障时,得拿着
    的头像 发表于 04-27 15:27 304次阅读