性能优化三步法(总结|性能优化思路及常用工具及手段)

点击链接阅读原文,获取更多技术内容:总结|性能优化思路及常用工具及手段-阿里云开发者社区

性能优化是降低成本的手段之一,每年大促前业务平台都会组织核心链路上的应用做性能优化,一方面提升系统性能,另外一方面对腐化的代码进行清理。本文结合业务平台性能优化的经验,探讨一下性能优化的思路及常用工具及手段。

作者 | 岱泽

来源 | 阿里云开发者公众号

性能优化是降低成本的手段之一,每年大促前业务平台都会组织核心链路上的应用做性能优化,一方面提升系统性能,另外一方面对腐化的代码进行清理。现结合业务平台性能优化的经验,探讨一下性能优化的思路及常用工具及手段。性能优化本质上是对资源的合理利用,将更珍贵的资源用在更重要【我爱线报网】的业务上,从而实现资源的充分利用,资源的合理利用。性能优化的对象包括业务运行的容器、业务依赖的中间件、业务依赖的数据库存储的优化,性能优化包括两部分:一、发现需要性能优化的点;二、改造代码设计实现性能优化;

CPU的开销,有限的cpu无法支撑更大的业务 (性能问题)CPU利用不充分,有限的CPU,无法更好的支撑业务(RT问题)

一、发现需要性能优化的点

对于业务容器来说,需要性能优化的点,往往是对系统开销最大的业务方法,这部分代码功能上并没有任何问题,但在性能上并不是最优,在资源比较充足的情况下,这部分逻辑并不会导致性能问题,但当系统压力比较大,或者业务流量比较高的情况下,这部分就会成为压力最大的点【我爱线报网】

1) 放大系统的流量

将流量在部分容器上做放大,利用工具采集系统中的堆栈及性能数据。放大系统流量的情况下,需要提前关闭应用及容器的限流,可以利用Sentinel脚本调整。

### 取消限流 2.X curl http://localhost:8719/switchSet?value=false ### 取消限流 3.X curl http://localhost:8718/setSwitch?value=false

一、Duct引流验证

Duct引流, duct调整某一台机器的CS权重,将其他容器的流量引流到对应的ip上,从而实现压力的放大。

二、Amazon构造压测数据验证

Amazon压测,根据特定的业务场景【我爱线报网】,构造压测压测数据,压测模型,在gray4环境中打一部分压测流量,利用压测流量将系统的负载打高。Amazon更适用于大促场景下的性能优化,能确定某些接口的比例,及场景的比例。

2) 利用工具采集系统热点

系统负载流量增加后,各个环节的系统性能消耗都会被放大,此时利用工具可以分析系统的性能情况。系统分析工具会带来系统压力增加,非必要情况下,尽量在隔离环境统计数据。

Arthas性能数据采集

Arthas提供了非常多的工具脚本,其中一部分数据组合起来使用,可以很方便的辅助做性能分析及线上问题排查,这里对其中常用的指令及使用场景做汇总。

安装方式:curl -sLk http://ops.jm.taobao.【我爱线报网】org:9999/pandora-web/arthas/install.sh | sh

图 1.1 Arthas指令集合列表

性能分析及问题分析工具说明

指令

说明

性能分析及问题排查的场景

classloader

查看当前JVM下ClassLoader的列表及加载的实例统计信息

常见于排查Metaspace空间利用率问题,常见的场景是由于Groovy脚本导致的Metaspace增加,进而导致应用FGC的问题排查

jad

反编译

常见于黑盒分析,无法快速活的源码的情况下分析程序内部逻辑的场景

getstatic

获取静态字段的值

常见于分析开关、配置、部分数据的情况,在分析性能数据时可以辅助排查

stack

从当前方法点打印【我爱线报网】堆栈

常见于分析热点方法调用来源,结合条件过滤,可以快速定位到异常数据产生的来源以及调用频率

trace

从当前方法下钻

常见于分析耗时情况,分析某一个方法耗时的原因。比如分析鹰眼某一个接口耗时很高的原因

watch

查看方法调用的参数及返回值

分析线上方法的入参及返回值,结合条件判断,可以快速知道某一个函数可能走到的场景

options

Arthas的一些选项

在需要分析jdk内部的调用时,可以打开某些选项

logger

打印日志相关的信息

分析日志冲突,临时关闭某些日志场景等

profiler

内部使用了Async Profiler工具,可以用来采集内存、cpu、锁、cache miss等火焰图数据

性能分析,分析当前业【我爱线报网】务的热点方法启动分析,分析应用启动速度慢的原因,并行化,锁等场景内存分配分析,分析JVM应用Old区增长较快的原因

vmtool

获取实例

强制GC

获取jvm中某些类的实例列表,进而利用其他指令分析内部的数据强制应用做GC

jfr

jfr数据采集

jfr快照分析,可以快速分析整个JVM的运行情况。

场景一、CPU资源开销分析

利用profiler指令采集应用容器的性能,profiler start 默认采集的CPU的数据, profiler stop 自动dump对应的文件数据。

[arthas@2093]$ profiler start Profiling started [arthas@2093]$ p【我爱线报网】rofilerstop OK profiler output file: /home/admin/ump2/bin/arthas-output/20230213-191902.html [arthas@2093]$ exit

场景二、JVM内存中分配了比较多的对象,但很快回收,希望找到临时对象创建比较频繁的堆栈。

