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

news2025/1/16 7:43:42

以下来自本人拉的一个关于 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://www.coloradmin.cn/o/1617883.html

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

相关文章

前端开发攻略---封装日历calendar组件(纯手搓),可以根据您的需求任意改变,可玩性强

1、演示 2、代码 <template><div class"box" v-if"startMonth.year"><div class"left"><div class"top"><span class"iconfont" click"changeMonth(-1)">左</span><span&…

JTAG访问xilinx FPGA的IDCODE

之前调试过xilinx的XVC&#xff08;Xilinx virtual cable&#xff09;&#xff0c;突然看到有人搞wifi-JTAG&#xff08;感兴趣可以参考https://github.com/kholia/xvc-esp8266&#xff09;&#xff0c;也挺有趣的。就突然想了解一下JTAG是如何运作的&#xff0c;例如器件识别&…

关于开设RT-DETR专栏及更新内容的一些说明

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

jsp实验10 JavaBean

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握javabean的用法。【参考课本 上机实验 5.5.1 】 三、源代码以及执行结果截图&#xff1a; 源代码&#xff1a; Fraction.java package sea.water; public class Fraction { public double numbe…

【北京迅为】《iTOP-3588开发板系统编程手册》-第19章 V4L2摄像头应用编程

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

Skill Check: Build an LLM Application using OCI Generative AI Service

Skill Check: Build an LLM Application using OCI Generative AI Service

数据清洗:异常值检测方法

异常值检测方法总结 一、基于分布1、3σ原则2、Z_score方法3、boxplot一、基于分布 1、3σ原则 3σ原则又称为拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常…

贪心算法练习day.1

理论基础 贪心算法是一种常见的解决优化问题的方法&#xff0c;其基本思想就是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部的最优决策&#xff0c;以此得到全局的最优解&#xff0c;例如在十张面额不同的钞票&#xff0c;让我们…

ctfshow 每周大挑战RCE极限挑战

讨厌SQl看到这个了想来玩玩 rce1 <?phperror_reporting(0); highlight_file(__FILE__);$code $_POST[code];$code str_replace("(","括号",$code);$code str_replace(".","点",$code);eval($code);?>括号过滤点过滤&…

查找算法之分块查找

目录 前言一、查找算法预备知识二、分块查找三、总结3.1 查找性能3.2 适用场景3.3 优缺点 前言 查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中&#xff0c;查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。…

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

家用洗地机哪款好用?盘点618值得买的洗地机品牌

对于工作忙碌或家里养了宠物的很多朋友来说&#xff0c;洗地机它集合吸尘清扫湿拖的功能&#xff0c;很大程度上解放了家庭清洁劳动的繁琐&#xff0c;让人们腾出更多的时间休息&#xff0c;那么&#xff0c;市场上有很多牌子的洗地机&#xff0c;价格也各不相同&#xff0c;那…

HarmonyOS应用性能分析工具CPU Profiler的使用指南

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法&#xff0c;该工具为开发者提供性能采样分析手段&#xff0c;可在不插桩情况下获取调用栈上各层函数的执行时间&#xff0c;并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

前言 泛型是一种编程概念&#xff0c;它允许我们编写可以适用于多种数据类型的代码。通过使用泛型&#xff0c;我们可以在编译时期将具体的数据类型作为参数传递给代码&#xff0c;从而实现代码的复用和灵活性。 在传统的编程中&#xff0c;我们通常需要为不同的数据类型编写不…

web项目运行时,报了500错误(HTTP Status 500 – Internal Server Error)

web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09; 文章目录 web项目运行时&#xff0c;报了500错误&#xff08;HTTP Status 500 – Internal Server Error&#xff09;前言一、 解决方法&#xff1a;Project Structure…

视频监控/视频集中存储/云存储EasyCVR视频汇聚平台如何切换主子码流?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

赛氪网凭借教育人优势,荣获中关村高新技术企业协会会员单位称号

2023年&#xff0c;中关村科技园区管理委员会正式公布了一批新的高新技术企业协会会员单位名单&#xff0c;赛氪网荣幸成为其中一员。这一荣誉的获得&#xff0c;不仅是对赛氪网在竞赛、科技创新教育领域的充分肯定&#xff0c;也标志着赛氪网在推动高新技术发展方面迈出了坚实…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

CorelDRAW Graphics Suite 2023最新官网中文版本CDR2022免费激活下载

CorelDRAW Graphics Suite 2023最新中文版本免费激活下载作为一款矢量图形制作工具软件&#xff0c;专门为从事插画设计、广告设计、网页设计、图形编辑等设计行业推出的工具软件。界面也是非常的简洁&#xff0c;能够让用户更快了解其中的各个功能&#xff0c;功能方法一目了然…

增强现实(AR)技术的应用场景

增强现实&#xff08;AR&#xff09;技术将虚拟信息与现实世界融合&#xff0c;为用户提供更加直观、交互式的体验。AR技术具有广泛的应用前景&#xff0c;可以应用于各行各业。以下是一些AR的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…