关于Pod的内存使用率一直很高的问题分析

生产环境中在流量高峰期出现pod内存使用率很高,pod批量重启,错误日志中还有OOM相关信息。

查看堆内存的使用值

Pod使用的内存不能直接在pod中通过top命令查看,这种方式看到的是pod所在node的资源使用情况。想查看pod的资源使用情况需要用kubectl top pod xxx命令。但这也只能看到pod的内存使用。

那如何查看jvm的堆内存使用呢?

通过kubectl exec -it pod-name /bin/bash 连接到pod内部的shell,然后执行jmap,jstat等命令来查看JVM堆内存情况。
如果接入了Prometheus,则可以通过

sum(jvm_memory_used_bytes{pod="$pod", area="heap"})
sum(jvm_memory_committed_bytes{pod="$pod", area="heap"})
sum(jvm_memory_max_bytes{pod="$pod", area="heap"})

这几项指标来查看当前正在使用,已申请的和最大的堆内存大小。

通过查看指标发现堆内存很小,大约为pod内存的1/4,这是一个很小值,显然是不合理的。

pod中堆内存参数

在应用容器化之前,应用部署在物理机器上,通常会通过-Xms-Xmx来设置堆的最小值和最大值。但出现容器化之后,通过这种静态值来设置堆内存大小就不合适了,因为pod的内存大小是可设置的,不像物理机一样是固定的。

因此,JDK8U191为了适配docker容器新增了几个参数,分别是:
MaxRAMPercentage,InitialRAMPercentageMinRAMPercentage,同时将InitialRAMFraction,MaxRAMFractionMinRAMFraction标记为deprecated状态。

比较违反直觉的是,MinRAMPercentage并不是最小堆内存的意思,而是当实际内存小于96m的时候,用于计算最大堆内存,也就是说,最大堆内存计算方式如下:

phys_mem * MinRAMPercentage / 100  (if this value is less than 96M)
MAX(phys_mem * MaxRAMPercentage / 100, 96M)

通常情况下实际内存不可能小于96m,忽略MinRAMPercentage即可。那实际生效的就是初始化大小比例和最大比例两个参数生效。这两个参数的默认是多少呢?

我们进入pod,运行命令

java -XX:+PrintFlagsFinal -version | grep RAMPercentage

可以看到结果如下:

double InitialRAMPercentage                      = 1.562500                                 
double MaxRAMPercentage                          = 25.000000                            
double MinRAMPercentage                          = 50.000000

最大堆内存为实际内存的25%,这也是为什么在生产环境中使用的堆内存始终只有pod内存的1/4。

因为堆内存太小,当流量高峰出现时OOM就可以理解了。但还是无法解释pod内存使用率很高的问题(堆外内存应该占用不了多少内存)。

参数优化

分析了OOM原因之后,添加了两个参数:

-XX:InitialRAMPercentage=25
-XX:MaxRAMPercentage=70

同时也将pod内存从1.5G调大到了2G。

重新部署之后服务正常,不再出现pod重启。每个pod的堆内存使用在1个G左右,而不是原来300多M。
优化后,理论上每个pod的最大堆内存可使用至1.4G,是够用的。

但是pod内存使用率还是保持高位,从而导致根据pod设置的hpa扩缩容策略失效,只会扩容,不会缩容。

直接给出原因:JVM在流量高峰期使用了较高的内存,随后该内存一直由JVM管理,并不会归还给操作系统

这似乎有点难以理解,在我之前的认知里面,通过垃圾回收器回收的内存应该要归还给操作系统,但其实不是这样的。实际上,JVM向操作系统申请内存是有代价的,如果每次gc后将内存归还,然后用到的时候再申请,这将极大损耗JVM的性能。

因此默认情况下,JVM是不会在短时间内主动归还未使用的内存的。当然,具体的机制取决于JDK的版本和垃圾回收器。明确的官方说明我并没有从google上搜索到,但有一点是可以确认的,OpenJDK遵循这一原则1,并且在OpenJDK12版本中引入了一个新功能:鼓励G1垃圾回收器自动将未使用的内存归还给操作系统。如下所示:
在这里插入图片描述

如何降低pod的内存使用率

