Redian新闻
>
云原生背景下如何配置JVM内存

云原生背景下如何配置JVM内存

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:crossoverJie

前段时间业务研发反馈说是他的应用内存使用率很高,导致频繁的重启,让我排查下是怎么回事;

在这之前我也没怎么在意过这个问题,正好这次排查分析的过程做一个记录。

首先我查看了监控面板里的 Pod 监控:

发现确实是快满了,而此时去查看应用的 JVM 占用情况却只有30%左右;说明并不是应用内存满了导致 JVM 的 OOM,而是 Pod 的内存满了,导致 Pod 的内存溢出,从而被 k8s 杀掉了。

k8s 为了维持应用的副本数量就得重启一个 Pod,所以看起来就是应用运行一段时间后就被重启。

而这个应用配置的是 JVM 8G,容器申请的内存是16G,所以 Pod 的内存占用看起来也就 50% 左右。

容器的原理

在解决这个问题之前还是先简单了解下容器的运行原理,因为在 k8s 中所有的应用都是运行在容器中的,而容器本质上也是运行在宿主机上的一个个经常而已。

但我们使用 Docker 的时候会感觉每个容器启动的应用之间互不干扰,从文件系统、网络、CPU、内存这些都能完全隔离开来,就像两个运行在不同的服务器中的应用。

其实这一点也不是啥黑科技,Linux 早就支持 2.6.x 的版本就已经支持 namespace 隔离了,使用 namespace 可以将两个进程完全隔离。

仅仅将资源隔离还不够,还需要限制对资源的使用,比如 CPU、内存、磁盘、带宽这些也得做限制;这点也可以使用 cgroups 进行配置。

它可以限制某个进程的资源,比如宿主机是 4 核 CPU,8G 内存,为了保护其他容器,必须给这个容器配置使用上限:1核 CPU,2G内存。

这张图就很清晰的表示了 namespacecgroups 在容器技术中的作用,简单来说就是:

  • namespace 负责隔离
  • cgroups 负责限制

在 k8s 中也有对应的提现:

  resources:
    requests:
      memory: 1024Mi
      cpu: 0.1
    limits:
      memory: 1024Mi
      cpu: 4

这个资源清单表示该应用至少需要为一个容器分配一个 0.1 核和 1024M 的资源,CPU 的最高上限为 4 个核心。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

不同的OOM

回到本次的问题,可以确认是容器发生了 OOM 从而导致被 k8s 重启,这也是我们配置 limits 的作用。

k8s 内存溢出导致容器退出会出现 exit code 137 的一个 event 日志。

因为该应用的 JVM 内存配置和容器的配置大小是一样的,都是8GB,但 Java 应用还有一些非 JVM 管理的内存,比如堆外内存之类的,这样很容易就导致容器内存大小超过了限制的 8G 了,也就导致了容器内存溢出。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

云原生背景的优化

因为这个应用本身使用的内存不多,所以建议将堆内存限制到 4GB,这样就避免了容器内存超限,从而解决了问题。

当然之后我们也会在应用配置栏里加上建议:推荐 JVM 的配置小于容器限制的 2/3,预留一些内存。

其实本质上还是开发模式没有转变过来,以传统的 Java 应用开发模式甚至都不会去了解容器的内存大小,因为以前大家的应用都是部署在一个内存较大的虚拟机上,所以感知不到容器内存的限制。

从而误以为将两者画了等号,这一点可能在 Java 应用中尤为明显,毕竟多了一个 JVM;甚至在老版本的 JDK 中如果没有设置堆内存大小,无法感知到容器的内存限制,从而自动生成的 Xmx 大于了容器的内存大小,以致于 OOM。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
超赞!16本阿里云内部爆款书籍,涵盖云原生核心技术栈!运维必看!美元霸权,天下苦之久也容器JVM内存配置最佳实践老牌网关 NGINX 的云原生新故事登渣甸山经济复苏背景下如何配置资产?400家机构论剑上海滩,这些机构及基金经理奏响最强音阿里终面:每天100w次登陆请求, 8G 内存该如何设置JVM参数?母亲说 六法学背景提升项目 | 香港城市大学国际法专题,低碳背景下全球经济等法律研究双非学生申请美研更有优势?招生官如何评估学生背景?首次披露3个哈佛学生背景,我悟了:美本申请一定会一年比一年惨烈……今年新增万亿债券投资!26万亿险资正如何配置?股票、基金额度稳步提升并发场景下如何保证数据操作的准确性?涉及数万人、历时三年,国内最大规模的云原生实践是如何打造出来的?云原生大起底,GOTC 2023 Cloud Native Summit来了云原生网关当道,三大主流厂商如何“竞技”?高质量发展背景下,经济学范式如何创新?哈佛和MIT同时录取学生背景首次披露,美本申请的深层规律……华为50W起薪招聘,云原生架构师凭什么这么香?哈佛公布新生背景:女生比男生多,1/4学生免费读哈佛,家里不花一分钱!无声的平台革命:eBPF 是如何从根本上改造云原生平台的InfoQ 2023 年趋势报告:事件驱动架构、深度学习和人工智能、云原生架构和容器化技术字节跳动开源ByConity:基于ClickHouse的存算分离架构云原生数仓toB 企业如何利用云原生做软件交付?Spring 干掉原生 JVM?!金融行业容器云建设与云原生技术思考 | 观点图解JVM内存模型及JAVA程序运行原理全量容器化:腾讯云日志服务CLS的云原生破局之道再接再厉一下中美战争背景下,如何打赢网络舆论战?工行发布“云原生”重磅研究,传统运维模式将面临重大挑战!深入浅出解析JVM中的SafepointDapr和Rainbond集成,实现云原生BaaS和模块化微服务开发“回到希腊去!”,也叫文艺复兴。“非秦汉文不读”,也叫古文运动。“不读或少读中国书”,也叫五四新文化运动。在赵谦书札中找字样,找程序员神器VS Code再提速,将内置JS减小20%!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。