原创 Bruce 天马行空布鲁斯 2018-06-27 之前做过一些性能测试及调优相关的工作,也参加过相关的一些培训,想写一篇文章记录用过的一些工具和一些经验总结。

性能测试及调优对于一个大型系统有着即为重要的意义,大家可能都对每年双十一对阿里淘宝天猫的性能感到很惊叹,其实网上也有很多关于各种高并发网站的架构的介绍,有兴趣的同学可以上网查看。这里主要介绍一些性能测试工具以及个人对性能调优的一些总结。

我们在讨论性能的时候,其实往往需要指定一个量化的标准来衡量,通常叫做KPI,比如常见的平均一个request的返回时间,打开一个页面的平均等待时间,等等。通过对照性能测试结果和定义的KPI,才好决定调优的方向。

下面介绍一些用过的性能测试相关的工具:

jdk bin: jdk的bin目录下有很多16k大小的可执行文件,其中很多都是可以用作监控java进程的工具,比如jps,如果本地起了很多java进程,当通过任务管理器不知道哪个java进程是哪个的时候,可以通过jps命令查看detail信息,jmap,通过jmap可以做heap dump分析是否有内存溢出,jstack,通过jstack可以做thread dump分析死锁问题。

//bin目录图片,附解释

jconsole/jvisualvm: 这两个工具起初是开源项目,现在也集成到了jdk bin目录下,它们提供了一个图形化的界面监控java进程,包括本地进程和远程进程。通过这两个工具,可以对java内存模型有一个直观的认识。

//内存模型图

gatling: 这是一个基于scalar的性能测试工具,简单讲,这个工具主要用作对backend service模拟高并发的访问的场景,并且会有一个比较丰富详细的report。这个工具有一个standalone的GUI工具,可以生成基于scalar的测试案例脚本,对scalar有经验的同学也可以不依赖这个工具而手动写测试案例,通常,GUI工具有利于本地快速测试,而测试脚本往往用于自动化的持续集成环境。https://gatling.io/

jmeter: jmeter是一个使用非常广泛的开源项目,网上有很多相关的资料,这里不在赘述。这里想介绍一个tool taurus,通常原生jmeter生成的report比较丑并且对持续集成支持的不是很好,taurus就是这样一个封装了jmeter的工具。http://gettaurus.org/

jprofiler: 用上述工具做性能测试往往得到的是backend总体上的性能表现,比如说平均一个request的返回时间,那么对于backend处理这个request的逻辑每个方法具体执行的时间,对于开发人员调优代码有重要的意义,jprofier就能够达到这个目的。https://www.ej-technologies.com/products/jprofiler/overview.html

dynatrace: dynatrace可以监控应用程序从high level到detail方法执行时间级别的性能表现,相比jprofiler,dynatrace很适合对cloud应用的监控。https://www.dynatrace.com/

下面记录个人对性能调优的一些感悟:

数据库层

  • 创建有效的索引

  • 数据库连接池配置

  • Application层

  • 处理request请求的连接池配置

减少网络传输的时间

  • 配置CDN

  • 压缩js文件

  • 减少静态文件,比如合并多张图片成一张

  • 采取有效的缓存策略

  • 减少发送请求的次数

  • 异步

分布式

  • 单机系统的计算能力有限,采用分布式系统可以大大提高计算能力。个人认为这也是paas平台相较于iaas平台的一个很重要的功能,在paas平台上,load balance是一个开箱即用的功能。

代码逻辑实现

  • 其实以上都是一些配置,架构相关的优化,还有一个最重要的点就是代码实现逻辑的优化,真正减少时间复杂度。