[arthas@2093]$ profiler -e alloc start Profiling started [arthas@2093]$ profiler stop OK profiler output file: /home/admin/ump2/bin/arthas【我爱线报网】output/20230213-192148.html [arthas@2093]$ exit

场景三、应用启动速度比较慢,希望找到原因。

[arthas@2093]$ profiler start -e wall Profiling started [arthas@2093]$ profiler stop OK profiler output file: /home/admin/ump2/bin/arthas-output/20230213-192812.html [arthas@2093]$

场景四、利用JFR分析JVM整体的运行情况,采集数据用作分析。

[arthas【我爱线报网】@82348]$ jfrstart -n test [arthas@82348]$ jfr stop -r 1 -f /tmp/1.jfr Stop recording 1, The result will be written to: /tmp/1.jfr

图1.2 JFR数据示例

天巡数据采集性能数据

工具地址:

https://explorer.alibaba-inc.com/perf/#/profile

图1.3 天巡白屏化采集性能数据

天巡功能采集指标说明

注意: 指标采集功能从实现上基本都是在运行的JVM进程上挂载agent,随后对部分代码进行增强及注入,会引起类的退优化及C2编译,本身会导致程序的CPU增高,对【我爱线报网】于性能的采集不能在系统高负载的情况下执行。必要时在仿真环境里执行。

诊断项

功能说明

使用场景

内存火焰图

内核火焰图,统计内存分配的情况,利用统计TLAB中的内存分配

临时对象产生过快,分析产生的原因应用FGC间隔断,old区上涨曲线陡峭

CPU火焰图

对CPU消耗进行采样,统计代码的热度及调用堆栈

性能分析,统计系统性能衰减的原因,分析消耗cpu的点以及执行频率高的代码段Buy2 CPU数据分析示例

线程火焰图

线程分布分析,将线程堆栈制作成火焰图形式,方便分析

分析线程热度及死锁

jprofiler

jprofiler的快照采集,利用关在agent数据,采集1分钟的CPU快照

性能分析,类似CPU火焰图,但可以利用J【我爱线报网】profiler的图形化界面,进行对比分析Buy2性能数据Jprofiler快照

Metaspace

利用JDK提供的jcmd dump jvm的metaspace数据

分析jvm的metaspace的占用情况统计出metaspace 占用较高的原因

Perf

利用perf-map-agent生成jvm的符号表,利用Linux自带的Perf工具分析系统的性能数据,结合flame-graph可以生成类似的火焰图

性能分析,用于分析内核态、用户态、JVM数据功能

黑屏场景下的性能分析

特殊的环境下,可能无法使用配套的工具,此时应尽量利用JVM及Linux系统中自带的工具,采集数据后,在本地利用工具进行数据分析。

【我爱线报网】、利用Perf分析系统性能,Perf是linux内核提供的性能分析工具,利用该工具可以很方便的分析整机的性能数据

CPU消耗来自非Java程序的场景,或者希望结合Java程序整体分析系统情况的场景

perf-map-agent.compiled.tgz:

https://yuque.antfin.com/attachments/lark/0/2024/gz/8526/1704162543426-7fcb3be9-4465-475e-8518-4cf6449ca3c8.gz sudo yum -y install perf sh create-java-perf-map.sh # 采集性能数据 sudo perf 【我爱线报网】record -ag # 分析性能数据 sudo perf report

图1.4 利用Perf结合perf-map-agent 分析高CPU消耗数据

二、利用jstack分析应用的启动情况

分析应用在启动过程中,应用运行的堆栈,进而分析出启动过程中,应用执行耗时最多的热点代码,进而针对性的做启动优化

$cat 1.sh for i in `seq 10000` do /opt/taobao/java/bin/jstack $1 > /tmp/$1.$i.log done

三、利用jmap、jcmd dump数据,相关数据dump出来后,可以进一步通过工具进行分析

/opt/taobao/java/bin/jcmd 82348 he【我爱线报网】lp /opt/taobao/java/bin/jcmd 82348 help CodeCache.dump /opt/taobao/java/bin/jcmd 82348 help Compiler.CodeHeap_Analytics /opt/taobao/java/bin/jcmd 82348 JVMTI.data_dump /opt/taobao/java/bin/jcmd 82348 help Metaspace.dump /opt/taobao/java/bin/jmap -dump:format=b,file=/tmp/heap.bin 82348

图1.5 jcmd 分析【我爱线报网】CodeCache的大小及区间数据

内容剩余60%,完整内容可点击下方链接查看:总结|性能优化思路及常用工具及手段-阿里云开发者社区

阿里云开发者社区,千万开发者的选择。百万精品技术内容、千节免费系统课程、丰富的体验场景、活跃的社群活动、行业专家分享交流,尽在:阿里云开发者社区-云计算社区-阿里云

推荐阅读

给力项目线报网会员可免费下载 加入会员
友情提醒: 请尽量登录购买,防止付款了不发货!
QQ交流群:226333560 站长微信:qgzmt2
温馨提示:本站提供的一切软件、教程和内容信息都来自网络收集整理,仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,版权争议与本站无关。用户必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!

给TA打赏
共{{data.count}}人
人已打赏
行业资讯

开售!攻略!本周五起!

2024-7-3 15:42:19

行业资讯

卷土重来的异界入侵第二季(卷土重来的DDoS狂魔:Fodcha僵尸网络再次露出獠牙)

2024-7-3 16:02:57

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索