【技术实操】银河高级服务器操作系统实例分享,达梦数据库服务器 oom 问题分析

1. 服务器环境以及配置

【 机型】

处理器: HUAWEIKunpeng 920 5220

内存: 400518528 kB

主板型号: Chaoqiang K620 series

整机类型/架构: ARM

BIOS 版本: KL4.41.028.TF.220224.R

固件版本: KL4.41.028.TF.220224.R

系统硬盘: 1 disks, totaling 4470 GiB (4.37 TiB)

网卡: mlx5_core

【 内核版本】

4.19.90-23.26.v2101ky10.aarch64

【 OS 镜像版本】

Kylin-Server-10-SP1-Release-Build20-20210518

【 第三方软件】

达梦数据库

2. 问题现象描述

用户反馈 OA 系统服务器在 2024-3-4 凌晨左右出现 oom。

3. 问题分析

从客户的监控平台来看,在3月4日凌晨4点的时候, 内存急剧下降, 并且内存下降的时候, 内存使用率只有 40%多, 如图 1。

图 1

查看 messages 中对应时间点的日志, 可以看到任务 3c458aeac30 在申请 order=3也就是申请连续 2^3 个 pagesize( 2^3*64k=512K) 的内存的时候失败了。 由于3c458aeac30 在申请内存的时候没有指定 nodemask, 所以默认从 Normal 区域申请内存, 向 DMA 或者 DMA32 借位的话也是从 Normal 往下借位。

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123150] Job:3c458aeac30

invoked oom-killer: gfp_mask=0x6040c0(GFP_KERNEL|__GFP_COMP),

nodemask=(null), order=3, oom_score_adj=0

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123156] Job:3c458aeac30

cpuset=/ mems_allowed=0

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123164] CPU: 23 PID:

2579635 Comm: Job:3c458aeac30 Kdump: loaded Not tainted

4.19.90-23.26.v2101.ky10.aarch64 #1

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123165] Hardware name:

THTF Chaoqiang K620-M1/BC82AMDDIA, BIOS KL4.41.028.TF.220224.R

02/24/2022

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123166] Call trace:

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123174]

dump_backtrace+0x0/0x170

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123175]

show_stack+0x24/0x30

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123179]

dump_stack+0xa4/0xe8

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123185]

dump_header+0x6c/0x240

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123187]

oom_kill_process+0x334/0x370

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123189]

out_of_memory+0xe4/0x4f0

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123191]

__alloc_pages_nodemask+0xcf0/0xd70

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123196]

alloc_pages_current+0x88/0xf0

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123200]

kmalloc_order_trace+0x38/0x100

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123202]

__kmalloc+0x274/0x290

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123206]

ksys_getdents64+0x9c/0x348

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123207]

__arm64_sys_getdents64+0x28/0x38

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123214]

el0_svc_common+0x78/0x130

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123216]

el0_svc_handler+0x38/0x78

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123219]

el0_svc+0x8/0x1b0

后续 mem 信息如下, 可以看到 inactive_file 比较多, 并且空闲内存 free 也有 8262个 pagesize, 也就是 528M 左右, 从这里看, 说明触发 oom 的时候, 服务器存在很多cache 并且有一部分 free 的空闲内存, 但是为什么会触发 oom, 需要继续分析

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123220] Mem-Info:

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123228] active_anon:335474

inactive_anon:15962 isolated_anon:0#012 active_file:123475 inactive_file:448986

isolated_file:0#012 unevictable:448 dirty:24 writeback:0 unstable:0#012

slab_reclaimable:3906 slab_unreclaimable:28995#012 mapped:2154 shmem:50577

pagetables:324 bounce:0#012 free:8262 free_pcp:39 free_cma:0

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123232] Node 0

active_anon:21470336kB inactive_anon:1021568kB active_file:7902400kB

inactive_file:28735104kB unevictable:28672kB isolated(anon):0kB

isolated(file):0kB mapped:137856kB dirty:1536kB writeback:0kB

shmem:3236928kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB

writeback_tmp:0kB unstable:0kB all_unreclaimable? no