JVM中有两个参数,分别是MinHeapFreeRatioMaxHeapFreeRatio,含义是允许JVM保留的最小和最大的未使用内存比率,默认值分别是40和70。其中MaxHeapFreeRatio 在OpenJDK11之后的版本中被废弃。但有一些其他参数可以控制堆空间的收缩行为:

  • -XX:MinHeapFreeRatio:该参数用于设置最小堆空闲空间比例的阈值。当堆空间的空闲空间低于该阈值时,JVM会尝试扩展堆空间以提供更多空闲空间,在G1中不生效。
  • -XX:GCTimeRatio:该参数用于设置垃圾收集时间与应用程序执行时间的比率。较高的值将导致JVM更积极地回收内存并进行堆空间的收缩。在G1中不生效。
  • -XX:AdaptiveSizePolicy:该参数启用自适应堆大小调整策略,JVM将根据应用程序的行为动态调整堆大小。这可以包括堆空间的扩展和收缩。

但即使发生堆收缩,未使用的内存是否会归还给操作系统,还是取决于具体的JVM和垃圾回收器。除非进行显式的System.gc()的调用。

最终未找到合适的将JVM内存归还给操作系统的方法,因此只能去掉了HPA中memory的策略,只保留CPU策略。

参考资料

[1].https://docs.openshift.com/container-platform/4.8/nodes/clusters/nodes-cluster-resource-configure.html#nodes-cluster-resource-configure-jdk-unused_nodes-cluster-resource-configure:~:text=to%20be%20calculated.-,Understanding%20how%20to%20encourage%20the%20JVM%20to%20release%20unused%20memory%20to%20the%20operating%20system,-By%20default%2C%20the
å

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

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

相关文章

SEO的优化教程(百度SEO的介绍和优化)

百度SEO关键字介绍: 百度SEO关键字是指用户在搜索引擎上输入的词语,是搜索引擎了解网站内容和相关性的重要因素。百度SEO关键字可以分为短尾词、中尾词和长尾词,其中长尾词更具有针对性和精准性,更易于获得高质量的流量。蘑菇号-…

【Matplotlib画图】使用Python Matplotlib画三维的子图

文章目录 1. 代码2. 画图效果写在最后 1. 代码 在matlab转过来,之前一直不知道python的写法,以为是像matlab一样返回一个句柄然后在上面添加元素; 其实是应该先创建一个画布,然后再在上面添加子图,然后再使用返回的句…

解决 MyBatis-Plus 中增加修改时,对应时间的更新问题

问题:在添加修改时,对应的 create_time 与 insert_time 不会随着添加修改而自动的更新时间 第一步:首先在对应的属性上,加上以下注解 如果只添加以下注解,在增加或者修改时,可能对应的 LocalDateTime 会出…

基于微信小程序的公交信息在线查询系统小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

支付宝支付模块开发

生成二维码 使用Hutool工具类生成二维码 引入对应的依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.5</version> </dependency><dependency><groupId>com.go…

数码产品数码配件无线键盘等出口欧盟CE-RED认证测试办理

数码产品数码配件无线键盘CE-RED认证测试办理 无线产品CE-RED认证进入东欧市场规定&#xff1a; 在通信终端设备和无线产品在这些/地区合法销售之前&#xff0c;必须按照 RED 指令进行测试&#xff0c;并且还必须提供 CE 标志。无线远程控制产品必须符合 RED 指令的 REDEU 要…

华为云HECS云服务器docker环境下安装nginx

前提&#xff1a;有一台华为云服务器。 华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…

JS对象数组去重

JS对象数组去重 一、数组去重1.使用 new Set()2.使用 indexOf 去重3.使用 includes 去重4.使用 hasOwnProperty5.使用 filter6.使用递归7.利用 Map 数据结构去重8.使用用 reduce includes9.使用 new Set() 的简化 二、对象数组去重1.使用 new Map() 和 filter2.使用reduce3.使…

【JVM】第四篇 垃圾收集器ParNewCMS底层三色标记算法详解

