【问题处理】银河麒麟操作系统实例分享,oom分析

news2024/11/22 12:01:31

1.问题现象描述

服务器数据库被oomkill掉,但是mem查看只占用了不到60%。

2.问题分析

2.1.oom现象分析

从下面的日志信息,可以看到chmod进程是在内核采用GFP_KERNEL|__GFP_COMP分配order=3也就是2的3次方,8个连续页的时候,因进入__alloc_pages_slowpath慢路径后仍然分配不到内存,导致oom产生并选择dmserver进程进行kill掉了。

Nov 29 03:30:02 c7dm kernel: [3148724.799309] chmod invoked oom-killer: gfp_mask=0x6040c0(GFP_KERNEL|__GFP_COMP), nodemask=(null), order=3, oom_score_adj=0

Nov 29 03:30:02 c7dm kernel: [3148724.799311] chmod cpuset=/ mems_allowed=0

Nov 29 03:30:02 c7dm kernel: [3148724.799318] CPU: 6 PID: 3558577 Comm: chmod Kdump: loaded Not tainted 4.19.90-24.4.v2101.ky10.x86_64 #1

Nov 29 03:30:02 c7dm kernel: [3148724.799319] Hardware name: sangfor acloud/acloud, BIOS 1.13.0-20201211_142035 04/01/2014

Nov 29 03:30:02 c7dm kernel: [3148724.799319] Call Trace:

Nov 29 03:30:02 c7dm kernel: [3148724.799329]  dump_stack+0x66/0x8b

Nov 29 03:30:02 c7dm kernel: [3148724.799333]  dump_header+0x6e/0x299

Nov 29 03:30:02 c7dm kernel: [3148724.799335]  oom_kill_process+0x259/0x280

Nov 29 03:30:02 c7dm kernel: [3148724.799337]  ? oom_badness+0x23/0x130

Nov 29 03:30:02 c7dm kernel: [3148724.799339]  out_of_memory+0x110/0x4f0

Nov 29 03:30:02 c7dm kernel: [3148724.799341]  __alloc_pages_slowpath+0x9c4/0xd10

Nov 29 03:30:02 c7dm kernel: [3148724.799344]  __alloc_pages_nodemask+0x245/0x280

Nov 29 03:30:02 c7dm kernel: [3148724.799347]  kmalloc_order+0x14/0x40

Nov 29 03:30:02 c7dm kernel: [3148724.799349]  kmalloc_order_trace+0x1d/0xa0

Nov 29 03:30:02 c7dm kernel: [3148724.799351]  ksys_getdents64+0xbf/0x2f0

Nov 29 03:30:02 c7dm kernel: [3148724.799354]  ? f_dupfd+0x65/0x80

Nov 29 03:30:02 c7dm kernel: [3148724.799355]  ? filldir+0xe0/0xe0

Nov 29 03:30:02 c7dm kernel: [3148724.799357]  ? __x64_sys_getdents64+0x16/0x20

Nov 29 03:30:02 c7dm kernel: [3148724.799358]  __x64_sys_getdents64+0x16/0x20

Nov 29 03:30:02 c7dm kernel: [3148724.799361]  do_syscall_64+0x5b/0x1d0

Nov 29 03:30:02 c7dm kernel: [3148724.799364]  entry_SYSCALL_64_after_hwframe+0x44/0xa9

Nov 29 03:30:02 c7dm kernel: [3148724.799368] RIP: 0033:0x7f42dbfcf357

现在来分析这一现像是否为正常现像(因为oom是内核的正常的机制),GFP_KERNEL的首先内存管理区为ZONE_NORMAL。从日志可以看出该系统一共有3个内存管理区,分别是ZONE_DMA、ZONE_DMA32和ZONE_NORMAL。接下来分析这个3个内存管理区的内存使用情况:

1)ZONE_DMA的空闲内存是11164k, 最低水位是16k,低水位是28k, 高水位是40k, 空闲内存远大于高水位,所以kswapd是不会启动回收的,但是Linux内核有一个对低端内存管理区的保护机制,lowmem_reserve中有体现,加上保护机制,最低水位为:16K + 63043*4KB=252188KB,这个数据比空闲内存11164KB要大了,所以ZONE_DMA是不能分配成功的.

Nov 29 03:30:02 c7dm kernel: [3148724.799379] Mem-Info:

