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

news2024/12/27 15:03:54

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.coloradmin.cn/o/1711074.html

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

相关文章

nginx源码阅读理解 [持续更新,建议关注]

文章目录 前述一、nginx 进程模型基本流程二、源码里的小点1.对字符串操作都进行了原生实现2.配置文件解析也是原生实现待续 前述 通过对 nginx 的了解和代码简单阅读,发现这个C代码的中间件确实存在过人之处,使用场景特别多,插件模块很丰富…

加密资产私钥安全完整手册(一) ,bitget钱包为例

比特币和以太坊等加密货币的兴起开创了数字金融的新时代,但也带来了独特的安全挑战。这些代表现实世界价值的数字资产已成为黑客和窃贼的主要目标。为了安全地应对这种情况,了解私钥的基本概念至关重要。 私钥是加密货币所有权和安全性的基石。它们相当于…

三维天地参编《数据要素流通标准化白皮书(2024版)》正式发布

近日,在福州举行的第七届数字中国建设峰会数据标准化和数据基础设施分论坛-数据标准化专场举行。国家数据局局长刘烈宏、福建省政府党组成员李兴湖出席并致辞。 该论坛由国家数据局主办、中国电子技术标准化研究院承办,围绕“标准引领 数创未来”主题,分享实践经验,明晰建设路…

故障诊断 | 基于KAN故障诊断模型

效果一览 文章概述 故障诊断 | 基于 KAN故障诊断模型。KAN是一种全新的神经网络架构,它与传统的MLP架构不同,能够用更少的参数量在Science领域取得惊人的表现,并且具备可解释性,有望成为深度学习模型发展的一个重要方向。运用KAN&…

网页上怎么打开iPhone手机上的备忘录 备忘录网页端打开方式

我经常使用iPhone的备忘录功能,随手记录生活中的点点滴滴,工作中的待办事项。然而,有时候,当我坐在电脑前,想要快速查看或编辑备忘录内容时,手机的小屏幕就显得不那么方便了。那么,如何在电脑上…

scrapy 整合 mitm

1.mitm 是什么 MITMproxy 是一个开源的中间人代理,常用于网络流量的拦截、查看和修改。 2.scrapy 整合 mitm步骤 2.1 安装mitm PS F:\studyScrapy\itcastScrapy> pip install mitmproxy2.2 在settings 中配置下载器中间件 # settings.pyDOWNLOADER_MIDDLEWARES…

如何将音频中的人声分离出来?

想要把一段视频中的人声跟背景音乐分离开来,找个好一点的音频处理软件就能把声音分离了,常见的有以下方法,一起来看看吧。 pr 打开软件,然后将电脑上的音频文件,上传到软件中,然后按住[ctrla]选择所有音频…

【硬核测评】猫咪主食冻干测评揭秘SC、希喂、爱立方真实对比测评

主食冻干喂养是否必要? 来自七年经验的铲屎官明确告诉你,这是非常必要的喂养方式! 随着宠物经济的蓬勃发展和科学养宠知识的普及,如今养猫已不仅仅是让猫咪吃饱那么简单。越来越多的养猫人开始重视猫咪的饮食健康。大量实际喂养案…

SpringBoot之@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder注解

前言 SpringBoot通过AutoConfigureOrder、AutoConfigureBefore、AutoConfigureAfter注解,控制自动配置类的实例化顺序。 Spring中控制Bean的实例化顺序 Spring中默认实例化顺序 创建实体类A、B、C Component public class A {public A() {System.out.println(&…

小熊家务帮day5 客户管理模块1 (小程序认证,手机验证码认证等)

客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…

The 2022 ICPC Asia Nanjing Regional Contest - External G

题目链接:Problem - D - Codeforces 写在前面:今天的训练赛打的稀碎,一道稍微难一点的签到题就把我难住了,看完题解确实感觉不难,看来题目还是刷太少了。 回归正题 题意: 思路:尽量让分子大,分…

操作系统实验三 可变分区内存分配首次适应算法模拟

实验三 可变分区内存分配首次适应算法模拟 实验内容 模拟内存分配,了解并掌握动态分区分配中所用的数据结构、分区分配算法,深刻理解首次适应内存分配算法。 模拟实现可变分区内存分配首次适应算法;空闲分区表要求有空闲块的起始地址、大小…

LLama学习记录

学习前: 五大问题: 为什么SwiGLU激活函数能够提升模型性能?RoPE位置编码是什么?怎么用的?还有哪些位置编码方式?GQA(Grouped-Query Attention, GQA)分组查询注意力机制是什么&…

使用Python发送电子邮件

大家好,当我们需要迅速、方便地与他人沟通时,电子邮件是无疑是一种不可或缺的通信工具。无论是在个人生活中还是工作场合,电子邮件都是我们日常生活中的重要组成部分。它不仅能够传递文字信息,还可以发送附件、链接和嵌入式多媒体…

AJAX基础知识

定义 Ajax 异步 JavaScript 和 XML ( async javascript and xml ),使用 Ajax 技术网页应用能够快速地将数据更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操…

6、xss-labs之level8

1、测试分析 传入123查看页面源码&#xff0c;发现传入的值传给了value和a标签的href&#xff0c;并且对特殊字符<>" 都进行了HTML实体化&#xff0c;对于大小写进行了转化&#xff0c;过滤掉了src、data、onfocus、href、script、"&#xff08;双引号&#…

JAVA学习路线图

计算机网课资料分享群&#xff1a;710895979

每天写两道(二)LRU缓存、

146.LRU 缓存 . - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

蓝桥杯第1022题 玩具蛇 基础DFS C++ Java

题目 思路和解题方法 问题理解&#xff1a;此题要求找出将一条由16节正方形构成的玩具蛇放入4x4的方格中的不同方式数。每节蛇可以是直线或直角转弯&#xff0c;且蛇的形状需要完全覆盖盒子里的16个格子&#xff0c;每个格子仅被蛇的一个部分占据。 状态表示&#xff1a;使用一…

Mesa软件框架以及重要数据结构分析

Mesa软件框架以及重要数据结构分析 引言 Mesa的实现比较复杂&#xff0c;其中还有许多的数据结构之间的关系逻辑还不是很清楚。感觉分析了又没有分析一样&#xff0c;这里我们再理一理&#xff01; 1.1 Mesa下EGL/GL核心数据结构和层级关系 MESA的核心数据结构很多很复杂&#…