导航 一. 垃圾收集算法详解1. 分代收集算法2. 标记-复制算法3. 标记-清除算法4. 标记-整理算法二. 垃圾收集器详解1. Serial收集器2. Parallel Scavenge收集器3. ParNew收集器4. CMS收集器三. 垃圾收集底层三色标记算法实现原理1. 垃圾收集底层使用三色标记算法的原因?2. 垃圾…

计算机竞赛 深度学习图像分类算法研究与实现 - 卷积神经网络图像分类

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客 1.安装显卡驱动 步骤1&#xff1a;安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2&#xff1a;查询显卡版本 lspci | grep VGA 找到2230号码&#xff0c;进入如下网…

Swift data范围截取问题

文章目录 一、截取字符串的几种方法1. 截取前几位2. 截取后几位3. subData4. 下标截取 二、subData(in:) 报错 EXC_BREAKPOINT 一、截取字符串的几种方法 1. 截取前几位 mobileID.prefix(32)2. 截取后几位 mobileID.suffix(3)3. subData data.subdata(in: 0..<4)4. 下标…

大学生登记国家证书软件著作权提升就业资质

大学生登记国家证书软件著作权提升就业资质 随着信息技术的快速发展&#xff0c;软件行业成为了许多大学生就业的热门选择之一。然而&#xff0c;在竞争激烈的就业市场中&#xff0c;除了掌握专业知识和技能外&#xff0c;如何提升自己的就业资质也显得尤为重要。其中&#xff…

postman接口测试系列: 时间戳和加密

在使用postman进行接口测试的时候&#xff0c;对于有些接口字段需要时间戳加密&#xff0c;这个时候我们就遇到2个问题&#xff0c;其一是接口中的时间戳如何得到&#xff1f;其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢&#xff1f; 下面我们以一个具体的…

selenium不定位元素直接使用键盘操作(如弹框操作)

今天在使用selenium进行定位时&#xff0c;发现直接定位不了chrome的弹框&#xff0c;如这种弹框&#xff1a; 使用的是下面这行代码 driver.switch_to.alert.accept() 运行报错&#xff0c;说是没有 alert windown。。。。 啊&#xff1f;难道chrome的弹框不是用alert写的&…

冲刺十五届蓝桥杯P0001阶乘求和

文章目录 题目描述思路分析代码解析 题目描述 思路分析 阶乘是蓝桥杯中常考的知识。 首先我们需要知道 int 和long的最大值是多少。 我们可以知道19的阶乘就已经超过了long的最大值&#xff0c;所以让我们直接计算202320232023&#xff01;的阶乘是不现实的。 所以我们需要…

WhatsOnChain中的sCrypt合约验证插件

我们很高兴地宣布在 WhatsOnChain 上集成了 sCrypt 智能合约验证插件。该插件允许任何人为已部署的智能合约提交和验证 sCrypt 代码。 智能合约验证 在与智能合约交互之前&#xff0c;用户需要确保智能合约按照其声称的方式行事。理论上&#xff0c;每个人都可以查看合约并验…

链表oj题2(Leetcode)(牛客)——合并两个有序链表;判断回文链表;链表分割

链表oj题2&#xff08;Leetcode&#xff09;&#xff08;牛客&#xff09; 一&#xff0c;合并两个有序链表1.1分析2.2代码 二&#xff0c;链表的回文结构2.1分析2.2代码 三&#xff0c;链表分割3.1分析3.2代码 四&#xff0c;小结 一&#xff0c;合并两个有序链表 合并两个有…

苹果曾考虑基于定位控制AirPods Pro自适应音频

在一次最近的采访中&#xff0c;苹果公司的高管Ron Huang和Eric Treski透露&#xff0c;他们在开发AirPods Pro自适应音频功能时&#xff0c;曾考虑使用GPS信号来控制音频级别。这个有趣的细节打破了我们对AirPods Pro的固有认知&#xff0c;让我们对苹果的创新思维有了更深的…

趣解设计模式之《小王的糖果售卖机》

〇、小故事 小王最近一直在寻找商机&#xff0c;他发现商场儿童乐园或者中小学校周围&#xff0c;会有很多小朋友喜欢吃糖果&#xff0c;那么他想设计一款糖果售卖机&#xff0c;让后将这些糖果售卖机布置到商场和学校旁边&#xff0c;这样就能获得源源不断的收益了。 想到这里…