Nov 29 03:30:02 c7dm kernel: [3148724.799408] active_anon:8949722 inactive_anon:903391 isolated_anon:0#012 active_file:2573150 inactive_file:3332422 isolated_file:0#012 unevictable:8 dirty:75 writeback:0 unstable:0#012 slab_reclaimable:202130 slab_unreclaimable:43363#012 mapped:53869 shmem:63501 pagetables:26140 bounce:0#012 free:4722 free_pcp:237 free_cma:0

Nov 29 03:30:02 c7dm kernel: [3148724.799412] Node 0 active_anon:35798888kB inactive_anon:3613564kB active_file:10292600kB inactive_file:13329688kB unevictable:32kB isolated(anon):0kB isolated(file):0kB mapped:215476kB dirty:300kB writeback:0kB shmem:254004kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 10831872kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no

Nov 29 03:30:02 c7dm kernel: [3148724.799413] Node 0 DMA free:11164kB min:16kB low:28kB high:40kB active_anon:4148kB inactive_anon:0kB active_file:504kB inactive_file:0kB unevictable:0kB writepending:0kB present:15992kB managed:15908kB mlocked:0kB kernel_stack:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB

Nov 29 03:30:02 c7dm kernel: [3148724.799416] lowmem_reserve[]: 0 2689 2817 63043 63043

  1. ZONE_DMA32的空闲内存是5996kb, 最低水位是2880k,低水位5632k, 高水位是8384k, 虽然空闲内存大于最低水位,但是同上考虑到lowmem_reserve机制,最低水位为:2880K + 60354*4K=244296K,这个数据比空闲内存5996KB要大,所以ZONE_DMA32也是不能分配成功的。

Nov 29 03:30:02 c7dm kernel: [3148724.799419] Node 0 DMA32 free:5996kB min:2880kB low:5632kB high:8384kB active_anon:2010016kB inactive_anon:177756kB active_file:174884kB inactive_file:274552kB unevictable:0kB writepending:0kB present:3129168kB managed:2801456kB mlocked:0kB kernel_stack:120kB pagetables:1084kB bounce:0kB free_pcp:260kB local_pcp:0kB free_cma:0kB

Nov 29 03:30:02 c7dm kernel: [3148724.799423] lowmem_reserve[]: 0 0 128 60354 60354

  1. 最后ZONE Normal的空闲内存是1760kb, 最低水位是136k,低水位是264k, 高水位是392k, 空闲内存高于高水位,所以kswapd是不会启动回收的。

Nov 29 03:30:02 c7dm kernel: [3148724.799426] Node 0 Normal free:1760kB min:136kB low:264kB high:392kB active_anon:33786032kB inactive_anon:3437860kB active_file:10115236kB inactive_file:13053364kB unevictable:32kB writepending:252kB present:63963136kB managed:137940kB mlocked:32kB kernel_stack:27084kB pagetables:103476kB bounce:0kB free_pcp:720kB local_pcp:0kB free_cma:0kB

Nov 29 03:30:02 c7dm kernel: [3148724.799429] lowmem_reserve[]: 0 0 0 481810 481810

继续看ZONE Normal的内存分布,空闲的1760kb内存大多为低阶的内存页,最大只可提供order=4(4KB*2^4=64KB)的连续内存,看似可以满足chmod进程申请的order=3的连续内存页。但观察这些空闲内存的migratetype,我们可以发现空闲的order=3,4的连续内存页的migratetype都为“H”(即MIGRATE_HIGHATOMIC)。

Nov 29 03:30:02 c7dm kernel: [3148724.799431] Node 0 DMA: 5*4kB (ME) 2*8kB (E) 1*16kB (M) 2*32kB (ME) 0*64kB 2*128kB (ME) 2*256kB (ME) 2*512kB (ME) 1*1024kB (E) 2*2048kB (M) 1*4096kB (M) = 11124kB

Nov 29 03:30:02 c7dm kernel: [3148724.799439] Node 0 DMA32: 3*4kB (H) 2*8kB (H) 12*16kB (H) 32*32kB (H) 25*64kB (H) 15*128kB (H) 5*256kB (H) 1*512kB (H) 0*1024kB 0*2048kB 0*4096kB = 6556kB

