【银河麒麟服务器操作系统】java进程oom现象分析及处理建议
了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区:https://product.kylinos.cn
现象描述
某服务器系统升级内核至4.19.90-25.22.v2101版本后仍会触发oom导致java进程被kill。
现象分析
oom现象分析
系统messages日志分析,故障时间2024.3.2 13:45左右,如图1:
图1
从下面的日志信息,可以看到java进程是在内核采用GFP_KERNEL|__GFP_COMP分配order=3也就是2的3次方,8个连续页的时候,系统无法提供对应大小的连续内存页,导致oom产生并选择java进程进行kill掉了。
现在来分析这一现像是否为正常现像(因为oom是内核的正常的机制),GFP_KERNEL的首先内存管理区为ZONE_NORMAL。从日志可以看出,当前系统一共有3个内存管理区,分别是ZONE_DMA、ZONE_DMA32和ZONE_NORMAL。接下来分析这个3个内存管理区的内存使用情况:
1)ZONE_DMA的空闲内存是15876kB , 最低水位是32k,低水位是44k, 高水位是56k, 空闲内存远大于高水位,所以kswapd是不会启动回收的,但是Linux内核有一个对低端内存管理区的保护机制,lowmem_reserve中有体现,加上保护机制,最低水位为:32K + 30759*4KB=123068KB,这个数据比空闲内存15876KB要大了,所以ZONE_DMA是不能分配成功的。
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126208] Mem-Info:
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126213] active_anon:1656544 inactive_anon:541287 isolated_anon:0#012 active_file:307018 inactive_file:548893 isolated_file:0#012 unevictable:0 dirty:136 writeback:0 unstable:0#012 slab_reclaimable:3601440 slab_unreclaimable:525232#012 mapped:39889 shmem:22418 pagetables:10064 bounce:0#012 free:124343 free_pcp:63 free_cma:0
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126215] Node 0 active_anon:6626176kB inactive_anon:2165148kB active_file:1228072kB inactive_file:2195572kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:159556kB dirty:544kB writeback:0kB shmem:89672kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 6649856kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126216] Node 0 DMA free:15876kB min:32kB low:44kB high:56kB active_anon:0kB inactive_anon:0kB active_file:0kB 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
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126218] lowmem_reserve[]: 0 2689 30759 30759 30759
2)ZONE_DMA32的空闲内存是160984kB , 最低水位是5904k,低水位是8656k, 高水位是11408k, 空闲内存远大于高水位,所以kswapd是不会启动回收的,但和DMA区域一样加上lowmem_reserve保护机制,最低水位为:5904K + 28069*4KB=128940KB。
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126220] Node 0 DMA32 free:160984kB min:5904kB low:8656kB high:11408kB active_anon:327188kB inactive_anon:52060kB active_file:9776kB inactive_file:17044kB unevictable:0kB writepending:0kB present:3128832kB managed:2801120kB mlocked:0kB kernel_stack:3488kB pagetables:1368kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126223] lowmem_reserve[]: 0 0 28069 28069 28069
单纯从空闲内存大小来看似乎可以从DMA32区域分配出java进程所需的内存,但我们实际查看ZONE_DMA32的内存分布,空闲的160984kb内存大多为低阶的内存页。最大只可提供16KB即order=2(2^2*4K=16K)的连续内存页,无法满足java进程order=3的连续内存页请求。
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126233] Node 0 DMA32: 15760*4kB (UME) 5137*8kB (UE) 3547*16kB (UE) 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 160888kB
3)最后ZONE Normal的空闲内存是320512kb, 最低水位是61640k,低水位是90380k, 高水位是119120k, 空闲内存高于高水位,所以kswapd是不会启动回收的。
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126224] Node 0 Normal free:320512kB min:61640kB low:90380kB high:119120kB active_anon:6298988kB inactive_anon:2113088kB active_file:1218296kB inactive_file:2178680kB unevictable:0kB writepending:544kB present:30408704kB managed:28750204kB mlocked:0kB kernel_stack:41728kB pagetables:38888kB bounce:0kB free_pcp:252kB local_pcp:0kB free_cma:0kB
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126227] lowmem_reserve[]: 0 0 0 0 0
但同ZONE_DMA32一样,当我们实际查看这320512kb空闲内存的内存详情时,我们发现它同样最大只可提供16KB即order=2(2^2*4K=16K)的连续内存页,无法满足java进程order=3的连续内存页请求。
Mar 22 13:45:18 wzhapp13 kernel: [6229155.126237] Node 0 Normal: 10802*4kB (UME) 20894*8kB (UE) 6979*16kB (UE) 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 322024kB
从以上信息来看,本次触发OOM的原因和之前类似,都是系统内存碎片化,空闲内存高于内存回收水位但无法提供进程申请的较大阶数的连续内存页。
但不同的是,之前x86服务器是由于内核bug导致managed统计错位,从而使得Normal区域的内存回收水位线较小,而升级内核则不存在这个bug。只是当前默认的67584KB min_free_kbytes和实际业务场景不太符合。
min_free_kbytes参数分析
从OOM日志来看java进程需要申请较大的连续内存,而当前内存水位线较低,触发OOM时ZONE Normal虽有320512kb空闲内存但都是零散的,这和内存水位线的大小有关。
vm.min_free_kbytes是一个Linux重要的内核参数,用于控制系统可用内存的最小空闲大小。它指定了内核应该保留的空闲内存页面的数量(以KB为单位),以便能够及时满足系统的需要。
当系统运行过程中需要更多的内存时,从空闲页面中分配内存是一种快速且高效的方式。vm.min_free_kbytes参数的存在是为了确保系统在处理高内存压力时仍然具有足够的可用内存提供给内核、驱动等关键应用使用,这部分预留内存用户态应用通常无法申请。
同时vm.min_free_kbytes的设置衍生出了不同的内存回收水位,默认的内存回收水位计算方式如下:
1、watermark[min] = min_free_kbytes
2、watermark[low] = watermark[min] * 5 / 4
3、watermark[high] = watermark[min] * 3 / 2
当系统剩余空闲内存大于 high水位时,表示此时系统内存足够,不会进行内存回收;当系统剩余空闲内存内存小于low水位 时,表示此时内存存在压力,会触发 kswapd 进行后台内存回收,直到 pages_high 为止;当系统剩余空闲内存内存小于 min 水位时,表示此时用户内存耗尽,会触发直接内存回收,进程被阻塞。若是直接内存回收等方式还是无法释放出应用所需申请的连续内存时,就将触发OOM,通过强制杀死其他占用大量内存的进程来释放内存。
min_free_kbytes设的越大,watermark的线越高,同时三个线之间的buffer量也相应会增加。这意味着会较早的启动kswapd进行回收,且每次都会回收上来较多的内存(直至watermark[high]才会停止),但这也会使得系统预留过多的空闲内存,从而在一定程度上降低了应用程序可使用的内存量。
min_free_kbytes设的过小,则会导致系统预留内存过小。这不仅会导致在内存压力较大,空闲内存不足时内核、驱动以及其他GFP-AOTOMIC这种不可等待的内存申请无法进行。由于每次内存回收都是到watermark[high]就停止了,较低的min_free_kbytes容易导致每次进行内存回收时都是回收的零散内存,而未回收大块的连续内存,从而引起系统内存碎片化。
总结
综上所述,本次触发OOM的原因和之前的情况较为类似,都是系统内存回收水位线较小、内存碎片化,空闲内存高于内存回收水位但无法提供进程申请的较大阶数的连续内存页。
但不同的是,之前x86服务器是由于内核bug导致managed统计错位,从而使得Normal区域的内存回收水位线较小。而升级内核后则不存在这个bug,只是当前默认的67584KB min_free_kbytes和实际业务场景不太符合。
对该问题,推荐修改watermark_scale_factor的值,调大min、low、high三条内存回收水位线的差距,使得系统在空闲内存不足时更早、更多地进行内存回收;之后对于内存碎片化的情况,我们建议可以在业务空闲时指定定时任务规整内存。
后续计划及建议
- 修改watermark_scale_factor的值来调大min、low、high三条内存回收水位线的差距,具体步骤如下。
打开sysctl.conf配置文件:vim /etc/sysctl.conf
在其中手动添加vm.watermark_scale_factor = XX (该值推荐设置为50-75)
完成修改后生效配置:sysctl -p
查询参数看是否修改完成:cat /proc/sys/vm/watermark_scale_factor 或 sysctl -a |grep watermark_scale_factor
- 对于内存碎片化的情况,如果系统内存高碎片化情况较为频繁,条件允许的情况下,我们建议在业务空闲时手动进行异步内存规整。
root用户执行echo 1 > /proc/sys/vm/compact_memory即可,若服务器业务较为规律,推荐挑选一天中的业务空闲时间直接写入定时任务执行。
相关文章:
【银河麒麟服务器操作系统】java进程oom现象分析及处理建议
了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区:https://product.kylinos.cn 现象描述 某服务器系统升级内核至4.19.90-25.22.v2101版本后仍会触发oom导致java进程被kill。 现象分析 oom现象分析 系统messages日志分析,故…...
Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)
文章目录 缓冲AOF 策略(append only file)AOF 的工作流程AOF 缓冲区策略AOF 的重写机制重写完的AOF文件为什么可以变小?AOF 重写流程 缓冲AOF 策略(append only file) AOF 的核心思路是 “实时备份“,只要我添加了新的数据或者更新了新的数据࿰…...
共享模型之无锁
一、问题提出 1.1 需求描述 有如下的需求,需要保证 account.withdraw() 取款方法的线程安全,代码如下: interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程…...
下载安装VSCode并添加插件作为仓颉编程入门编辑器
VSCode下载地址:下载 Visual Studio Code - Mac、Linux、Windows 插件下载:GitCode - 全球开发者的开源社区,开源代码托管平台 仓颉社区中下载解压 cangjie.vsix 插件 打开VSCode 按 Ctrl Shift X 弹出下图 按照上图步骤依次点击选中我们下…...
解决:Linux上SVN 1.12版本以上无法直接存储明文密码
问题:今天在Linux机器上安装了SVN,作为客户端使用,首次执行SVN相关操作,输入账号密码信息后,后面再执行SVN相关操作(比如"svn update")还是每次都需要输入密码。 回想以前在首次输入…...
Mongodb多键索引中索引边界的混合
学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…...
如何利用windows本机调用Linux服务器,以及如何调用jupyter界面远程操控
其实这篇文章没必要存在,教程太多了 参考博客(1 2 3),如侵删 奈何网上的大神总是会漏掉一些凡人遇到的小问题 (1) 建议下载PuTTy for windows,从而建立与远程服务器的SSH连接 需要确认目标服…...
如何定位Milvus性能瓶颈并优化
假设您拥有一台强大的计算机系统或一个应用,用于快速执行各种任务。但是,系统中有一个组件的速度跟不上其他部分,这个性能不佳的组件拉低了系统的整体性能,成为了整个系统的瓶颈。在软件领域中,瓶颈是指整个路径中吞吐…...
阿里云服务器 篇三:提交搜索引擎收录
文章目录 系列文章推荐:为网站注册域名判断网站是否已被搜索引擎收录主动提交搜索引擎收录未查询到收录结果时,根据提示进行提交网站提交网站时一般需要登录账号主动提交网站可缩短爬虫发现网站链接时间,但不保证一定能够收录所提交的网站百度提交地址360搜索提交地址搜狗提…...
powe bi界面认识及矩阵表基本操作 - 1
powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充:修改高度2.5 列宽:设置列的宽度…...
SpringBoot 项目 pom.xml 中 设置 Docker Maven 插件
在Spring Boot项目中,使用Docker Maven插件(通常是docker-maven-plugin或者fabric8io/docker-maven-plugin)来自动化构建Docker镜像并将其推送到远程仓库。 这里分别介绍这两种插件的基本配置,并说明如何设置远程仓库推送。 1、…...
k8s二次开发-kubebuiler一键式生成deployment,svc,ingress
一 Kubebuilder环境搭建 注:必须在当前的K8S集群有 nginx这个ingressclass rootk8s:~# kubectl get ingressclass NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx <none> 19h1.1 下载kubebuilder wget https://gi…...
Flutter 状态管理新境界:多Provider并行驱动UI
前言 在上一篇文章中,我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中,使用 Provider 管理多个不同的状态时,你可以为每个状态创建一个单独的 ChangeNotifierProvider…...
标识符和关键字的区别是什么,常用的关键字有哪些?自增自减运算符,移位运算符continue、break、return的区别是什么?
标识符和关键字的区别是什么,常用的关键字有哪些? 标识符标识符就是当我们给变量,方法,类命名时候的名字,而被赋予特殊含义的标识符就是关键字。例如生活中,当我们需要开一家店时候,我们不能将…...
在VS Code上搭建Vue项目教程(Vue-cli 脚手架)
1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理
AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…...
Docker 和 k8s 之间是什么关系?
Docker 简介 Docker 功能: Docker 是一款可以将程序和环境打包并运行的工具软件。通过 Docker,可以将程序及其依赖环境打包,确保在不同操作系统上一致的运行效果。 环境一致性问题: 程序依赖于特定的环境,不同操作系统…...
敲详细的springframework-amqp-rabbit源码解析
看源码时将RabbitMQ的springframework-amqp-rabbit和spring-rabbit的一套区分开,springboot是基于RabbitMQ的Java客户端建立了简便易用的框架。 springboot的框架下相对更多地使用消费者Consumer和监听器Listener的概念,这两个概念不注意区分容易混淆。…...
Telegram Bot、小程序开发(三)Mini Apps小程序
文章目录 一、Telegram Mini Apps小程序二、小程序启动方式三、小程序开发小程序调试模式初始化小程序Keyboard Button Mini Apps 键盘按钮小程序【依赖具体用户信息场景,推荐】**Inline Button Mini Apps内联按钮小程序**initData 的自动传递使用内联菜单时候哪些参数会默认传…...
Django F()函数
F()函数的作用 F()函数在Django中是一个非常强大的工具,主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作,而无需将数据加载到Python内存中。这不仅提高了性能,还允许你利用数据库的优化功能。 字段引用 在查询表达…...
GraphRAG的实践
好久没有体验新技术了,今天来玩一下GraphRAG 顾名思义,一种检索增强的方法,利用图谱来实现RAG 1.配置环境 conda create -n GraphRAG python3.11 conda activate GraphRAG pip install graphrag 2.构建GraphRAG mkdir -p ./ragtest/i…...
自动驾驶三维车道线检测系列—LATR: 3D Lane Detection from Monocular Images with Transformer
文章目录 1. 概述2. 背景介绍3. 方法3.1 整体结构3.2 车道感知查询生成器3.3 动态3D地面位置嵌入3.4 预测头和损失 4. 实验评测4.1 数据集和评估指标4.2 实验设置4.3 主要结果 5. 讨论和总结 1. 概述 3D 车道线检测是自动驾驶中的一个基础但具有挑战性的任务。最近的进展主要依…...
守护动物乐园:视频AI智能监管方案助力动物园安全与秩序管理
一、背景分析 近日,某大熊猫参观基地通报了4位游客在参观时,向大熊猫室外活动场内吐口水的不文明行为。这几位游客的行为违反了入园参观规定并可能对大熊猫造成严重危害,已经被该熊猫基地终身禁止再次进入参观。而在此前,另一熊猫…...
FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》
2024年7月16日,国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱,共涉及七大类别,127个细分领域。全面展现了网络安全产业的构成和重要组成部分,探…...
数据仓库事实表
数据仓库中的三种常见事实表类型:事务事实表、周期快照事实表和累积快照事实表 事务事实表: 事务事实表是记录事务级别数据的事实表。它记录了每个事务发生的具体度量指标,如销售金额、数量等。事务事实表的优势在于能够提供详细的事务级别…...
LeetCode题练习与总结:两数之和Ⅱ-输入有序数组--167
一、题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index…...
在 Java 中,怎样设计一个可扩展且易于维护的微服务架构?
在Java中设计一个可扩展且易于维护的微服务架构,可以考虑以下几个方面: 模块化设计:将应用拆分为多个小的、独立的模块,每个模块负责处理特定的业务逻辑。每个模块可以独立开发、测试和部署,增加或替换模块时不会影响其…...
零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习
今天开始带大家零基础入门鸿蒙开发,也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一,为什么要学习鸿蒙 1-1,鸿蒙介绍 1-2,为什么要学习鸿蒙 1-3,鸿蒙各个版本介绍 1-4࿰…...
Chromium CI/CD 之Jenkins实用指南2024-在Windows节点上创建任务(九)
1. 引言 在现代软件开发流程中,持续集成(CI)和持续交付(CD)已成为确保代码质量和加速发布周期的关键实践。Jenkins作为一款广泛应用的开源自动化服务器,通过其强大的插件生态系统和灵活的配置选项…...
ceph进程网卡绑定逻辑
main() //如osd进程,是ceph_osd.cc文件的main函数;mon进程,是ceph_mon.cc文件的main函数 -->pick_addresses() // 会读取"cluster_network_interface"和"public_network_interface"这两个配置项来过滤ip ---->fill…...
微网站的图标怎么做/seo优化推广教程
一、介绍Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系。它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;它扩展了数据库的使用范围,能够在不同的数据库用户之间实现…...
如何申请做网站编辑呢/西安seo服务外包
版权声明:本文为博主原创文章,转载请标明作者和原链接https://blog.csdn.net/qq_42239046/article/details/88683284当在ecplise中创建了一个web项目,一般都可以run server,如果不能那就是tomcat没有安装好或这版本有问题或者jdk的…...
js网站登录怎么做/qq群推广网站
Description 给你一个无向图,N(N<500)个顶点, M(M<5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”&a…...
甘肃建设厅职称查询官方网站/东莞网站制作公司联系方式
1. 常用的几个函数 If(条件){语句 } else if (条件){语句 } else {语句 } swtich(条件){case 1:语句break;default :语句break; } for(条件){语句 } while(条件){语句 } do{语句 }while(条件); 注意,这里有个分号 a:语句 goto a; 不推荐使用,可以…...
泉州专业网站建设哪家好/网站建设需要多少钱?
本发明涉及无线传感器网络领域,属于leach路由通信技术领域:。背景技术::物联网技术飞速发展,无线传感器网络(wirelesssensornetworks,wsn)也逐渐成为互联网研究领域的热门话题,主要包含汇聚节点…...
wordpress调用特色图/营销比较好的知名公司有哪些
"channels": [ "https://packagecontrol.io/channel_v3.json"], 无法连接的问题 网上说了挺多原因,简单例举一下: 1、IPV6的问题 2、无法打开网址https://packagecontrol.io/channel_v3.json导致访问不了 简单试一下都不行&#…...