编程技术分享平台

网站首页 > 技术教程 正文

高并发场景下JVM调优实践

xnh888 2024-11-24 00:19:26 技术教程 30 ℃ 0 评论

一、应用性能问题分析方法论

1.1 性能优化的终极目标是什么?

用户体验 = 产品设计(非技术) + 系统性能 ≈ 系统性能 = 快?

快是一种什么样的体验?1.2 快是一种什么样的体验?

3秒【不能更久了】

网站SEO排名

怎么让系统快起来呢?1.3 应用性能调优是个大工程

  • Web端:首屏时间、白屏时间、可交互时间、完全加载时间...
  • 移动端:端到端响应时间、Crash率、内存使用率、FPS...
  • 后端:RT、TPS、并发数…

? TPS和RT的影响因素:

1. 数据库读写、RPC、网络IO、逻辑计算复杂度、缓存

2. JVM【 Throughput、Footprint、Latency 】1.4 影响性能的关键要素

? 产品设计:产品逻辑、功能交互、动态效果、页面元素

? 基础网络:网络 = 连接介质 + 计算终端

? 连接介质:电缆、双绞线、光纤、微波、载波或通信卫星。

? 计算终端:PC、手机、可穿戴设备、家具家电...

? 基础网络设施,互联网,局域网(LAN)、城域网(MAN)、广域网(WAN)

? 代码质量&架构

? 架构不合理

? 研发功底和经验不足

? 没有性能意识:只实现了业务功能不注意代码性能,当业务上量后系统出现连锁反应,导致性能问题叠加。

? 数据库:慢查询、过多查询、索引使用不当、数据库服务器瓶颈…

? 移动端环境:设备类型&性能、系统版本、网络(WiFi、2G、3G、4G)

? 硬件及云服务:服务器硬件,内存、磁盘、网卡…二、JVM调优基本理论2.1 JVM调优-基本理论

? 01-为什么JVM调优?

? 降本增效:调优的最终目的都是为了应用程序使用最小的硬件消耗来承载更大的吞吐量。

? 02-什么时候JVM调优?

? 降低成本

? 系统出现问题:1.TPS上不去和RT下不来,2.内存分配不合理和GC策略错误

? 03-调优调啥?

? 1.内存(堆、栈)分配、2.垃圾收集器

? 04-调优的原则和目标如何确定?

? 优先原则:产品、架构、代码、数据库优先,JVM是最后的手段

? 观测性原则:发现问题解决问题,没问题不创造问题。

? 05-堆内存:分代收集理论

? 三大假说:弱分代假说,强分代假说及跨代引用假说2.2 JVM调优-垃圾收集器

? 01-什么是垃圾?

在内存中没有被引用的对象就是垃圾。

? 02-如何找到垃圾?

引用计数法、根可达算法【GCRoots】

? 03-如何清理垃圾?

  • 标记清除算法Mark-Sweep
  • 拷贝算法Copying
  • 标记压缩算法Mark-Compact

? 04-用什么来清理垃圾?

GC垃圾收集器:Serial、Serial Old、PS、PO、ParNew、CMS、G1、ZGC

? 05-调优的关键指标:RT、TPS、QPS、Throughput、Footprint、Latency

06-调优监控&分析工具:jps、jstat、jinfo、jmap、VisualVM、 GCEasy、 Grafana、Prometheus三、高并发下JVM调优最佳实践3.1 案例背景

不久之前:我解决了一个JVM性能问题。我老东家手机App某核心接口高峰期响应慢。通过

Grafana监测平台发现,同时该服务的GC也有异常,且两者之间存在相关性。本案例是来自于当时的实践。



3.2 调优思路

服务默认JVM配置参数如下:

单纯从参数上分析,存在以下问题:

问题1:未显示指定GC垃圾收集器

JDK 8默认搜集器为ParrallelGC即:3.3 案例分析

问题2:Young区配比不合理