继续查看 meminfo 的日志打印, 可以看到 Normal 区的 order >= 3 阶的内存已经用完, 并且 Normal 区的 free 空闲内存大于 high 水位, 不会进行回收, 从 Normal区来看, 程序申请不到 order=3 阶的内存属于正常现象, 也从侧面反应了该服务器存在一定程度上的内存碎片化。

从 DMA32 区来看, 空闲内存 free > min + reserved*pagesiz( 285952kB > 704kB +3893*64kB ) , 看似能向 DMA32 借用内存, 但是我们注意到 DMA32 中, 大于等于 3阶的内存都有 H 标记, 也就是 migratetype 为“H” , 即 MIGRATE_HIGHATOMIC,而进程申请内存的时候指定的内存标志位为gfp_mask=0x6040c0(GFP_KERNEL|__GFP_COMP) , 其中GFP_KERNEL=(__GFP_RECLAIM | __GFP_IO | __GFP_FS), 这便使得该次内存申请其默认申请migratetype 为“E” ( 即 MIGRATE_RECLAIMABLE) 的内存, 而无法申请 migratetype都为“H” 的内存页。

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123235] Node 0 DMA32

free:285952kB min:704kB low:2112kB high:3520kB active_anon:432320kB

inactive_anon:18816kB active_file:138368kB inactive_file:548672kB

unevictable:0kB writepending:0kB present:2096960kB managed:1497920kB

mlocked:0kB kernel_stack:3520kB pagetables:128kB bounce:0kB free_pcp:0kB

local_pcp:0kB free_cma:0kB

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123238] lowmem_reserve[]:

0 3893 3893

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123241] Node 0 Normal

free:242816kB min:31488kB low:95232kB high:158976kB

active_anon:21039424kB inactive_anon:1002752kB active_file:7764032kB

inactive_file:28187008kB unevictable:28672kB writepending:1536kB

present:65011712kB managed:63802624kB mlocked:28672kB

kernel_stack:24128kB pagetables:20608kB bounce:0kB free_pcp:2496kB

local_pcp:0kB free_cma:0kB

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123244] lowmem_reserve[]:

0 0 0

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123245] Node 0 DMA32:

621*64kB (UMH) 148*128kB (UMH) 37*256kB (UH) 66*512kB (H) 49*1024kB (H)

34*2048kB (H) 6*4096kB (H) 3*8192kB (H) 1*16384kB (H) 0*32768kB 0*65536kB

0*131072kB 0*262144kB 0*524288kB = 287296kB

Mar 4 04:00:01 BJZJXCOA-DB01 kernel: [39236047.123252] Node 0 Normal:

2630*64kB (U) 560*128kB (U) 37*256kB (U) 0*512kB 0*1024kB 0*2048kB

0*4096kB 0*8192kB 0*16384kB 0*32768kB 0*65536kB 0*131072kB 0*262144kB

0*524288kB = 249472kB

查看内核启动参数, 可以看到没有开启 thp, 所以 min_free_kbytes 默认只初始化一次, 这也是现场 min_free_kbytes 为 32312kB 的原因, 该值过下, 意味着内存回收的时候, 更多的回收的是小块内存, 容易造成内存碎片化, 内存碎片化也是造成上述问题的根本原因。

BOOT_IMAGE=/vmlinuz-4.19.90-23.26.v2101.ky10.aarch64

root=/dev/mapper/klas-root ro crashkernel=1024M,high rd.lvm.lv=klas/root

rd.lvm.lv=klas/swap video=VGA-1:640x480-32@60me rhgb quiet

smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 video=efifb:off

video=VGA-1:640x480-32@60me numa=off transparent_hugepage=never

4. 问题分析结果

综上所述, 本次触发 OOM 的原因是系统内存回收水位线较小、 内存碎片化, 空闲内存高于内存回收水位但无法提供进程申请的较大阶数的连续内存页。 内存回收水位较低的原因是系统手动关闭了 THP, 导致 min_free_kbytes 只进行一次初始化, 只能达到 32312kB。

由于关闭 THP 是为了保证业务应用性能, 我们只能通过其他方法来改善这个情况。首先是可以手动修改 min_free_kbytes 参数的大小, 避免单次初始化的上限干扰。

