性能指标
术语解析
- TPS/QPS/RPS
- 每秒事务处理数/每秒查询数/每秒请求数;
- TPS是软件测试结果的测试单位。一个事务是指一个客户机向服务器发送请求然后服务器作出响应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,依次来计算使用的时间和完成的事务个数;
- RT
- Response Time,系统对请求作出响应的时间,一般取平均响应时间;
- 吞吐量
- 指一次性能测试过程中网络上传输的数据量的总和。
- 对于交互式的应用来说,吞吐量反应了服务器承受的压力,能够说明系统级别的负载能力。
- ThroughPut
- 吞吐率
- 我们一般使用单位时间内服务器处理的请求数来描述其并发处理能力。称之为吞吐率(Throughput),单位是 “req/s”。吞吐率特指Web服务器单位时间内处理的请求数。
- 另一种描述,吞吐率是,单位时间内网络上传输的数据量,也可以指单位时间内处理客户请求数量。它是衡量网络性能的重要指标。通常情况下,吞吐率“字节数/秒”来衡量。当然你也可以用“请求数/秒”和“页面数/秒”来衡量。其实不管一个请求还是一个页面,它的本质都是在网络上传输的数据,那么用来表述数据的单位就是字节数。
- 并发数
- 系统同时处理的请求数/事务数;
- TPS(QPS)=并发数/平均响应时间。假如某个应用的并发数是200,平均响应时间是50ms,那么它的TPS=200/0.05=4000。
错误数
- 单位时间内请求的错误数;
一个系统吞吐量通常由QPS(TPS)、并发数两个因素决定,每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。
图谱分析
TPS折线下滑
现象:横坐标代表TPS,纵坐标代表自然时间。可以发现,在9:00时,TPS突然开始急剧下滑,到11:00时,TPS接近为0;
分析:
- 网路IO问题。如果机器负载(CPU和内存)正常,有可能是网络出现阻塞,延时现象严重,进而导致TPS急剧下降;
- 程序阻塞问题。如果机器负载正常,并且IO也正常,那么把堆栈信息打印出来,看是否是死锁导致TPS急剧下降;
- 内存溢出。如果机器的内存不足,极大可能是内存溢出了,把堆信息打印出来看下;
- 数据库连接数过小。导致很多请求处于等待状态,导致TPS下滑;
- 应用服务器线程数过小。导致很多请求处于等待状态,导致TPS下滑;
TPS波动
现象:在9:00到15:00之间,TPS一直来回波动;
分析:
- 定时任务。查看程序代码,看是否有定时任务在这个时间点运行,如果这个定时任务消耗了过多的资源,会导致TPS稳定地来回波动;
- FullGC。JVM执行FullGC的时候,会StopTheWorld,导致短时间内应用停顿,会造成TPS来回波动;
- 日志输出。有时间规律的小幅度波动,可能是日志写硬盘造成的;
- Redis持久化。持久化时,会将内存中的数据写入到硬盘中,这时如果很有规律的波动,也有可能是redis有规律的写入硬盘造成硬盘那个点无法提供服务造成的波动;
- 网络问题。如果是无规律的波动,可能是网络问题,这个比较难排查,可以根据其他服务的TPS来协助定位;
- 黑白名单。一个用户1秒请求次数太多,导致被拒绝;
LR图区域分析
- 性能平稳期:在不进行更多性能调优情况下所能达到的最佳性能,在与压力区域的拐点所对应的并发数为最佳并发;
- 压力区域:RT轻微上升的区域,可以通过对应需求的RT阈值来得到应用可容忍的最大并发;
- 性能拐点:RT急剧上升,性能急剧下降;
性能优化的准备
目标制定
比如:
- TPS在1000以上;单就静态页面,TPS大概能到1W+,简单数据库操作大概2K+的样子,用Cache大概能到5K+。
- TPS波动在一定范围内;TPS应该是一个比较平稳的曲线,而不是上下波动,TPS波动范围 = TPS标准差/TPS平均值 * 100%,在5%内算是正常的
- 平均响应时间在200ms内;
- 超时概率小于1/10000;
- 并发数在500以上;
- 错误概率小于1/10000;
- FullGC频率平均大于半小时1次;
- CPU利用率小于75%;
- 平均每core的CPU的load小于1;
了解系统架构
了解使用的组件
tomcat
//TODO
tomcat最大tps、最大并发
mysql
//TODO
mysql最大TPS、最大并发
redis
//TODO
reids最大TPS
了解工具
LR
JMeter
Top
jstack
jstat
性能优化定理
资源来源
服务器
- IO资源
- 压榨:是否已经充分利用(达到极限)
- 转移:批量(Buffer)输入/输出,顺序写/预读;
- 增强:固态硬盘、磁盘阵列、PCIE接口;
- CPU资源
- 压榨:是否已经充分利用(达到极限)
- 转移:减少线程切换(sy -> us),优化算法;
- 增强:增加CPU核心/频率;
- 内存资源
- 压榨:是否已经充分利用(达到极限)
- 转移:内存 -> 磁盘(LRU)
- 增强:增加内存;
网络
- IO资源
- 压榨:是否已经充分利用(达到极限)
- 转移:压缩、批量(Buffer)输入输出,TCP参数调优;
- 增强:增加带宽;
性能平衡
- 掌握好平衡度,可以让整体性能提升更大
- 优化是个双刃剑,在性能提升的同时可能带来更多的麻烦
二八原则
80%的性能提升在20%的优化点上
原则
- 过早优化是万恶之源
- 尽量使用硬件优化代替深度的代码优化
- 尽量保证简单