Nov 29 03:30:02 c7dm kernel: [3148724.799445] Node 0 Normal: 86*4kB (MH) 54*8kB (H) 28*16kB (H) 10*32kB (H) 3*64kB (H) 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1736kB

而chmod进程申请order=3的内存标志位为gfp_mask=0x6040c0(GFP_KERNEL|__GFP_COMP) ,其中GFP_KERNEL= (__GFP_RECLAIM | __GFP_IO | __GFP_FS),这便使得该次内存申请其默认申请migratetype为“E”(即MIGRATE_RECLAIMABLE)的内存,而无法申请migratetype都为“H”的内存页。

注:针对高阶page的申请导致的碎片一直以来就是一个令人担忧的问题,所以Linux社区创建了一个新的page type,MIGRATE_HIGHATOMIC,用于改善碎片化过多、高阶内存页申请无法通过的问题。只有高阶或具备同等级别(如GFP_HIGH、GFP_ATOMIC)的内存申请的才能从该pageblock中申请page。

2.2.内存使用情况分析

上述分析了OOM问题的现象,触发OOM的问题原因为Node 0 Normal区域空闲内存大于High水位、不会触发内存回收,但其也无法提供对应chmod进程申请的order=3、migratetype为“E”的连续内存页,这是内存碎片化的一种体现。

与此同时,客户反馈触发oom时系统内存memused不到60%,这点应该是从sar的日志中查看的。

图2

这里要说明的是%memused并非我们通常理解的系统已使用内存,使用man sar查看sar手册中关于sar -r内存统计信息项的描述我们可以看到kbmemused=total memory - kbmemfree - kbbuffers -kbcached -kb slab,具体见下图3。

图3

这意味memused统计的是系统总内存减去空闲内存和buff/cache/slab等缓存大小,%memused不到60%并不是说空闲内存还有40%,因为其减去了缓存的占用。这点从上面sar的kbmemfree和kbcached项目及oom-killer打印的mem-info中都可以看到,发生OOM时kbmemfree已经不多了,但仍有许多缓存,可由于Node 0 Normal区域的free内存大于High水位,这些缓存并不会被收回为空闲内存,接下来我们继续分析这种情况发生的原因。

2.3. 内存碎片化分析

之前我们分析了OOM问题产生的原因——Node 0 Normal区域发生内存碎片化,该区域剩余内存大于了内存回收High水位、不会进行内存回收,但又无法提供出对应的非低阶连续内存页。

同时我们也发现了两个问题,一是通常Node 0 Normal区域管理的内存远大于DMA、DMA32区域,这意味Noraml区域的内存回收水位也会同比的高于DMA、DMA32区域。但实际查看oom-killer时打印的meminfo信息我们会发现Normal区域的内存回收水位异常的小,甚至低于DMA32区域。二是默认情况Normal区域就是最高阶内存区域了,但其仍然具有lowmem_reserve保护机制。

Nov 29 03:30:02 c7dm kernel: [3148724.799413] Node 0 DMA free:11164kB min:16kB low:28kB high:40kB active_anon:4148kB inactive_anon:0kB active_file:504kB inactive_file:0kB unevictable:0kB writepending:0kB present:15992kB managed:15908kB mlocked:0kB kernel_stack:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB

Nov 29 03:30:02 c7dm kernel: [3148724.799416] lowmem_reserve[]: 0 2689 2817 63043 63043

Nov 29 03:30:02 c7dm kernel: [3148724.799419] Node 0 DMA32 free:5996kB min:2880kB low:5632kB high:8384kB active_anon:2010016kB inactive_anon:177756kB active_file:174884kB inactive_file:274552kB unevictable:0kB writepending:0kB present:3129168kB managed:2801456kB mlocked:0kB kernel_stack:120kB pagetables:1084kB bounce:0kB free_pcp:260kB local_pcp:0kB free_cma:0kB

Nov 29 03:30:02 c7dm kernel: [3148724.799423] lowmem_reserve[]: 0 0 128 60354 60354

Nov 29 03:30:02 c7dm kernel: [3148724.799426] Node 0 Normal free:1760kB min:136kB low:264kB high:392kB active_anon:33786032kB inactive_anon:3437860kB active_file:10115236kB inactive_file:13053364kB unevictable:32kB writepending:252kB present:63963136kB managed:137940kB mlocked:32kB kernel_stack:27084kB pagetables:103476kB bounce:0kB free_pcp:720kB local_pcp:0kB free_cma:0kB