其次还可以修改 watermark_scale_factor 的值, 调大 min、 low、 high 三条内存回收水位线的差距, 使得系统在空闲内存不足时更早、 更多地进行内存回收。

之后对于内存碎片化的情况, 如果业务应用是会频繁生成、 读取小文件, 产生大量零散 cahce, 我们建议可以在业务空闲时手动释放、 规整内存。

最后对于 OOM 杀死达梦数据库的情况, 除了上述优化内存回收、 规整内存的方法, 我们还可以通过设置应用 oom_score_adj 为-1000 的方式, 禁止 OOM 进程杀死对应应用。

5. 后续计划与建议

手动调整 min_free_kbytes 参数的大小( 建议)

打开 sysctl.conf 配置文件: vim /etc/sysctl.conf, 在其中手动添加 vm.min_free_kbytes= 653005( 该值单位为 KB, 推荐设置为总内存大小的 0.5%-1%) , 完成修改后生效配置: sysctl -p

查询参数看是否修改完成: cat /proc/sys/vm/min_free_kbytes 或 sysctl -a |grep

min_free_kbytes

内存规整( 暂不建议, 后续还有问题可以调整)

对于内存碎片化的情况, 如果系统内存高碎片化情况较为频繁, 条件允许的情况下, 我们建议在业务空闲时手动进行异步内存规整。 直接用 root 用户执行 echo 1 >/proc/sys/vm/compact_memory 即可, 若服务器业务较为规律, 可以挑选一天中的业务空闲时间直接写入定时任务执行。

调整 min、 low、 high 间距( 暂不建议, 后续还有问题可以调整)

如果想将更多的内存留给用户态应用使用, 还可以修改 watermark_scale_factor 的值来调大 min、 low、 high 三条内存回收水位线的差距, 这个这次不建议调整。

进程防杀死( 暂不建议, 后续还有问题可以调整)

手动修改应用进程oom_score_adj 为 -1000,通过修改进程oom用户打分oom_score_adj 为-1000 的方式, 我们可以使得该进程不会被 oom 所杀死。

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

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

相关文章

AI能否代替ACE

什么是ACE ? 申请ACE需要以下条件: 1.发表与oracle相关的技术博客 2.参与Oracle相关的技术大会 3.对Oracle社区做出贡献。 这正好是AI应用的场景吗? 在一个群里有个群友质疑AI落地,以及应用领域? Kelvin:我一直在迷茫,学不好。这么多有趣AI 问题&…

Redis-Cluster模式基操篇

一、场景 1、搞一套6个主节点的Cluster集群 2、模拟数据正常读写 3、模拟单点故障 4、在不停服务的情况下将集群架构改为3主3从 二、环境规划 6台独立的服务器,端口18001~18006 192.169.14.121 192.169.14.122 192.169.14.123 192.169.14.124 192.169.14.125 192…

迁移ISE ChipScope逻辑分析器到Vivado硬件管理器

迁移ISE ChipScope逻辑分析器到Vivado硬件管理器 介绍 本章介绍AMD Vivado™Design Suite硬件管理器,以及这些工具之间的关系 到ISE™设计套件ChipScope™逻辑分析器工具,以及如何迁移IP核 从ISE ChipScope环境到Vivado Design Suite。 Vivado硬件管理器…

使用LLaMA-Factory微调大模型

使用LLaMA-Factory微调大模型 github 地址 https://github.com/hiyouga/LLaMA-Factory 搭建环境 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory在 LLaMA-Factory 路径下 创建虚拟环境 conda create -p ./venv python3.10激活环境 c…

为参数设置默认值

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 调用函数时,如果没有指定某个参数将抛出异常,为了解决这个问题,我们可以为参数设置默认值,即在定义函…

Oracle Linux上安装ORDS

ORDS就是Oracle REST Data Services。 环境如下: Oracle Linux 8Oracle Database 19cIP地址为A.B.C.D 要安装最新版本的ORDS,当前为24.1.1。 全程参考文档:Installing and Configuring Oracle REST Data Services 安装ORDS 添加reposit…

