【银河麒麟】高可用触发服务器异常重启,处理机制详解

news2024/9/9 4:07:22

1.服务器环境以及配置

【机型】物理机

处理器:

Intel

内存:

126G

【内核版本】

4.19.90-25.16.v2101.ky10.x86_64

【银河麒麟操作系统镜像版本】

Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619

Kylin-HA-10-SP2-Release-Shenzhen-Metro-Build01-20220620-x86_64

【第三方软件】

传统售票业务软件、互联网售票业务软件,k8s

2.问题现象描述

近期站点存在站点频繁重启问题,分析查看日志,查看高可用心跳link频繁存在up \down问题,触发fence导致重启。临时调整了token值,但是目前效果不明显,软件厂家表示各厂家占用内存不高,不是导致oom问题的原因。

3.问题分析

通过收集的2套,近期出现过HA集群服务器被fence的系统sosreport日志,可知,主机ZP1403SV01在2024.04.10 09:35:37和主机ZP1417SV02在2024.04.01 11:40:39左右,被fence,发生过系统重启。如图1和图2:

图1

图2

   分析主机ZP1417SV02系统日志,可知,系统在2024.04.01 11:40:39左右,系统被fence重启之前,有检测到corosync检测心跳状态服务,有4秒超时响应的日志信息输出,“Token has not been received in 4634 ms”,如图3:

图3

进一步分析主机ZP1417SV02系统日志,可以看到,在corosync服务报出检测心跳超时的同时,也有很多k8s服务相关进程被oom-killer的日志信息输出,报出的堆栈信息基本一致。分析其中一个,堆栈报错。可知,elastic-operato进程,在申请内存的时候,显示内核进入到mem_cgroup_out_of_memory这个路径后,分配不到内存,导致oom产生选择elastic-operato进程kill掉,如图4和图5:

图4

图5

由此oom-killer报错信息,联想到,有一个已知系统内核bug,对于银河麒麟操作系统V10 SP1/SP2低版本内核内存水位线计算不准确,会频繁OOM这一问题。

进一步,分别查看分析,4台系统节点的Zone Normal的内存水位线。查看/proc/zoneinfo,发现这4台主机节点ZP1403SV01、ZP1403SV02、ZP1417SV01和ZP1417SV02,Node 0和Node1,zone Movable显示不正常,spanned ,present为0,但是managed 很大。正常应spanned=present=managed=0,或者spanned>present>managed。如图6至图9:

图6 ZP1403SV01

图7 ZP1403SV02

图8 ZP1417SV01

图9 ZP1417SV02

对于银河麒麟V10 SP1/SP2低版本内核内存水位线计算不准确,会频繁OOM这一问题,为已知bug。该bug是由于openeuler内核(麒麟内核基于openeuler内核开发)在优化内存时引入了一个bug(commit eb761d6521c32c006a4987260394a61c6684fb35: mm: parallelize deferred struct page initialization within each node),其会导致内存zone的managed_pages统计出现错位。

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

公告链接地址:KYBA-202212-1011 - 国产操作系统、麒麟操作系统——麒麟软件官方网站

4.此内核bug的分析说明

1)内核bug对水位线计算错误的原理以及是否影响所有内存区

本次BUG引发的原因是内核代码引入了不严谨的代码,在计算zone中管理的page的数量可能出现错位。

打个比方系统有3个zone,其管page数量分别如下:

1号zone 10个,page 2号zone是100个,page 3号zone是100000个page。而系统在计算水位是依据各个zone的page数量来计算, page数量越多,水位越高,如果page数据统计错误,比如3号zone的page数量算成了100,将导致3号zone的水位严重偏低 。

接着我们从问题patch代码的出错行来看看问题发生的原因: 

 WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone)); VM_BUG_ON(nr_init != nr_free); zone->managed_pages += nr_free;

问题代码如上所示,这里本意是要统计zone中managed_pages的数量,将其加上nr_free,但是前面的WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone));有可能将zone进行自加,将要统计的nr_free统计到下一个zone上面去了, 比如要统计的1号zone上面的,结果++zone后变成2号zone了,出现统计错位,这有可能会影向所有的zone的统计 。

2)水位线计算错误是否必定出现

对于不同机型,不一定必定出现,对于同一机型只要一台出问题,则其它的都有问题。

接着上一节的代码继续说明,产生这种现象的原因如下: 因为要出现统计错位,则必需要运行++zone这个代码才行, WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone)); 如果++zid < MAX_NR_ZONES为假,则后面的++zone不会运行,也就不会出现问题,反之则出现问题。

3)高版本内核是否一定能完全解决内存水位计算异常

高版本内核一定能完全解决这个内存水位计算异常问题,因为这个bug非常明确,如上所说,只需把++zone这个操作放在zone->manage_pages += nr_free后面即可。

当前内核修改完成的代码如下:

zone->managed_pages += nr_free; /* Sanity check that the next zone really is unpopulated */

WARN_ON(++zid < MAX_NR_ZONES && populated_zone(++zone)); //++zone后,后面的代码没有出现引用

zone pr_info("node %d initialised, %lu pages in %ums\n", nid, nr_free, jiffies_to_msecs(jiffies - start)); pgdat_init_report_one_done(); return 0; } 

4)managed不为0,spanned,present都为0与bug的关系

这个问题出现的原因也是如第一条问题的答复,内核在统计zone中managed_pages的数量时可能会出现zone进行自加,将要统计的nr_free统计到下一个zone上面。

而Linux系统并非所有node、zone都管理着内存,比如通常zone Movable、zone Device默认都不管理内存;一些开启了numa的机器在非node 0的节点上可能也只有一个zone管理着内存。这是要是触发了上述bug,就会将上一个zone的managed统计到这个spanned presend managed本该都为0的zone上。这时就会产生managed不为0,spanned,present都为0的现象。

5.问题分析结果

结合,之前出现过此问题的现象研发侧的分析情况,可知,空闲内存过小,在业务突然繁忙时大量的page cache会消耗掉free memory,容易导致corosync延迟处理。有可能,会导致心跳检测超时,触发fence。

对于银河麒麟V10 SP1/SP2低版本内核内存水位线计算不准确,会频繁OOM这一问题,会产生的影响有,机器长时间运行后都有概率出现,内存水位太低,长时间运行后碎片化严重,机器使用久了,所有申请大块内存的都会有问题。导致正常的内存申请,都有问题,从而可能会影响HA集群心跳监控服务corosync服务,延迟处理心跳事件,有风险触发fence动作,系统重启。

6.后续计划与建议

建议,升级银河麒麟V10-SP2-x86服务器系统的内核,到4.19.90-25.22.v2101.ky10.x86_64版本及其以上,运行观察一段时间。

外网源内核下载地址:

Index of /NS/V10/V10SP2/os/adv/lic/updates/x86_64/Packages/

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

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

相关文章

前端vue3 根据某些Id 筛选数据

现在有一些不等的数据 我需要通过前端 吧这个数据筛选一下 比如我使用一些 我需要的ID 下的数据 比如以上的数据 的 cinemaLineId 来筛选 const cinemaLineId ref(["1246429254713147392", "1182608813770321920", "1182608917403185152"])…

大数据之Hadoop部署

文章目录 服务器规划服务器环境准备1. 网络测试2. 安装额外软件包3. 安装基础工具4. 关闭防火墙5. 创建用户并配置权限6. 创建目录并设置权限7. 卸载JDK8. 修改主机名9. 配置hosts文件10. 重启服务器 配置免密登录安装Java安装Hadoop1. Hadoop部署2. 配置Hadoop3. 格式化Hadoop…

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&a…

机器人控制系列教程之URDF文件语法介绍

前两期推文&#xff1a;机器人控制系列教程之动力学建模(1)、机器人控制系列教程之动力学建模(2)&#xff0c;我们主要从数学的角度介绍了机器人的动力学建模的方式&#xff0c;随着机器人技术的不断发展&#xff0c;机器人建模成为了机器人系统设计中的一项关键任务。URDF&…

我只有一点Python基础,对学习WebGIS开发有帮助吗?

经常有人后台私信问&#xff0c;我只有一点Python基础&#xff0c;对学习GIS开发有帮助吗&#xff1f; 关于这个问题的答案是&#xff0c;当然有&#xff01;Python适用于WebGIS开发。WebGIS是地理信息系统&#xff08;GIS&#xff09;技术与Web技术的结合&#xff0c;而Pytho…

Go语言学习:每日一练2

Go语言学习&#xff1a;每日一练2 目录 Go语言学习&#xff1a;每日一练2结构体零值数组切片映射指针 各个类型的零值一览 结构体 //定义 type Vertex struct {X, Y int } //使用 func main() { v1 : Vertex{1, 2} fmt.Println(v.X) //别的实例化方式 var v2 Vertex v2 : *new…

《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》

期刊&#xff1a;CVPR 年份&#xff1a;2023 代码&#xff1a;https://github.com/XuJiacong/PIDNet 摘要 双分支网络架构已经证明了它在实时语义分割任务中的有效性和有效性。然而&#xff0c;高分辨率细节和低频上下文的直接融合的缺点是细节特征很容易被周围的上下文信息…

Nuxt3 的生命周期和钩子函数(三)

title: Nuxt3 的生命周期和钩子函数&#xff08;三&#xff09; date: 2024/6/27 updated: 2024/6/27 author: cmdragon excerpt: 摘要&#xff1a;概述了Nuxt3的关键生命周期钩子用途&#xff0c;如page:finish用于页面加载后处理&#xff0c;page:transition:finish处理过…