当前服务主要提供API,这类服务的特点是常驻对象会比较少,绝大多数对象的生命周期都比较短,经过一次或两次Young GC就会消亡。

不合理导致的直接结果:在服务负载情况下。请求并发较大,Young区中Eden + S0区域会迅速填满,进而Young GC会比较频繁。另外会引起本应被Young GC回收的对象过早晋升,增加Full GC的频率,同时单次收集的区域也会增大,由于Old区使用的是ParralellOld,无法与用户线程并发执行,导致服务长时间停顿,可用性下降, P99响应时间上升。

问题3:未设置Metaspace

未设置Metaspace,服务在启动和发布的过程中,元数据区域达到21M时会触发一次Full GC (Metadata GC Threshold),

随后随着元数据区域的扩张,会夹杂若干次Full GC (Metadata GC Threshold),使服务发布稳定性和效率下降。

如果服务使用了大量动态类生成技术的话,也会因为这个机制产生不必要的Full GC (Metadata GC Threshold)。

问题4:GC频繁

Full GC很频繁,Young GC在特定的时段也比较频繁,存在较大的优化空间。

GC停顿的优化是降低接口的P99时延的一个有效的办法3.4 确定调优目标

核心目标:合理配置JVM,降低接口P99时延、减少Young GC和Full GC次数、停顿时长、单次停顿时长

为什么需要根据负载分别制定优化目标?



3.5 优化方案

1)指定Meta区域大小

Meta区域的大小一定要指定,且MetaspaceSize和MaxMetaspaceSize大小应设置一致,具体多大要结合线上实例的情况,通过

jstat -gc可以获取该服务线上实例的情况。

可以看出MC在71M左右,而MU在67M左右,因此-XX:MetaspaceSize=125M,-XX:MaxMetaspaceSize=125M是合理的。3.5 优化方案

2)Young区四个分配策略

当堆大小固定时:

  • Young区越大,Young GC频率一定越小,Old区域就会变小,如果太小,稍微晋升一些对象就会触发Full GC得不偿失。
  • Young区过小,Young GC就会比较频繁,Old区就会比较大,单次Full GC的停顿就会比较大。

因此Young区的大小需要结合服务情况,分几种场景进行比较,最终获得最合适的配置。

1. ParNew +CMS,Young区扩大1倍

2. ParNew +CMS,Young区扩大1倍

3. ParNew +CMS,Young区扩大0.5倍

4. ParNew +CMS,Young区不变3.5 优化方案

3)使用CI/CD进行全自动化测试,并采集测试结果

3.5 压测验证小结一下:



? 应用性能问题分析方法论

? 性能优化的最终目标是什么?用户体验 --> 产品设计 + 系统性能 --> 要快

? 系统优化是个大工程:后端【RT、TPS、并发数】、Web端、移动端

? 影响性能的关键要素(代码与架构)

1. 架构不合理

2. 研发功底和经验不足

3. 没有性能意识

4. 数据库瓶颈

? JVM调优基本理论

? 灵魂三问:为什么JVM调优、什么时候调优、调啥?

? 调优原则:优先原则、观测性原则

? 堆内存:分代收集理论、弱分代假说、强分代假说、跨代引用假说

? GC:什么是垃圾?如何找到垃圾?如何清理垃圾?用什么干掉垃圾?

? 调优的关键指标:RT、TPS、Throughput、Footprint、Latency

? 调优监控与分析工具:jps、jstat、jinfo、jmap、VisualVM、GCEasy、 Grafana、

Prometheus

? 高并发场景下JVM调优实践

? 四个问题3个优化点:

1. 未显示指定GC垃圾收集器

2. Young区配比不合理

3. 未设置Metaspace

4. GC频繁

? 三个优化点:

1. 指定Meta区域大小

2. Young区四个分配策略

3. 使用CICD进行全自动化测试,并采集测试结果教育不是注满一桶水,而是点燃一把火

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表