Nov 29 03:30:02 c7dm kernel: [3148724.799429] lowmem_reserve[]: 0 0 0 481810 481810

带着这几个疑点进入内存管理分析,我们分析到是openEuler内核(银河麒麟高级服务器操作系统内核基于openEuler内核开发)在优化内存时引入了一个bug(commit eb761d6521c32c006a4987260394a61c6684fb35: mm: parallelize deferred struct page initialization within each node),该bug会导致zone的managed_pages统计出现错位,而水位线的计算与这是相关的,比如一个zone实际上10G内存,但因为统计错位了,所以可以计算时可能认为只有100M,从而以100M去计算水位线,导致水位非常低。

具体查看系统的/proc/zoneinfo我们可以发现Node 0 Normal区域的managed出现统计异常,其managed远小于spanned、present;而Node 0 Movable区域这个本不该管理内存的区域managed异常的大,对应的内存回收水位也极高,见下图4。这就是上述BUG导致的managed_pages统计出现错位的问题了。

图4

managed_pages统计出现错位,导致Noraml区域内存回收水位低得不正常。而较低的内存水位线将使得机器在长时间高内存压力运行下频繁触发内存回收,但因为linux内存回收只会将空闲内存回收至high水位就停止,这将导致每次触发内存回收也并未真正回收多少空闲内存。因此出现managed_pages统计错位的zone将一直维持在一个没有多少空闲内存可用的境地,不仅容易出现内存不足进程申请内存失败的情况,频繁、少量的内存回收也将导致该zone出现内存碎片化,这都使得机器更容易触发OOM。

3.问题总结

综上所述,本次OOM产生的原因为低版本内核存在managed_pages统计出现错位的BUG,该BUG会导致zone的managed_pages统计出现错位,水位线大小受到影响。而较低的内存水位线又将导致系统内存出现碎片化趋势,由此导致最后该zone空闲内存大于内存High水位线,但都为低阶连续内存,无法满足进程高阶连续内存页申请。

目前麒麟及openEuler都已在官网发布了内核修复公告,麒麟内核在SP1 23.30、SP2 25.22版本得到修复,SP3内核不存在这个BUG。

更新地址:KYBA-202212-1011 - 国产操作系统、麒麟操作系统——麒麟软件官方网站

图5

4.BUG影响范围

1)只是针对x86架构,机器长时间运行后都有概率出现,水位太低,长时间运行后碎片化严重,机器使用久了,所有申请大块内存的都会有问题。

2)启动信息中含有如图6打印的就存在影响,在arm64的机器中没有看到相应打印。arm64的机器没有走这一块代码,X86的走了这块代码。

图6

3)同时也体现在zone 内存信息显示不正常上。如图7所示,查看/proc/zoneinfo,发现Node 0,zone Movable显示不正常,spanned ,present为0,但是managed 很大。正常应spanned=present=managed=0,或者spanned>present>managed。

图7

5.后续计划及建议

建议升级V10-SP1系统内核到23.30及其以上版本解决,V10-SP2系统升级到25.22及其以上版本解决版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用Git-Secrets防止将敏感信息意外上传至Git库

关于Git-Secrets Git-secrets是一款功能强大的开发安全工具,该工具可以防止开发人员意外将密码和其他敏感信息上传到Git库中。 Git-secrets首先会扫描提交的代码和说明,当与用户预先配置的正则表达式模式匹配时,便会阻止此次提交。该工具的优…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术,它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…

Linux 磁盘管理和文件系统

硬盘的物理结构: 盘片硬盘有多个盘片,每盘片2面磁头每面一个磁头 硬盘的数据结构: 扇区盘片被分为多个扇形区域,扇区:每个扇区存放512字节的数据,硬盘的最小存储单位磁道同一盘片不同半径的同心圆,是由磁…

C++笔记:类和对象

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量,类型就像是定义了数据的规则,而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型,而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

「翻版周慧敏」海底骚逆天长腿贺30岁生日

有「翻版周慧敏」之称的苏皓儿(Chloe),日前原来已是她迎来30岁生日,她也在IG分享潜水靓相。火红色比坚尼尽骚她的苗条身材和长腿,就连网民也十分佩服,说:「三字头都咁靓好屈机!」 Ch…

