【银河麒麟服务器操作系统】java进程oom现象分析及处理建议

news2024/9/21 14:45:43

了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区: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即可,若服务器业务较为规律,推荐挑选一天中的业务空闲时间直接写入定时任务执行。

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

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

相关文章

pikachu之暴力破解

1基于表单的暴力破解 随便输入然后抓包 选中添加账号密码 添加分别添加payload1,2,的字典 开始攻击 2验证码绕过on server 和基于表单的暴力破解相比,多了一个验证码功能 这个验证码是前端的验证码(和前面那个一样选中添加账号密码…

计算机网络入门 -- 常用网络协议

计算机网络入门 – 常用网络协议 1.分类 1.1 模型回顾 计算机网络细分可以划为七层模型,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而上三层可以划为应用层中。 1.2 分类 1.2.1 应用层 为用户的应用进程提供网络通信服务&#xff0…

第一百七十三节 Java IO教程 - Java缓冲区读写

Java IO教程 - Java缓冲区读写 缓冲区读取 有两种方法从缓冲区读取数据: 绝对位置相对位置 使用四个版本重载的get()方法用于从缓冲区读取数据。 get(int index)返回给定索引处的数据。 get()从缓冲区中的当前位置返回数据,并将位置增加1。 get(byte [] dest…

vmware配置centos+配置静态ip联网+更换镜像

centos7配置参考【实战】VMware17虚拟机以及Centos7详细安装教程-CSDN博客 ip配置步骤: 先更改编辑虚拟网络编辑器中的内容 就按照还原默认设置来,设定后就是以上内容,然后一定要记住子网ip和子网掩码 接下来就是NAT设置: 网关…

Spring Boot集成SFTP快速入门Demo

1.什么是SFTP? SFTP(SSH File Transfer Protocol,也称 Secret File Transfer Protocol),是一种基于SSH(安全外壳)的安全的文件传输协议。使用SFTP协议可以在文件传输过程中提供一种安全的加密算…

ABAP打印WORD的解决方案

客户要求按照固定格式输出到WORD模板中,目前OLE和DOI研究了均不太适合用于这种需求。 cl_docx_document类可以将WORD转化为XML文件,利用替换字符串方法将文档内容进行填充同 时不破坏WORD现有格式。 首先需要将WORD的单元格用各种预定义的字符进行填充…

Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)

文章目录 缓冲AOF 策略(append only file)AOF 的工作流程AOF 缓冲区策略AOF 的重写机制重写完的AOF文件为什么可以变小?AOF 重写流程 缓冲AOF 策略(append only file) AOF 的核心思路是 “实时备份“,只要我添加了新的数据或者更新了新的数据&#xff0…

价格较低,功能最强?OpenAI 推出 GPT-4o mini,一个更小、更便宜的人工智能模型

OpenAI美东时间周四推出“GPT-4o mini”,入局“小而精”AI模型竞争,称这款新模型是“功能最强、成本偏低的模型”,计划今后整合图像、视频、音频到这个模型中。 OpenAI表示,GPT-4o mini 相较于 OpenAI 目前最先进的 AI 模型更加便…

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》

2024年7月16日,国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱,共涉及七大类别,127个细分领域。全面展现了网络安全产业的构成和重要组成部分,探…

微软发布iOS/安卓正式版Designer应用,AI修图功能助力创意设计

一、Microsoft Designer应用正式上线 AITOP100平台获悉,微软一直致力于为用户提供优质的创意工具,此次推出的Microsoft Designer应用正是其在移动端的重要布局。这款应用已正式上线iOS、Android、Windows和网页版本,满足不同用户的需求。微软…

Stable Diffusion 使用详解(2)---- 图生图原理,操作,参数

目录 背景 图生图原理 基本原理 1. 扩散模型基础 2. 图生图的具体流程 3. 关键技术点 4. 应用实例 CLIP 原理 1.基本概念 2. 核心特点 使用及参数 随机种子 重绘幅度 图像宽高 采样方法 1. DPM(扩散概率模型) 2. SDE(随机微…

大语言模型-检索测评指标

1. MRR (Mean Reciprocal Rank)平均倒数排名: 衡量检索结果排序质量的指标。 计算方式: 对于每个查询,计算被正确检索的文档的最高排名的倒数的平均值,再对所有查询的平均值取均值。 意义: 衡量…

ChatTTS超强的真人AI语音助手下载使用教程

简介 ChatTTS是专门为对话场景设计的文本转语音模型,支持多人同时对话,适用的场景非常丰富,比如LLM助手对话任务,视频配音、声音克隆等。同时支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练&#xf…

【Android】 dp与sp,加冕为王

目录 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 基础知识: ppi pt DPI 的定义和重要性 Android 中的 DPI 级别 px dp(Density Independent Pixels) sp(Scale-independent Pixels) 安卓的dp/dip、sp 虚拟…

设置浏览器网页全屏

在日常笔记本上办公时,由于屏幕较小,为了尽可能多和方便的显示浏览器网页上的内容,可以设置网页全屏的方式,去掉屏幕顶端的网址栏和底端栏,具体设置如下: 以Edge浏览器和Google Chrome浏览器为例&#xff…

如何免费用java c#实现手机在网状态查询

今天分享手机在网状态查询接口,该接口适用的场景非常广泛!首先我们先讲下什么是手机在网状态?简单来说,就是你得手机号是否还在正常使用中,是否能够及时接收和回复信息,是否能够随时接听和拨打电话。如果你…

通过libx246 libfaac转换推送RTMP音视频直播流

一、RTMP简介及rtmplib库: RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后,则A中所有成员函数都成为类B的友元函数了 (2)代码实战:友元类的定义和使用友元类是单向的 (3)友元类是单向的,代码实战验证 互为友元类 (1)2个类可以互为友元类,代码实战…

相同IP地址仿真测试

相同IP地址仿真测试 背景与挑战解决方案技术优势功能特点 背景与挑战 在汽车电子领域,电子控制单元(ECU)的测试是确保其功能性和可靠性的关键步骤。然而,当测试场景涉及多个配置相同IP地址的ECU时,传统的测试方法面临…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新(4月5号)才过去了3个月,Google Play又迎来了一次大更新,不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…