当前位置: 首页 > news >正文

SAP BTP云上一个JVM与DB Connection纠缠的案例

图片

前言

最近在CF (Cloud Foundry) 云平台上遇到一个比较经典的案例。因为牵扯到JVM (app进程)与数据库连接两大块,稍有不慎,很容易引起不快。

在云环境下,有时候相互扯皮的事蛮多。如果是DB的问题,就会找DB相关部门。关键是如何自证。涉及到职场生存法则,大家都不愿意去背锅,谁背锅,意味着谁要担责。

下边我们看看这个案例。

现场

某一个微服务的Java应用,在部署到云环境下,大概过了几个小时以后,就频繁的宕掉,自动重启,一会儿又宕掉。DevOPS马上发警告邮件,并且给出了一些error message, 甚至相关的callstack也给出来了。

java.sql.SQLTransientConnectionException: HikariPool-******* - Connection is not available, request timed out after 5001ms.,  at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696),  at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197),  at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162),  at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:100),  at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122),  at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:38),  at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:108),  at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:138),  at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:276),  at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:284),  at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:246),  at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:83),  at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:164),  at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:421),  at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400),  at 

就这咋一看,就是connection用完了,拿不到连接了。DB相关人员开始就有点紧张了。难道是DB出问题了?

于是他们单独给DBOps那边开了个ticket,让DBOps直接上AWS PG实例里头查看,一顿查,发现数据库活的好好的呢,在那个时间段,连接数也都还正常。这样的话,他们肯定不会背这锅。

微服务这边,在得知这些结果以后,感觉就有些不太妙了。于是再重新再去查监控:

图片

总数确实也还在那里。单独针对那众目标微服务,再看看细化的情况:

图片

到这里,一看,200个连接瞬间被击垮。看到这里,基本上也就知道,与数据库大概率没什么关系了。应该是应用层出了什么故障了。

什么原因会导致数据库正常但是连接拿不到(不断超时、我们这里是默认5秒还拿不到连接,就算超时,app会自动重启)?

紧接着我们兵分两路:

1、再找到微服务对应的DynaTrace监控

有一个重大发现:

图片

死掉的那一段时间,JVM的Metaspace那一段200MB,全部耗光。但是因为没有CF平台上没有明显的OOM报错,反而容易骗过大家。

2、再细看一下平台那边的Kibana LOG相关细节:

虽然没有:OOM之类的错误提示,却发现有若干下边这样的log:

[33281.379s][error][jvmti] Posting Resource Exhausted event: Metaspace
[33281.379s][error][jvmti] Posting Resource Exhausted event: Metaspace
Resource exhaustion event....
.......

这两条就足以印证jvm的配置参数Metaspace的大小不够,导致最后的问题。

解决方法:将原来的200M调整到300M或250M,就彻底平息了这次事故。

总结:

有的时候,问题不是孤立存在的,从各个层面进行分析,逐个排错,最后还是能找到出问题的原因。如何规避此类事件再次发生,只能进一步加强监控。

以上例为例,因为缺乏对应用层DB Pool的监控预警,比如它很快涨到200,在那一会儿,应该直接就有预警。另一块,针对metaspace耗尽之前也缺乏预警。如果到了90%左右发出预警,那我们仍然有机会重新调整参数,再次部署,一样可以避免问题。

至于引起metaspace上涨的一个主要原因,是因为新部署的app, 增加了另外几个库(合计有几十兆),从而让类的元数据所需空间增加了不少。开发人员平时也很少关注这一块。加起来,刚好快到边界,又没到边界,随着动态类的加载,慢慢又涨了一点,最终导致超标。

关于jvm参数及高优,又是一个非常大的话题:

参考:

https://cloud.tencent.com/developer/article/1408827[1]

https://poonamparhar.github.io/understanding-metaspace-gc-logs[2]

What is Compressed Class Space?[3]