ReDos攻击浅析

DOS为拒绝服务攻击,re则是由于正则表达式使用不当,陷入正则引擎的回溯陷阱导致服务崩溃,大量消耗后台性能 正则 ​ 探讨redos攻击之前,首先了解下正则的一些知识 执行过程 大体的执行过程分为: 编译 -> 执行编译过程中&…

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…

实用软件分享---超级轻量级的强力卸载软件工具UninstallView_1.51

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

django中,出现CSRF verification failed. Request aborted.错误

这是跨站点访问的防范机制&#xff0c;csrf是一个令牌&#xff0c;会验证登录&#xff0c;需要在setting中把 "django.middleware.csrViewMiddleware" 注释掉 并在html文件中的<body>内添加 {% csrf token %} 就可以了

Star CCM+边界层设置

边界层介绍 在流体仿真中&#xff0c;边界层是指靠近实体表面的流体区域&#xff0c;其作用是描述流体在实体表面附近的速度和压力分布。边界层主要影响着物体表面的摩擦阻力、热传导以及质量传输等现象。 一般来说&#xff0c;在流体仿真中会设置一到三层不同厚度的边界层。…

最常用的电平转换电路

最常用的电平转换电路 两颗NMOS搭建的电平转换电路![请添加图片描述](https://img-blog.csdnimg.cn/direct/2b496321257f4bc4a1f23a086337ed27.png)两颗NPN三极管搭建的电平转换电路二极管钳位搭建电平转换电路二极管和MOS管组合的电平转换电路专用转换芯片电平转换 两颗NMOS搭…

YAML快速编写示例

一、案例 1.1 自主式创建service关联上方的pod 资源名称my-nginx-kkk命名空间my-kkk容器镜像nginx:1.21容器端口80标签njzb:my-kkk 1.1.1 创建一个demo文件夹 1.1.2 创建并获取模版文件 1.1.3 查看服务并编写yaml文件 1.1.4 编写yaml文件并部署&#xff0c;查看服务是否运行成…

elementui中的el-checkbox-group添加全选按钮

//多选子组件 <template><div class"multiple-choice"><el-checkbox class"no1" v-if"isShowAllBtn" :indeterminate"isIndeterminate1" v-model"checkAll1" border :style"{borderColor:isIndetermina…

elementUI - 折叠以及多选的组件

//子组件 <template><!-- 左侧第二个 --><div class"left-second-more"><div class"layer-list-wrapper1"><el-collapse v-model"activeNames" change"handleChange"><el-collapse-item v-for"…

期末速成 ——计算机组成原理(2)数值的表示与运算

目录 一、定点数的表示 &#xff08;一&#xff09;无符号数和有符号数的表示 &#xff08;二&#xff09;机器数的定点表示 &#xff08;三&#xff09;原码、补码、反码、移码 (1)原码表示法 二、浮点数的表示 三、溢出判断 (一)采用一位符号位 (二)采用双符号位 四…

LC 旋转 - 模拟对象

原文链接 链接 液晶 (LC) 旋转网格属性允许您以 theta、phi 为单位指定空间变化的 LC 导向。 液晶由杆状分子结构组成&#xff0c;这些分子结构具有相对于长轴的旋转对称性。因此&#xff0c;液晶具有空间变化的单轴光学特性。 相对于分子长轴和分子短轴的折射率称为非寻常 ne …

《广告数据定量分析》第3版读书笔记之统计原理

1.点估计与区间估计:可用于求指标误差区间;(不常用) (1)总体比例的置信区间: 通过样本数据计算的比例,估计总体的对应比例的取值范围。主要适用于用户转化漏斗各环节的转化率估计,比如点击率、点击下载率、下载安装率、安装激活率等。 我们可以得到总体百分比的一个…

SRS介绍及环境搭建

1.SRS简介 SRS&#xff08;Simple Real-Time Media Server&#xff09;是一个开源的流媒体服务器&#xff0c;它支持多种流媒体协议&#xff0c;包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等57。SRS主要应用于直播、视频会议等场景&#xff0c;提供实时音视频服…

【刷题(14)】二叉树

一、二叉树基础 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* …