当前位置: 首页 > news >正文

【技术实操】银河高级服务器操作系统实例分享,达梦数据库服务器 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 所杀死。

相关文章:

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

1. 服务器环境以及配置 【 机型】 处理器: HUAWEIKunpeng 920 5220 内存: 400518528 kB 主板型号: Chaoqiang K620 series 整机类型/架构: ARM BIOS 版本: KL4.41.028.TF.220224.R 固件版本: KL4.41…...

通过ffmpeg 将wav格式转为mp3格式.

通过ffmpeg实现将wav转为mp3格式.需要下载一个ffmpeg放到执行文件所在目录. 我ffmpeg的下载地址为:ffmpeg.exe下载-ffmpeg.exe32&64位下载免费版-旋风软件园 use ShellAPI; {$R *.dfm}procedure ConvertWavToMp3(const InputFile, OutputFile: string); varExecu…...

快速上手RabbitMQ,直接上开发!

一 直接使用Rabbit MQ 在Java项目中使用Rabbit MQ可以通过引入Rabbit MQ的客户端Maven依赖,和Rabbit MQ建立连接进行通信。这种就属于是直接使用Rabbit MQ。 基本使用 创建连接后,使用channel向交换机发送消息 public class Producer {private final s…...

如何实现单例模式及不同实现方法分析-设计模式

这是 一道面试常考题:(经常会在面试中让手写一下) 什么是单例模式 【问什么是单例模式时,不要答非所问,给出单例模式有两种类型之类的回答,要围绕单例模式的定义去展开。】 单例模式是指在内存中只会创建…...

wampserver安装与汉化

wampserver安装与汉化 文章目录 wampserver安装与汉化一、安装二、汉化1.升级软件并安装补丁 介绍: WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程,从而腾出更…...

解决MyBatis的N+1问题

解决MyBatis的N1问题 N1问题通常出现在一对多关联查询中。当我们查询主表数据(如订单)并希望获取关联的从表数据(如订单的商品)时,如果每获取一条主表记录都要执行一次从表查询,就会产生N1次查询的问题。假…...

12-学生们参加各科测试的次数(高频 SQL 50 题基础版)

12-学生们参加各科测试的次数 -- 学生表中,id是唯一的,将他作为主表 -- CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积 -- 2行表,与3行表使用cross join,得到2*36行数据 select st.student_id, st.student_name,su.subject_na…...

2024网络与信息安全管理员职工职业技能竞赛re0220164094

main部分,就是要逆这部分shellcode,程序把data段里面的东西复制到bss段去执行,期间包含解码操作。 v19 0;puts("Please input your flag: ");__isoc99_scanf("%s", s);if ( strlen(s) ! 38 ){puts("Wrong length!&…...

Elasticsearch--easy-ES框架使用,轻松操作查询Elasticsearch,简化开发

Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可…...

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)

在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…...

思维导图-vb.net开发带进度条的复制文件夹功能c#复制文件夹

你们谁写代码会用流程图来做计划,或者写项目总结报告? .net带进度条复制文件夹 方案 列出所有子文件夹,再创建,复制文件 大文件可以单独做进度条 缺点:设计会更复杂 直接…...

Linux文本处理三剑客之awk命令

官方文档:https://www.gnu.org/software/gawk/manual/gawk.html 什么是awk? Awk是一种文本处理工具,它的名字是由其三位创始人(Aho、Weinberger和Kernighan)的姓氏首字母组成的。Awk的设计初衷是用于处理结构化文本数…...

公差和配合

配合的选择: 配合特性以及基本偏差的应用: 常用优先配合特性及选用举例 为什么一般情况下选用基孔制而不用基轴制: 优先采用基孔制的原因主要包括工艺性、经济性和标准化: 工艺性。加工孔比加工轴更难,因为孔…...

AI大模型应用开发实践:5.快速入门 Assistants API

快速入门 Assistants API Assistants API 允许您在自己的应用程序中构建人工智能助手。一个助手有其指令,并可以利用模型、工具和知识来回应用户查询。 Assistants API 目前支持三种类型的工具: 代码解释器 Code Interpreter检索 Retrieval函数调用 Function calling使用 P…...

stack和queue的模拟实现

文章目录 如何实现?实现stack实现queue总结 如何实现? 首先我们看看官网上的stack,官网上的stack是用deque作为模版的缺省值去实现的,deque是什么? deque其实就是双端队列,双端队列,顾名思义&am…...

你的手机是如何控制你的手表之广播篇

前言 要让手机能够控制手表,第一步当然要让手机能够“看见”手表,人类作为上帝视角,我们是能够通过眼睛直接看见手机和手表的,但要让手机“看见”手表,就需要一端把自己的信息通过电磁波的形式发往空中,另…...

深入理解并发之LongAdder、DoubleAdder的实现原理

深入理解LongAdder、DoubleAdder的实现原理 本文主要通过LongAdder和DoubleAdder的源码,讲述一下其实现原理。通过LongAdder和DoubleAdder的源码可知。两者都是继承了Striped64的类。下面我们将通过源码的形式讲述一下这三个类都做了哪些事情。 1: Striped64 ​ …...

virtuoso原理图无法编辑

(SCH-1217): Could not open "XX schematic" for edit. (because it is locked by user XX on XX) Would you like to open it for read? 解决方法: 到工程目录的schematic文件夹下找到sch.oa.cdslck.RHEL30.XXX-eda.21423和sch.oa.cdslck全部删掉即可正…...

Kotlin协程中的作用域 `GlobalScope`、`lifecycleScope` 和 `viewModelScope`

Kotlin协程中的作用域 Kotlin协程提供了多种作用域来管理协程的生命周期,其中最常见的是 GlobalScope、lifecycleScope 和 viewModelScope。 1. GlobalScope GlobalScope 是一个全局作用域,不受任何其他生命周期的限制。这意味着在 GlobalScope 中启动…...

leetcode739 每日温度

题目 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 输入: tempe…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...