2024-4-22 群讨论:微服务启动预热相关

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号:hashcon,私信进群拉你

Hotspot JVM 进程启动后,流量到来的时候 JIT 吃掉很多 CPU,如何观察到?

很多途径都能观察到:

  1. top -Hp:这个需要一直 dump 并保存在另一个地方,有可能采集不到需要的时间点,看的不明显。但是大部分情况能看出趋势。
  2. 通过 JFR 的事件看到:这个是 JVM 自带的机制,可以通过 Thread CPU Load 看出来,这个和 top -Hp 的原理差不多,也有可能采集不到需要的时间点,看的不明显。但是大部分情况能看出趋势。
  3. 通过 safepoint 日志可以看出:我们知道进入 safepoint 对于 JVM 是一个非常有消耗的事情(GC 中的 Stop-the-world 阶段就是要所有应用线程暂停进入安全点),JIT 的频繁大量编译也会触发全局安全点。

我们看一下 JFR 中的事件(截图由 @吃泡面的女娲 https://space.bilibili.com/395445925 提供,感谢):

420741c69e67a15bd24b47032a874664.jpeg

通过 -Xlog:safepoint=debug:file=${LOG_PATH}/safepoint%t.log:utctime,level,tags:filecount=10,filesize=10M 这个参数观察 safepoint 日志,可以看到流量第一次到达的时候,有大量的 ICBufferFull 这种 JIT 相关:

[2022-06-20T07:13:22.518+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 505901458 ns, Reaching safepoint: 203535 ns, At safepoint: 15007 ns, Total: 218542 ns 

[2022-06-20T07:13:22.745+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 226749494 ns, Reaching safepoint: 229619 ns, At safepoint: 11684 ns, Total: 241303 ns 

[2022-06-20T07:13:22.938+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 192997437 ns, Reaching safepoint: 207982 ns, At safepoint: 12948 ns, Total: 220930 ns 

[2022-06-20T07:13:23.126+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 187535899 ns, Reaching safepoint: 300756 ns, At safepoint: 14449 ns, Total: 315205 ns 

[2022-06-20T07:13:23.247+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 120311192 ns, Reaching safepoint: 249434 ns, At safepoint: 14875 ns, Total: 264309 ns 

[2022-06-20T07:13:23.340+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 92724282 ns, Reaching safepoint: 232015 ns, At safepoint: 12110 ns, Total: 244125 ns 

[2022-06-20T07:13:23.411+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 70987313 ns, Reaching safepoint: 211428 ns, At safepoint: 13071 ns, Total: 224499 ns 

[2022-06-20T07:13:23.635+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 223611196 ns, Reaching safepoint: 254973 ns, At safepoint: 18280 ns, Total: 273253 ns 

[2022-06-20T07:13:23.749+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 114334671 ns, Reaching safepoint: 222406 ns, At safepoint: 13293 ns, Total: 235699 ns

[2022-06-20T07:13:23.770+0000][info ][safepoint] Safepoint "ICBufferFull", Time since last: 20734555 ns, Reaching safepoint: 226780 ns, At safepoint: 15401 ns, Total: 242181 ns 

CPU Usage 与 Throttling

对于因为 CPU 出现的性能瓶颈,通过 CPU Usage 可能看不出来:CPU Usage 的实现,只能看平均值,最短周期是 1s,瞬时流量看不出来。这个只能通过 CPU Throttling 看出来。

举个比较极端的例子来说明这两个指标:比如两个线程,每个执行,每个都需要占满 CPU 跑 200ms,只有一个 CPU,不考虑 Linux 线程抢断式切换以及调度算法
从 CPU Usage 看,就是 40%(200+200)/1000
从 CPU Throttling 看,这时候 CPU 限流发生了 200ms,就是一个线程等了 200ms。

再举一个微服务的例子,这个微服务在高峰的时候,已经有瓶颈,接口开始超过 1s,通过 CPU Usage 看,问题不大,但是其实从 CPU Throttling 看打,已经比较高了:

CPU Usage
1df8d430bdde25ea8b05b2e294da7818.jpeg
CPU Throttling
221fbd91b037891f329613b65829d40f.jpeg

如何观察到 CPU Throtlling?

  1. 通过 JFR 的事件看到:JFR 的事件包含 CPU Throttling。
  2. JFR 底层也是通过看 /proc 下对应进程的信息知道的:cat /sys/fs/cgroup/cpu,cpuacct/cpu.stat
    • nr_periods:经历的 cgroup 周期数
    • nr_throttled:进程所有线程发生 CPU 限流的次数
    • throttled_time:进程所有线程被限流的时间(ns)

微服务预热

我们主要做了3件事:

  1. 启动的时候预热微服务之后再注册:初始化链接池,线程池,然后,多线程本地调用 health 接口 50001 次(超过各种 jit 编译界限),之后 health 接口中的 Readiness 才会就绪,才会注册到注册中心( https://zhuanlan.zhihu.com/p/452533097 )
  2. 针对 JVM:使用 CDS 加速类加载(我们的微服务发布之后,10 分钟后,dump APPCDS,用于下次启动新实例) Graal JIT 替换 C2。对于无存储 io 的微服务,使用 CRaC(同理,也是微服务发布之后,10 分钟后,dump APPCDS,用于下次启动新实例)
  3. 客户端,调用的时候,检查实例注册时间,使用 beta 函数,减少调用到新实例的比例,最大 3 分钟。

个人简介:个人业余研究了 AI LLM 微调与 RAG,目前成果是微调了三个模型:

  1. 一个模型是基于 whisper 模型的微调,使用我原来做的精翻的视频按照语句段落切分的片段,并尝试按照方言类别,以及技术类别分别尝试微调的成果。用于视频字幕识别。
  2. 一个模型是基于 Mistral Large 的模型的微调,识别提取视频课件的片段,辅以实际的课件文字进行识别微调。用于识别课件的片段。
  3. 最后一个模型是基于 Claude 3 的模型微调,使用我之前制作的翻译字幕,与 AWS、Go 社区、CNCF 生态里面的官方英文文档以及中文文档作为语料,按照内容段交叉拆分,进行微调,用于字幕翻译。

目前,准确率已经非常高了。大家如果有想要我制作的视频,欢迎关注留言。

本人也是开源代码爱好者,贡献过很多项目的源码(Mycat 和 Java JFRUnit 的核心贡献者,贡献过 OpenJDK,Spring,Spring Cloud,Apache Bookkeeper,Apache RocketMQ,Ribbon,Lettuce、 SocketIO、Langchain4j 等项目 ),同时也是深度技术迷,编写过很多硬核的原理分析系列(JVM)。本人也有一个 Java 技术交流群,感兴趣的欢迎关注。

另外,一如即往的是,全网的所有收益,都会捐赠给希望工程,坚持靠爱与兴趣发电。

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

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

相关文章

MTK6775/MT6775/曦力P70联发科处理器性能参数资料

联发科MT6775(曦力P70)芯片搭载强大的Arm Cortex-A73/A53八核CPU,并采用台积电12纳米FinFET制程工艺,相较于其他14纳米级别产品,功耗节省达到了15%。此外,曦力P70还配备了高效能的Arm Mali-G72 GPU,相比上一代产品曦力…

Java——继承与组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段。 继承表示对象之间是is-a的关系,比如:狗是动物,猫是动…

YOLOv9训练结果分析->mAP、Precision、Recall、FPS、Confienc、混淆矩阵分析

简介 这篇博客,主要给大家讲解我们在训练yolov9时生成的结果文件中各个图片及其中指标的含义,帮助大家更深入的理解,以及我们在评估模型时和发表论文时主要关注的参数有那些。本文通过举例训练过程中的某一时间的结果来帮助大家理解&#xf…

动态规划——切割钢条问题

一、动态规划 动态规划算法通常用于解决最优化问题(寻求最优解)。其思想与分治法类似,将待求解的问题分成若干个子问题,先求出子问题,再根据子问题的解求出原来问题中的解,与分支法不同的是,在动…

【勒索病毒恢复】.svh勒索病毒介绍及恢复方案

一、.[[backupwaifu.club]].svh勒索病毒介绍 svh勒索病毒是一种恶意软件,它通过加密受害者的文件并要求支付赎金来解锁,从而达到勒索的目的。这种病毒已经存在了数年,并且不断演变,形成了多种不同的家族和变种。如果您的数据承载着…

Bentley二次开发教程02-开发环境搭建

1 Bentley 平台介绍 图 1 Bentley 平台介绍 Bentley 软件大致可分为四大平台,分别为用于设计的 Microstation 平台,用于协同的 ProjectWise 平台,用于对资产进行全生命周期管理的 AssetWise 平台和数据互联互通的 数字孪生平台 iTwin。 1.1 …

CyclicBarrier(循环屏障)源码解读与使用

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 什么是CyclicBarrier? 3. CyclicBarrier与CountDownL…

潜力与限制:低代码开发平台优缺点全面分析

低代码开发平台作为一种创新技术工具,正以其快速开发、低门槛参与和灵活定制等特性,重塑企业数字化转型之路。然而,任何技术都有其两面性,低代码平台也不例外。本文将深入探讨低代码开发平台的优缺点,并为您推荐值得信…

git常见命令(成长版)

ps:所谓成长版就是后续可能还会添加命令: 1.删除本地分支: git branch -d 分支名 2.拉取代码后默认master分支,切换到线上其他分支: (1)查看线上所有分支: git branch -a &#…

排序算法:顺序查找

简介 顺序查找(也称为线性查找)是一种简单直观的搜索算法。按照顺序逐个比较列表或数组中的元素,直到找到目标元素或搜索完整个列表。 应用场景 数据集比较小,无需使用复杂的算法。数据集没有排序,不能使用二分查找…

数栈+AI:数栈V6.2创新发布,让数据开发更智能

近日,以“DataAI,构建新质生产力”为主题的袋鼠云春季发布会圆满落幕,大会带来了一系列“AI”的数字化产品与最新行业沉淀,旨在将数据与AI紧密结合,打破传统的生产力边界,赋能企业实现更高质量、更高效率的…

C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

文章目录 前言一、指针 - 整数二、指针 - 指针三、指针的关系运算四、指针和数组五、二级指针六、指针数组指针数组可以将几个一维数组模拟成二维数组 总结 前言 C语言指针整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几…

【C++】---STL之vector的模拟实现

【C】---STL之vector的模拟实现 一、vector在源码中的结构:二、vector类的实现:1、vector的构造2、析构3、拷贝构造4、赋值运算符重载5、迭代器6、operator[ ]7、size()8、capacity()9、reserve()10、resize()11、empty()12、push_back()13、pop_back()1…

基于JAVA的机场航班起降与协调管理系统

毕业设计(论文)任务书 第1页 毕业设计(论文)题目: 基于JAVA的机场航班起降与协调管理系统 毕业设计(论文)要求及原始数据(资料): 1.综述机场航班调…

JRebel热部署SpringBoot+MyBatis-Plus实现不重启更新修改后MyBatis的XML文件

安装JRebel热部署插件 《JRebel插件安装教程》 《JRebel mybatisPlus extension下载Zip离线安装》 在线安装JRebel mybatisPlus extension 插件商店直接搜JRebel mybatisPlus extension pom.xml 引入依赖 <dependency><groupId>com.baomidou</groupId>…

裤裤带你一起学C语言内存函数啦!

目录 1.memcpy的使用和模拟实现 2.memmove使用和模拟实现 3.memset函数的使用 4.memcmp函数的使用 内存函数在<string.h>库中&#xff0c;我们使用内存函数必须先引入<string.h>头文件 1.memcpy的使用和模拟实现 memcpy的函数原型如下&#xff1a; void * m…

大模型热潮下,AI数据集的重要性及发展现状

2023年3月14日&#xff0c;OpenAI发布了多模态大模型的最新版本GPT-4&#xff1a;文生视频大模型Sora&#xff0c;Sora通过采用更大规模的数据集进行训练,其推理能力超过了ChatGPT&#xff0c;已成为目前最成功、最受欢迎的大模型。 Sora的出现&#xff0c;打破了人们对AI技术…

sketchup{su}安装错误1402

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展&#xff0c;输入1402&#xff0c;点击搜索 等待修复成功既可尝试重新安装su 软件每周六选择其他方式登录免费使用

SCP收容物091~100

注 &#xff1a;此文接SCP收容物081~090,本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-091 scp-092 scp-093 scp-094 scp-095…

RF高频腔设计(7)

3.11 高阶模 之前我们说过&#xff0c;由于束流负载或者其它的原因会在RF高频腔中激发出很多模式&#xff0c;这些模式可能会对束流的稳定性造成不利的影响&#xff0c;尤其是腔的 R / Q ∗ Q L R/Q*Q_L R/Q∗QL​很高时。 为了解决这个问题&#xff0c;需要使用HOM阻尼器来抑…