[How to Handle Java Lang OutOfMemoryError Exceptions[4]](https://sematext.com/blog/java-lang-outofmemoryerror/)

图片

上边这张图也能说明一下总的计算方法。Metaspace属于Non-heap的空间。也就是说,在计算总的开销时,它增加了,Java heap那部分就得减小。

JBP_CONFIG_SAP_MACHINE_JRE [memory_calculator_v2: {headroom: 5}]
JBP_CONFIG_SAP_MACHINE_JRE: [memory_calculator_v2: {stack_threads: 600, headroom: 5}]
JBP_CONFIG_JAVA_OPTS      [ java_opts: '-Xss512K -XX:ReservedCodeCacheSize=220M -XX:MaxMetaspaceSize=200M -XX:MaxDirectMemorySize=256M -XX:+DisableExplicitGC -XX:+UseG1GC ' ]
上边用的是SAP自己的JVM(使用OpenJDK结果也一样): SAP在给定4096M总的容器内存时:
4096 - 220 - 200 - 256 - 0.05 * 4096 - 0.5 * 250 = 3090.2 M = 3164364K当stack_threads调为600时,-Xmx2985164K
4096 - 220 - 200 - 256 - 0.05 * 4096 - 0.5 * 600 = 2915.2 M = 2985164K

围绕的公式就是:

MaxHeapSize = 总内存 - CodeCache - MetaspaceSize- DirectMemory - headroom/100 * 总内存 - Xss * Threadcount。(默认线程数是250)

headroom是预留给容器的本地内存的百分比。

这个公式通常也不见于官方文档,属于平台自己控制的。有了这个公式,就可以自己进行精准拿捏了。

还有一些jvm命令行,可以ssh到container内部执行,进行诊断,如:

1、jps -lvm

app/META-INF/.sap_java_buildpack/sap_machine_jre/bin/jps -lvm
1504 jdk.jcmd/sun.tools.jps.Jps -lvm -Dapplication.home=/home/vcap/app/META-INF/.sap_java_buildpack/sap_machine_jre -Xms8m -Djdk.module.main=jdk.jcmd
7 org.springframework.boot.loader.JarLauncher -Xmx2985164K -Xss512K -XX:ReservedCodeCacheSize=220M -XX:MaxMetaspaceSize=200M -XX:MaxDirectMemorySize=256M -XX:+DisableExplicitGC -XX:+UseG1GC -XX:-UseCompressedClassPointers -Djava.io.tmpdir=/home/vcap/tmp -Dlog4j2.formatMsgNoLookups=true -XX:+UseContainerCpuShares -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n,onjcmd=y -agentpath:META-INF/.sap_java_buildpack/jvm_kill/jvmkill-1.16.0.RELEASE-trusty.so=printHeapHistogram=1 -XX:ErrorFile= -Dsun.net.inetaddr.ttl=0 -Dsun.net.inetaddr.negative.ttl=0

2、jcmdVM.flags

vcap@ade456f6-f29d-4e37-7b99-0360:~$ app/META-INF/.sap_java_buildpack/sap_machine_jre/bin/jcmd 7 VM.flags
7:
-XX:CICompilerCount=2 -XX:ConcGCThreads=1 -XX:+DisableExplicitGC -XX:ErrorFile= -XX:G1ConcRefinementThreads=1 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=69206016 -XX:MarkStackSize=4194304 -XX:MaxDirectMemorySize=268435456 -XX:MaxHeapSize=3057647616 -XX:MaxMetaspaceSize=209715200 -XX:MaxNewSize=1833959424 -XX:MinHeapDeltaBytes=1048576 -XX:NonProfiledCodeHeapSize=0 -XX:ProfiledCodeHeapSize=0 -XX:ReservedCodeCacheSize=230686720 -XX:ThreadStackSize=512 -XX:-UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseContainerCpuShares -XX:+UseG1GC 

3、jcmdGC.heap_info

e456f6-f29d-4e37-7b99-0360:~$ app/META-INF/.sap_java_buildpack/sap_machine_jre/bin/jcmd 7 GC.heap_info
7:garbage-first heap   total 1166336K, used 204288K [0x0000000749c00000, 0x0000000800000000)region size 1024K, 113 young (115712K), 18 survivors (18432K)Metaspace       used 116011K, capacity 117599K, committed 117704K, reserved 118784K

在云环境下,PG的稳定性还是很牛气的。稳如老狗一点也不为过,除了表膨胀、空间肿胀等需要来加看管,很大一部分云平台都给你扛过去了。当然,常规的性能优化与调整也是必要的,应用层开发人员配合DBA,总能找到比较舒服的解决方案。

参考资料

[1]https://cloud.tencent.com/developer/article/1408827: https://cloud.tencent.com/developer/article/1408827

[2]https://poonamparhar.github.io/understanding-metaspace-gc-logs: https://poonamparhar.github.io/understanding-metaspace-gc-logs/

[3]What is Compressed Class Space?: https://stuefe.de/posts/metaspace/what-is-compressed-class-space/

[4][How to Handle Java Lang OutOfMemoryError Exceptions: https://sematext.com/blog/java-lang-outofmemoryerror/

图片

相关文章:

SAP BTP云上一个JVM与DB Connection纠缠的案例

前言 最近在CF (Cloud Foundry) 云平台上遇到一个比较经典的案例。因为牵扯到JVM (app进程)与数据库连接两大块,稍有不慎,很容易引起不快。 在云环境下,有时候相互扯皮的事蛮多。如果是DB的问题,就会找DB…...

Linux进程的基本概念

冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成 输入单元:包括键盘 , 鼠标&#xf…...

设计模式深度解析:AI如何影响装饰器模式与组合模式的选择与应用

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 AI如何影响装饰器模式与组合模式的选择与应用 在今天这个快速发展的技术时代&#…...

JAVA面试大全之微服务篇

目录 1、Spring Cloud 1.1、什么是微服务?谈谈你对微服务的理解? 1.2、什么是Spring Cloud? 1.3、springcloud中的组件有那些? 1.4、具体说说SpringCloud主要项目...

WiFiSpoof for Mac wifi地址修改工具

WiFiSpoof for Mac,一款专为Mac用户打造的网络隐私守护神器,让您在畅游互联网的同时,轻松保护个人信息安全。 软件下载:WiFiSpoof for Mac下载 在这个信息爆炸的时代,网络安全问题日益凸显。WiFiSpoof通过伪装MAC地址&…...

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…...

openGauss MySQL兼容性增强

MySQL兼容性增强 可获得性 本特性自openGauss 3.0.0版本开始引入。 特性简介 本特性主要从以下几方面增强openGauss与MySQL的兼容性(只列举部分典型语法,详情请参见《数据迁移指南》中“MySQL兼容性说明”章节):。 支持用户锁…...

【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍

系列文章目录 【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统介绍 【跟小嘉学 Linux 系统架构与开发】二、Linux发型版介绍与基础常用命令介绍 文章目录 系列文章目录[TOC](文章目录) 前言一、 Linux 发行版(Linux distribution)介绍二、Centos 虚拟机初始化…...

EMD关于信号的重建,心率提取

关于EMD的俩个假设: IMF 有两个假设条件: 在整个数据段内,极值点的个数和过零点的个数必须相等或相差最多不能超过一 个;在任意时刻,由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零&#x…...

HEVC的Profile和Level介绍

文章目录 HEVCProfile(配置):Level(级别):划分标准 HEVC HEVC(High Efficiency Video Coding),也称为H.265,是一种视频压缩标准,旨在提供比先前的…...

Springboot Thymeleaf 实现数据添加、修改、查询、删除

1、引言 在Spring Boot中使用Thymeleaf模板引擎实现数据的添加、修改、查询和删除功能,通常步骤如下: 在Controller类中,定义处理HTTP请求的方法。创建Thymeleaf模板来处理表单的显示和数据的绑定。 2、用户数据添加 1、 在Controller类中…...

关于 UnityEditorWindow

想要使用UnityEditorWindow作为调试窗口吗? 这样做可以很方便的针对游戏中的重要对象做调试。 但是有一个很不方便的地方,OnGUI 的刷新频率不高,或者说需要鼠标点击之后才会重绘,如何解决这一问题? 可以如下操作&am…...

小狐狸JSON-RPC:wallet_addEthereumChain(添加指定链)

wallet_addethereumchain(添加网络) var res await window.ethereum.request({"method": "wallet_addEthereumChain","params": [{"chainId": "0x64", // 链 ID (必填)"…...

Pandas | value_counts() 的详细用法

value_counts() 函数得作用 用来统计数据表中,指定列里有多少个不同的数据值,并计算每个不同值有在该列中的个数,同时还能根据指定得参数返回排序后结果。 返回得是Series对象 value_counts(values,sortTrue, ascendingFalse, normalizeFal…...

上岸美团了!

Hello,大家好,最近春招正在如火如荼,给大家分享一份美团的面经,作者是一份某双非的硕(只如初见668),刚刚通过了美团的3轮面试,已经拿到offer,以下是他的一些分享。 一面&…...

Gemma开源AI指南

近几个月来,谷歌推出了 Gemini 模型,在人工智能领域掀起了波澜。 现在,谷歌推出了 Gemma,再次引领创新潮流,这是向开源人工智能世界的一次变革性飞跃。 与前代产品不同,Gemma 是一款轻量级、小型模型&…...

LabVIEW智能家居安防系统

LabVIEW智能家居安防系统 随着科技的飞速发展和人们生活水平的不断提升,智能家居系统以其便利性和高效性,逐渐成为现代生活的新趋势。智能家居安防系统作为智能家居系统的重要组成部分,不仅能够提高家庭的安全性,还能为用户提供更…...

[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两相乘再相加的和,即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a 1 ⋅ a n a 2 ⋅ a 3 ⋯ a n − 2 ⋅ a n − 1 a n − 2 ⋅ a…...

【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环

目录 命名空间 命名空间的定义 命名空间的使用 输入输出 缺省参数 函数重载 引用 常引用 引用的使用场景 内联函数 auto 基于范围的for循环 命名空间 请看一段C语言的代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 10;int main…...

Docker + Nginx 安装

安装Docker 1.防火墙 2.yum源 3.安装基础软件 更新yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all #清除yum源缓存 yu…...

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…...

AI预测福彩3D第22弹【2024年3月31日预测--第5套算法开始计算第4次测试】

今天&#xff0c;咱们继续进行本套算法的测试&#xff0c;今天为第四次测试&#xff0c;仍旧是采用冷温热趋势结合AI模型进行预测。好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计算并进行权重赋值打分后&#xff0c;3…...

Django(二)-搭建第一个应用(1)

一、项目环境和结构 1、项目环境 2、项目结构 二、编写项目 1、创建模型 代码示例: import datetimefrom django.db import models from django.utils import timezone# Create your models here.class Question(models.Model):question_text models.CharField(max_length2…...

前端bugs

问题&#xff1a; Failed to load plugin typescript-eslint declared in package.json eslint-config-react-app#overrides[0]: Cannot find module eslint/package.json 解决&#xff1a; google了一晚上还得是chatgpt管用 运行以下命令【同时还要注意项目本身使用的Node版…...

MCGS学习——水位控制

要求 插入一个水罐&#xff0c;液位最大值为37插入一个滑动输入器&#xff0c;用来调节水罐水位&#xff0c;滑动输入器最大调节为液位最大值&#xff0c;并能清楚的显示出液位情况用仪表显示水位变化情况&#xff0c;仪表最大显示设置直观清楚方便读数&#xff0c;主划线为小…...

本地搭建多人协作ONLYOFFICE文档服务器并结合Cpolar内网穿透实现公网访问远程办公

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...

Ubuntu 中电子邮件处理工具

Ubuntu 中电子邮件处理工具的综述 在现代通信技术中&#xff0c;电子邮件系统是不可或缺的一部分。特别是在基于 Linux 的操作系统如 Ubuntu 中&#xff0c;有许多高效且可靠的电子邮件处理工具可供选择。除了众所周知的 Postfix&#xff0c;还有其他几个重要的选项&#xff0…...

java多线程——运用线程同步解决线程安全问题

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 线程安全 多线程可以同时进行操作&#xff0c;但如果是同时操作一个共享资源的时候&#xff0c;可能会出现业务安全问题。 示例&#xff1a; 小A和小B共用一个账户&#xff0c;如果小A和小B同时取…...

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件&#xff0c;专为Mac用户设计&#xff0c;旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能&#xff0c;可以精确显示每个网络连接的状态&#xff0c;让用户轻松掌握网络活动情况。 软件下载&#xff1a;Radio…...

全国青少年软件编程(Python)等级考试一级考试真题2023年9月——持续更新.....

青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 一、单选题(共25题,共50分) 1.下列 Python 语句能够正确输出"学而时习之"五个字的是?( )A.print “学而时习之” B.print “(学而时习之)” C.print (“学而时习之”) D.print (学而时习之) 标…...

域名怎么做网站/优化教程

原文&#xff1a;http://davidhhs.iteye.com/blog/2268888 功能优化&#xff0c;增加级联查询功能&#xff08;注&#xff1a;依赖Jquery.js&#xff0c;附有源代码&#xff0c;可以当作插件直接使用&#xff09; 级联查询下拉框组调用代码&#xff1a; bindCascadeAutoSelec…...

图文制作/seo网站推广方案策划书

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid3487 题目思路&#xff1a;splay,区间旋转和区间转移&#xff0c;区间转移的时候要注意向上更新&#xff0c;旋转的时候要注意rev要异或。 #include<stdio.h> #include<stdlib.h> #include<st…...

明年做哪个网站致富/网站建设合同模板

JPA系列&#xff08;一&#xff09;&#xff1a;Spring Jpa Specification 使用示例 JPA系列&#xff08;二&#xff09;&#xff1a;jpa的查询方法 Jpa系列&#xff08;三&#xff09;&#xff1a;SpringBoot Jpa 的表关系维护 JPA系列&#xff08;四&#xff09;&#xff…...

泰安网站建设哪家专业/怎样建立一个网络销售平台

上一篇博客我们讲了搭建集群和节点通信,这节课我们来讲一下如果节点出问题了,redis内部是如何来进行故障转移的 1.发现有问题的节点 上节课我们也提到了redis节点是怎么通信的"ping-pong",通信时附加了消息,消息除了槽信息,还有节点状态/节点故障等 解释: 节点a发…...

wordpress后台操作教程/昭通网站seo

今天看视频教程无意间看到了一个数3减1的问题&#xff0c;百度之发现叫约瑟夫环问题&#xff0c;于是写了程序&#xff0c;问题大致描述如下&#xff1a; 一群带有编号的孩子手拉手围成一个圈报数&#xff0c;开始的孩子数1&#xff0c;他右边数2&#xff0c;再右边数3&#xf…...

微信网站建设公司/网站项目开发流程

版权声明&#xff1a;以上文章中所选用的图片及文字来源于网络以及用户投稿&#xff0c;由于未联系到知识产权人或未发现有关知识产权的登记&#xff0c;如有知识产权人并不愿意我们使用&#xff0c;如果有侵权请立即联系&#xff1a;55525090qq.com&#xff0c;我们立即下架或…...