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

news2024/5/17 22:14:13

e4cae288c66f4bada215f8ad6f029d5f.png

image.png

背景

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

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

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

3687282e5fd376cf24cdb7f080a4552a.png

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

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


93ee3769788fd2ccdc5fa1aa1f98473a.png

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

容器的原理

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

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

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

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

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

60439303c329d458e420c04b61b573ec.png

image.png

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

  • namespace 负责隔离

  • cgroups 负责限制

在 k8s 中也有对应的提现:

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

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

不同的OOM

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

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

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

云原生背景的优化

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

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

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

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

16be7d856cea2ca1379b14294269a08b.jpeg

从源码彻底理解 Prometheus/VictoriaMetrics 中的 relabel/metric_configs 配置

02a6ff713e34628553eefec4c9a7a98c.jpeg

通过 Pulsar 源码彻底解决重复消费问题

a29440e228cde2b453cf7bdaa98433ed.jpeg

一个诡异的 Pulsar InterruptedException 异常

0e6c223d1c4b861d0331df44c86decc6.jpeg

Pulsar负载均衡原理及优化

  

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

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

相关文章

指令的运行原理及Linux权限解读

目录 一. 指令的运行原理 二. Linux下的用户 2.1 Linux的用户分类 2.2 用户之间的切换 三. 文件权限的概念 3.1 文件类型 3.2 文件的权限 3.3 ls -l 打印文件全部信息的解读 四. 权限的修改 五. 拥有者和所属组的修改 六. 起始权限问题和权限掩码umask 七. 目录文件…

ArcGIS之克里金插值教学

本文来自:GIS科研实验室 基本概念 1.什么是克里金插值? 克里金插值又称空间局部插值法,是以半变异函数理论和结构分析为基础,在有限区域内对区域化变量进行无偏最优估计的一种方法,是地统计学的主要内容之一。南非矿产…

【消息中间件】RocketMQ消息重复消费场景及解决办法

文章目录 前言那么在什么情况下会发生RocketMQ的消息重复消费呢?消息重复消费的场景大概可以分为生产者端重复消费和消费者端重复消费,那么如何来解决消息的重复消费呢?既然在生产者做幂等性的方案都不是特别靠谱,那就再在消费者端…

信创办公–基于WPS的EXCEL最佳实践系列 (宏的录制)

信创办公–基于WPS的EXCEL最佳实践系列 (宏的录制) 目录 应用背景操作步骤1、宏的录制启用2、宏的使用3、宏的保存4、宏的禁用 应用背景 宏是一个自动化完成重复性工作的工具,使用宏可以提高我们的工作效率,那应该怎样使用宏这一…

日志与时间戳,客户端与服务器端,打包压缩解压解包介绍,date,cal,zip,unzip,tar指令等

日志与时间戳 计算机世界里面,时间其实很重要的,首先我们需要有日志这个概念,这个日志其实就跟日记一样,那么在日记里面的话就会有时间。时间真的非常关键,比方在出现问题的时候去找到这个问题出现的时间点&#xff0…

EEPROM读写测试实验(主要记录IIC通信协议)

一、简介 EEPROM,电可擦除可编程只读存储器,是一个非易失性的存储器件。RAM: 随机访问存储器,可读也可写,断电不保存数据,常用的RAM有ddr3、SDRAM。ROM仅支持读,不可写,但断电可以保…

4 通道3.2GSPS(或者配置成2 通道6.4GSPS)采样率的12 位AD 采集FMC+子卡模块

板卡概述 FMC_XM134 是一款4 通道3.2GSPS(或者配置成2 通道6.4GSPS)采样率的12 位AD 采集FMC子卡模块,该板卡为FMC标准,符合VITA57.4 规范,可以作为一个理想的IO 模块耦合至FPGA 前端,射频模拟信号数字化后…

外网远程访问公司内网用友畅捷通T财务软件 - 远程办公

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求;全面支持企业对远程仓库、异地办事处的管理需求;全面满足企业财务业务一体化管理需求。企业一般将其…

老胡的周刊(第090期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 privateGPT[2] 为保证数据私密性&#xff0c…

antd——实现不分页的表格前端排序功能——基础积累

最近在写后台管理系统时,遇到一个需求,就是给表格中的某些字段添加排序功能。注意该表格是不分页的,因此排序可以只通过前端处理。 如下图所示: 在antd官网上是有关于表格排序的功能的。 对某一列数据进行排序,通过…

字符串运算公式:muParser公式库在linux平台使用

muParser是一个跨平台的公式解析库,它可以自定义多参数函数,自定义常量、变量及一元前缀、后缀操作符,二元操作符等,它将公式编译成字节码,所以计算起来非常快。 1 、muParser源码下载 官方网址http://sourceforge.net/projects/muparser/ gitee下载地址:Gitee 极速下…

使用国产chatglm推理自己的数据文件_闻达

最近大火的chatgpt,老板说让我看看能不能用自己的数据,回答专业一些,所以做了一些调研,最近用这个倒是成功推理了自己的数据,模型也开源了,之后有机会也训练一下自己的数据。 使用国产chatglm推理自己的数…

【C++】引用重新赋值?

(点击上方公众号,可快速关注) 前段时间解决了一个关于引用的bug,原因是引用“重新赋值”造成的,原来的代码逻辑关于队列的选择,为了凸显问题,这里使用一个简单的例子重写。示例代码如下&#xf…

第七章 TensorFlow实现卷积神经网络

7.2TensorFlow实现简单的CNN import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data from tensorflow.python.framework import ops ops.reset_default_graph()# 创建计算图 sess tf.Ses…

SpringBoot及其配置文件

目录 1.SpringBoot简介 2.第一个SpringBoot项目 3.SpringBoot配置文件 3.1 配置文件介绍 3.2 properties配置文件 3.2.1 properties配置文件——写 3.2.2 properties配置文件——读 3.2.3 properties配置文件——缺点 3.3 yml配置文件 3.3.2 yml配置文件——初阶写 …

RocketMQ入门

文章目录 一. 基本概念1. 概述2. 基本概念3. RocketMQ的特性4. 整体架构 二. RocketMQ整体流程1. 流程图2. 流程介绍 一. 基本概念 1. 概述 RocketMQ 是阿里巴巴在 2012 年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于 2017 年 9 月…

【数据结构】--- 几分钟走进栈和队列(详解-下)

文章目录 前言🌟一、队列的概念及结构:🌟二、队列实现的两种方式:🌟三、队列的实现:🌏3.1队列结构:🌏3.2初始化:🌏3.3释放(类似单链表)&#xff1…

八股文!这么背!

作者:阿秀 校招八股文学习网站:https://interviewguide.cn 这是阿秀的第「267」篇原创 小伙伴们大家好,我是阿秀。 不知道什么时候八股文这个说法开始流传出去了,以前是没有这个说法的,我印象中就是近三五年流传开来的…

大模型激战正酣,王坚能否带领阿里云王者归来?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 5月11日,有消息称,十年前卸任阿里云总裁的王坚,将于近日以全新职位,全职加入阿里云。公开资料显示,作为阿里云创始人,王坚在2009年创办阿里云&#xff…

Go 的 IO 流怎么并发

今天聊一个存储的实现细节,数据副本的并发写入。 存储的高可靠性和高可用,必须依赖于数据的冗余机制。比如 3 副本就是把用户数据复制成 3 份。然后把 3 份数据分发到不同的地方。这个写下去的动作是有讲究的,因为肯定不希望时延线性增加&am…