性能优化是降低成本的手段之一,每年大促前业务平台都会组织核心链路上的应用做性能优化,一方面提升系统性能,另外一方面对腐化的代码进行清理。现结合业务平台性能优化的经验,探讨一下性能优化的思路及常用工具及手段。性能优化本质上是对资源的合理利用,将更珍贵的资源用在更重要的业务上,从而实现资源的充分利用,资源的合理利用。性能优化的对象包括业务运行的容器、业务依赖的中间件、业务依赖的数据库存储的优化,性能优化包括两部分:一、发现需要性能优化的点;二、改造代码设计实现性能优化;
- CPU的开销,有限的cpu无法支撑更大的业务 (性能问题)
- CPU利用不充分,有限的CPU,无法更好的支撑业务(RT问题)
一、发现需要性能优化的点
对于业务容器来说,需要性能优化的点,往往是对系统开销最大的业务方法,这部分代码功能上并没有任何问题,但在性能上并不是最优,在资源比较充足的情况下,这部分逻辑并不会导致性能问题,但当系统压力比较大,或者业务流量比较高的情况下,这部分就会成为压力最大的点。
1) 放大系统的流量
将流量在部分容器上做放大,利用工具采集系统中的堆栈及性能数据。放大系统流量的情况下,需要提前关闭应用及容器的限流,可以利用Sentinel脚本调整。
### 取消限流 2.Xcurl http://localhost:8719/switchSet?value=false
### 取消限流 3.Xcurl 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 |