【问题解决分享】银河麒麟高级服务器操作系统oom分析

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.mzph.cn/news/822122.shtml

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

相关文章

Hadoop大数据处理技术-安装配置篇

2024/4/16 ​Hadoop学习前的准备 1)首先安装虚拟机 VMWare 虚拟机:因为它不是一个硬件 而是用软件做出来的 模拟真机 所以叫做虚拟机 但实际上它里面也可以安装Linux和Windows 实际它的实现 虚拟机中想要实现某个操作时 将需求发给Windows 调用Windo…

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化,可以理解为是一种分组的插入排序。 希尔排序的要点: 简单来说,就是分组实现插入,每组元素的间隙称为gap,…

leetcode-合并两个有序链表

目录 题目 图解 方法一 方法二 代码(解析在注释中) 方法一 ​编辑方法二 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1…

OpenStack镜像管理与制作

一、OpenStack镜像服务 1、什么是镜像 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。虚拟机所使用的虚拟磁盘,实际上是一种特殊格式的镜像文件。云环境下尤其需要镜像。镜像就是一个模板,类似于VMware的虚拟机模板,其预先安装基本的…

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…

计算机网络的七层模型

序 OSl(Open System Interconnect),即开放式系统互联。一般都叫OSI参考模型。在网络编程中最重要的模型就是OSI七层网络模型和TCP/IP四层网络模型 一、OSI七层参考模型以及功能概述 二、各层的具体职能以及实际应用 1.应用层: OSI参考模型中最接近用…

【高端电流检测IC储能产品应用方案】耐压45V侧轨的电流检测芯片FP137 应用于电脑电源,开关电源以及多口快充充电器,户外移动电源,适配器,电池充电器等

近年来,随着电子产品的飞速发展,对电流检测精度和可靠性的要求也越来越高。特别是在电脑电源、开关电源以及多口快充充电器、户外移动电源、适配器、电池充电器等领域,对电流检测技术的需求更是日益增长。 电流检测芯片是一种关键的电子元器…

day02|最小花费爬梯子

最小花费爬梯子 比如 有一个数组 【2 5 20】我们直接选择从1号梯子(从零编号)跳两格就出去了。 算法原理 我们可以得出楼顶其实是数组的最后一个元素的下一个位置。对于最值问题我们可以尝试使用dpdp我们首先应该定义状态方差的含义,一般以…

stm32实现hid鼠标

启动CubelMX 选择芯片(直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程(后记:此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文,以及…

[大模型]InternLM2-7B-chat Xtuner Qlora 微调

InternLM2-7B-chat Xtuner Qlora 微调 Xtuner介绍 XTuner是上海人工智能实验室开发的低成本大模型训练工具箱,XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。只要8G。最低只需 8GB 显存,就可以微调InternLM2-7B模型,打造专属于你…

强强联手|AI赋能智能工业化,探索AI在工业领域的应用

随着人工智能(AI)技术的不断发展和应用,AI在各个领域展现出了巨大的潜力和价值。在工业领域,AI的应用也越来越受到关注。AI具备了丰富的功能和强大的性能,为工业领域的发展带来了巨大的机遇和挑战。 YesPMP是专业的互联…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

【位运算 子集状态压缩】982按位与为零的三元组

算法可以发掘本质,如: 一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏…

案例研究|众乐邦将MeterSphere持续测试平台融入DevOps流水线

众乐邦网络科技有限公司(以下简称为“众乐邦”)是一家企业服务公司。其旗下的众乐邦灵活用工数字化薪税管理平台(以下简称为灵活用工管理平台),以财税服务视角切入灵活用工场景,连接企业、灵活就业者和监管…

力扣:141. 环形链表

力扣:141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

一个文生视频MoneyPrinterTurbo项目解析

最近抖音剪映发布了图文生成视频功能,同时百家号也有这个功能,这个可以看做是一个开源的实现,一起看看它的原理吧~ 一句话提示词 大模型生成文案 百家号生成视频效果 MoneyPrinterTurbo生成视频效果 天空为什么是蓝色的? 天空之所以呈现蓝色,是因为大气中的分子和小粒子会…

35、链表-LRU缓存

思路: 首先要了解LRU缓存的原理,首先定下容量,每次get请求和put请求都会把当前元素放最前/后面,如果超过容量那么头部/尾部元素就被移除,所以最近最少使用的元素会被优先移除,保证热点数据持续存在。 不管放…

鸿蒙画布组件使用介绍

一、前言 DevEco Studio版本:4.0.0.600 前些天写了一篇 鸿蒙自定义控件实现罗盘数字时钟效果 的文章,有同学私信说能不能介绍鸿蒙中的画布组件,下面文章介绍下鸿蒙中的Canvas画布、CanvasRenderingContext2D绘制组件,实现绘制文…

股票市场预测模型:未来趋势的智能分析工具

📈 股票市场预测模型:未来趋势的智能分析工具 🤑 🏦 概述 在这个充满变数的股票市场中,投资者需要一个强大的工具来预测未来的价格走势。我们的机器学习模型旨在通过分析历史数据,为投资者提供科学的市场…

03.卸载MySQL

卸载MySQL 1.Windows卸载MySQL8 停止服务 用命令停止或者在服务中停止都可以 net stop mysql(服务名字可以去服务里面看一下)控制面板卸载MySQL 卸载MySQL8.0的程序可以和其他桌面应用程序一样直接在控制面板选择卸载程序,并在程序列表中…