目录
一、哪些因素会成为系统的瓶颈?
1.1 CPU
如果存在大量的计算,他们会长时间不间断的占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题,例如频繁的 FullGC,以及多线程造成的上下文频繁的切换,都会导致 CPU 繁忙,一般情况下 CPU 使用率 < 75% 比较合适。
1.2 内存
Java内存一般是通过jvm内存进行分配的,主要是用 jvm中堆内存来存储 Java 创建的对象。内存的读写速度非常快,但是内存空间又是有限的,当内存空间被占满,对象无法回收时,就会导致内存溢出或内存泄漏。
1.3 磁盘 I/O
磁盘的存储空间要比内存存储空间大很多,但是磁盘的读写速度比内存慢,虽然现在引入 SSD 固态硬盘,但是还是无法跟内存速度相比。
1.4 网络
带宽的大小,会对传输数据有很大影响,当并发量增加时,网络很容易就会成为瓶颈。
1.5 数据库
数据库的操作一般涉及磁盘 I/O 的读写,大量的数据库读写操作,会导致磁盘 I/O 性能瓶颈,进而导致数据库操作延迟。
二、哪些指标做为衡量系统的性能
2.1 TPS 吞吐量
2.1.1 磁盘吞吐量
IOPS(Input/Output Per Second)每秒的输入输出量,这种是单位时间内系统能处理的 I/O 请求数量,I/O 请求通常为读或写数据操作请求,关注随机读写性能,适用于随机读写频繁的应用,如小文件存储,邮件服务器。 数据吞吐量,这种是单位时间可以传输的数据量,对于大量顺序读写频繁的应用,传输大量连续数据,例如视频编辑。
2.1.2 网络吞吐量
指网络传输时没有丢帧的情况下,设备能够接受的最大数据速率。网络吞吐量不仅跟带宽有关系,还跟CPU处理能力、网卡、防火墙、以及 I/O 等紧密联系,吞吐量的大小由网卡的处理能力、内部程序算法以及带宽大小决定。
2.2 资源使用率
2.2.1 CPU 使用率
首先可以先了解 CPU 的基本信息,包括物理CPU的个数、单个 CPU 的核数,然后可以通过命令查看CPU使用率,vmstat、mpstat、top
2.2.2 内存使用率
命令:free -m、vmstat、top
2.2.3 磁盘 I/O
命令:iostat、 iotop
2.2.4 网络 I/O
命令:netstat、ifconfig、tcpstat
2.3 RT 响应时间
- 数据库响应时间,即数据库操作的时间
- 服务端响应时间,服务端包括Nginx分发的请求所消耗的时间及服务端程序执行所消耗的时间。
- 网络响应时间,网络传输,网络硬件需要对传输的请求进行解析所消耗的时间
- 客户端响应时间,一般 Web、App 客户端,消耗时间可以忽略不计,但是如果客户端存在大量的逻辑处理,消耗的时间有能能就会变长。
三、自下而上排查性能问题
当进行压测之后,我们会输出一份性能测试报告,其中包括RT、TPS、服务器的CPU、内存、I/O,以及 JVM 的 GC 频率。通过这些指标可以发现性能瓶颈。我们可以采用自下而上的方式进行分析。
- 首先从操作系统层面,查看系统的 CPU、内存、磁盘I/O、网络的使用率是否异常,再通过命令查找异常日志,最后通过日志分析,找到导致瓶颈的问原因。
- 还可以从 Java 应用的 JVM 层面,查看 JVM 的垃圾回收频率以及内存分配情况是否存在异常,分析垃圾回收日志,找到导致瓶颈的原因。
- 如果系统和 JVM 层面都没有出现异常情况,然后可以从应用服务业务层查看是否存在性能瓶颈,例如Java 编程问题,读写数据库瓶颈等。
四、自上而下优化性能问题
整体的调优顺序,应用层调优 ----> jvm调优 ---> 操作系统层调优
4.1 应用层调优
首先是优化代码,代码问题往往会因为消耗系统资源而暴漏出来,例如代码导致内存溢出,使 JVM 内存用完,而发生频繁的 FullGC,导致 CPU 偏高。其次是优化设计,主要是优化业务层和中间件层代码,例如可以采用代理模式,放在频繁调用的创建对象的场景里,共享一个创建对象,减少创建对象的消耗。再次是优化算法,选择合适的算法降低时间复杂度。
4.2 中间件调优
主要介绍MySQL 调优
4.2.1 表结构与索引优化
主要是对数据库设计、表结构设计以及索引设置维度进行的优化,设计表结构的时候,考虑数据库的水平与垂直的拓展能力,提前规划好将来数据量、读写量的增长,规划好分库分表方案。对字段选择合适的数据类型,优先选用较小的数据结构。
4.2.2 SQL 语句优化
主要是对SQL 语句进行的优化,使用explain来查看执行计划,来查看是否使用了索引,使用了哪些索引。也可以使用 Profile 命令分析语句执行过程中各个分步的耗时。
4.2.3 MySQL 参数优化
主要是对 MySQL 服务的配置进行优化,例如连接数的管理,对索引缓存、查询缓存、排序缓存等各种缓存大小进行优化
4.2.4 硬件及系统配置
对硬件设备和操作系统设置进行优化,例如调整操作系统参数、禁用 swap、增加内存、升级固态硬盘。
4.3 系统调优
首先是操作系统调优,Linux 操作的内核参数设置可以进行调优,已达到提供高性能的目的。
其次,JVM 调优,设置合理的 JVM 内存空间,以及垃圾回收算法来提高性能,例如,如果业务逻辑会创建大对象,我们就可以设置,将大的对象直接放到老年代中,这样可以减少年轻代频发发生 YongGC,减少 CPU 的占用时间。
4.4 调优的策略
首先是时间换取空间,有的时候系统对查询速度要求不高,对存储空间要求较高,这个时候我们可以考虑用时间换取空间。
其次是空间换取时间,用存储空间提升访问速度,典型的就是 MySQL 的分库分表策略,MySQL 表单数据存储千万以上的时候,读写性能就会下降,这个时候我们可以将数据进行拆分,以达到查询的时候,每个表的数据是少量的,以达到提升性能的目的。
参考文章:
性能测试监控指标及分析调优 | 京东云技术团队 - 京东云开发者的个人空间 - OSCHINA - 中文开源技术交流社区