MySQL 核心模块揭秘 | 14 期 | 回滚整个事务

回滚整个事务要怎么清除 binlog 日志,InnoDB 又会进行哪些操作? 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授…

电商价格监测合规性探讨

品牌在做控价、数据分析的过程中,都需要先有数据作为支撑,也就是说要先采集数据,价格监测也是如此,监测的基础是采集,现在主流的采集形式是爬虫采集,可以理解为人工采集的升级版,以机器代替人工…

Python基于深度学习的车辆特征分析系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

西晋从建立到灭亡51年历史

西晋的建立,也标志着三国时期的结束,也开启了中国历史上的一个新时代。下面让我们来揭开西晋从建立到灭亡51年的历史。 1、高平陵事变 曹丕去世后,魏明帝曹睿继位,但曹睿却英年早逝,幼子曹芳继位。 司马懿受曹睿托孤…

微服务之网关路由

一、概述 1.1认识网关 什么是网关? 顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。 更通俗的来讲,网关就像是以前园区传达室的大爷。 外…

vue 常用的日历排班,带农历显示组件(2024-04-16)

显示当前月日历组件,里面带农历或节日显示 后面可以丰富一些国家法定节假期的业务需求 代码 js-calendar.js 文件 var lunarInfo [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, //1900-19090x04ae0, 0x0a5b6, 0…

了解 Unity AI:从初学者到高级的综合指南

游戏中的AI是什么? 游戏中的人工智能是指利用人工智能技术使视频游戏中的非玩家角色和实体智能地行动、做出决策、对游戏环境做出反应,并提供引人入胜的动态游戏体验。什么是NPC? NPC 代表“非玩家角色”。NPC 是视频游戏、角色扮演游戏中不受人类玩家控制的角色。它们是计算…

Python-VBA函数之旅-exec函数

目录 一、exec函数的常见应用场景: 二、exec函数安全使用注意事项: 三、exec函数与eval函数对比分析: 1、exec函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:神奇夜光…

【word技巧】如何锁定word文档格式不变?

Word文档编辑完成之后不想被其他人修改格式,应该如何设置?限制编辑来搞定。 打开word文档设置限制编辑的界面,我们只勾选【限制对选定样式设置格式】,点击底下的设置,除了勾选第一个选项以外,还可以勾选上…

通过 Ollama、Langchain 实现 RAG

RAG 是什么 RAG 在 Langchain 上的定义是,作为大语言模型最常用的场景就是问答系统,可以针对特别来源数据做问题回答,就是私有数据,这就是 RAG,英文全称是Retrieval Augmented Generation。就是对现有模型数据的增广&…

树和二叉树(一)

一、树 非线性数据结构,在实际场景中,存在一对多,多对多的情况。 树( tree)是n (n>0)个节点的有限集。当n0时,称为空树。 在任意一个非空树中,有如下特点。 1.有且仅有一个特定的称为根的节点…

公园高速公路景区校园IP网络广播音柱SIP音柱

公园高速公路景区校园IP网络广播音柱SIP音柱 适用于学校、车站、教堂、工厂、仓库、公园停车场及露天市场高速公路等场所播放录制语音文件或背景音乐节目,专业一体化音箱设计,高强度防水设计,符合IP54防护等认证,数字化产品&…

一个开源的全自动视频生成软件MoneyPrinterTurbo

只需提供一个视频 主题 或 关键词 ,就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐,然后合成一个高清的短视频。 一:功能特性 完整的 MVC架构,代码 结构清晰,易于维护,支持 API 和 Web界面…

用Scrapy抓取当当网站数据

setting.py实验目的及要求: 【实验目的】 通过本实验了解Scrapy爬虫框架;熟练掌握Scrapy的基本使用方法和常用技巧。 【实验要求】 使用Scrapy框架,抓取网站商品信息(京东、淘宝、当当等任选一个),并将结…

软考 系统架构设计师系列知识点之大数据设计理论与实践(8)

接前一篇文章:软考 系统架构设计师系列知识点之大数据设计理论与实践(7) 所属章节: 第19章. 大数据架构设计理论与实践 第3节 Lambda架构 19.3.3 Lambda架构介绍 1. 批处理层 2. 加速层 对加速层批处理视图建立索引&#xff0c…