MySQL数据库简介和安装

文章目录 一、数据库原理目前情况数据库的发展史RDBMS关系型数据库关系型数据库理论 二、MySQL历史发展历程关系型数据库和非关系型数据库 三、安装mysql及优化yum安装编译安装mysql二进制安装优化操作 四、 安装mycli插件客户端工具 一、数据库原理 目前情况 我们正处于一个…

十三、Maven(1)

&#x1f33b;&#x1f33b;目录 一、maven价绍二、maven的功能1、项目自动化构建2、管理jar、war包3、实现项目结构设计 三、maven安装1、maven的安装环境需要jdk2、Maven的安装路径中不能出现中文和空格3、压缩包解压即可4、配置环境变量 四、maven的仓库1. Maven仓库配置2. …

AI提示词投喂新手教程(一):基础概念和工具

对于很多已经熟悉提示词工程&#xff08;prompt engineering&#xff09;的朋友来说&#xff0c;以下内容可能已经是老生常谈了。然而&#xff0c;仔细搜索和翻阅了星球上关于提示词的新手教程&#xff0c;发现对新手并不是很友好&#xff0c;内容零散且缺乏系统性。为此&#…

Construct公司 从 0 到 1 基于 Kitex+Istio 的微服务系统建设

本文根据 2024 年 5 月 25 日在上海举办的“云原生✖️AI 时代的微服务架构与技术实践”CloudWeGo 技术沙龙上海站活动中&#xff0c;Construct 服务端总监 Jason 的演讲《从 0 到 1 基于 Kitex Istio 的微服务系统建设》整理而来。 在微服务架构的浪潮中&#xff0c;企业面临…

Android 通知组

一. 通知组简介 从 Android 7.0&#xff08;API 级别 24&#xff09;开始&#xff0c;您可以在一个组中显示相关通知。如下所示: 图 1. 收起&#xff08;顶部&#xff09;和展开&#xff08;底部&#xff09;的通知组。 注意 &#xff1a;如果应用发出 4 条或更多条通知且未…

【笔记】HashMap的头插死循环问题

HashMap头插死循环是指在JDK1.7中&#xff0c;多线程环境下&#xff0c;HashMap进行扩容时由于多个线程一起执行扩容&#xff0c;可能会导致某一结点被错误插入头部并形成一个循环链表。 发生死循环的源码如下&#xff1a; // hashmap由数组链表构成 void transfer(Entry[] ne…

【Micro-ROS学习】

Micro-ROS 是专为 ROS 2 设计的&#xff0c;它允许在微控制器&#xff08;microcontrollers&#xff09;上实现ROS 2的功能。Micro-ROS 从 ROS 2 架构优化而来&#xff0c;目的是让那些资源有限的嵌入式设备也能够接入ROS 2生态系统&#xff0c;享受ROS 2带来的标准化通信、模块…

放烟花短视频素材去哪里找?去哪里下载?烟花素材网分享

在当代社会&#xff0c;短视频凭借其独有的魅力成为大众传递情感、记录生活、分享快乐的新兴方式。特别是在庆祝节日和特殊时刻时&#xff0c;烟花的绚丽效果常常被用来吸引观众的目光&#xff0c;成为视频作品中的亮点。然而&#xff0c;对于短视频制作者来说&#xff0c;寻找…

【Web3】Web3.js 启动!并解决Web3 is not a constructor报错

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 本节教大家如何启动Web3.js 目录 Web3 启动&#xff01; 于是很愉快的报错 创建实例&#xff01; 出来了 Web3&#xff1a;模块…

【工程实践】MQ中rebalance机制

问题起因&#xff0c;有些分区积压严重&#xff0c;有些分区又是空闲。之前了解过rebalance机制&#xff0c;想知道在这种情况下rebalance机制为什么不触发&#xff0c;从而将积压的数据匀给空闲的分区。 问了gpt&#xff0c;“mq的rebalance功能能否保证每个分区在同一时间段…

小型智能驱鸟器,建筑驱鸟专用

随着城市化进程的加快&#xff0c;鸟类与人类的居住空间逐渐交织重合&#xff0c;鸟类对建筑物的侵扰问题也愈发凸显。家庭庭院、住宅窗前、屋顶&#xff0c;甚至那些承载着历史与文化底蕴的名胜古迹和精美雕像&#xff0c;都时常受到鸟粪的污染。鸟粪具有腐蚀性且很难清理&…

【C++】STL-priority_queue

目录 1、priority_queue的使用 2、实现没有仿函数的优先级队列 3、实现有仿函数的优先级队列 3.1 仿函数 3.2 真正的优先级队列 1、priority_queue的使用 priority_queue是优先级队列&#xff0c;是一个容器适配器&#xff0c;不满足先进先出的特点&#xff0c;而是优先级高…