乐趣区

关于监控:性能测试监控指标及分析调优-京东云技术团队

一、哪些因素会成为零碎的瓶颈?

1、CPU,如果存在大量的计算,他们会长工夫不间断的占用 CPU 资源,导致其余资源无奈抢夺到 CPU 而响应迟缓,从而带来零碎性能问题,例如频繁的 FullGC,以及多线程造成的上下文频繁的切换,都会导致 CPU 忙碌,个别状况下 CPU 使用率 <75% 比拟适合。

2、内存,Java 内存个别是通过 jvm 内存进行调配的,次要是用 jvm 中堆内存来存储 Java 创立的对象。内存的读写速度十分快,然而内存空间又是无限的,当内存空间被占满,对象无奈回收时,就会导致内存溢出或内存透露。

3、磁盘 I /O,磁盘的存储空间要比内存存储空间大很多,然而磁盘的读写速度比内存慢,尽管当初引入 SSD 固态硬盘,然而还是无奈跟内存速度相比。

4、网络,带宽的大小,会对传输数据有很大影响,当并发量减少时,网络很容易就会成为瓶颈。

5、异样,Java 程序,抛出异样,要对异样进行捕捉,这个过程要耗费性能,如果在高并发的状况下,继续进行异样解决,零碎的性能会受影响。

6、数据库,数据库的操作个别波及磁盘 I / O 的读写,大量的数据库读写操作,会导致磁盘 I / O 性能瓶颈,进而导致数据库操作提早。

7、当在并发编程的时候,常常会用多线程操作同一个资源,这个时候为了保证数据的原子性,就要应用到锁,锁的应用会带来上下文切换,从而带来性能开销,在 JDK1.6 之后新增了偏差锁、自旋锁、轻量级锁、锁粗化、锁打消。

二、哪些指标做为掂量零碎的性能

1、RT 响应工夫,包含如下

1.1 数据库响应工夫,即数据库操作的工夫

1.2 服务端响应工夫,服务端包含 Nginx 散发的申请所耗费的工夫及服务端程序执行所耗费的工夫。

1.3 网络响应工夫,网络传输,网络硬件须要对传输的申请进行解析所耗费的工夫

1.4 客户端响应工夫,个别 Web、App 客户端,耗费工夫能够忽略不计,然而如果客户端存在大量的逻辑解决,耗费的工夫有能能就会变长。

2、TPS 吞吐量

2.1 磁盘吞吐量

IOPS(Input/Output Per Second)每秒的输入输出量,这种是单位工夫内零碎能解决的 I / O 申请数量,I/ O 申请通常为读或写数据操作申请,关注随机读写性能,实用于随机读写频繁的利用,如小文件存储,邮件服务器。
数据吞吐量,这种是单位工夫能够传输的数据量,对于大量程序读写频繁的利用,传输大量间断数据,例如视频编辑。

2.2 网络吞吐量

指网络传输时没有丢帧的状况下,设施可能承受的最大数据速率。网络吞吐量不仅跟带宽有关系,还跟 CPU 解决能力、网卡、防火墙、以及 I / O 等紧密联系,吞吐量的大小由网卡的解决能力、外部程序算法以及带宽大小决定。

3、资源使用率

3.1 CPU 使用率,首先能够先理解 CPU 的根本信息,包含物理 CPU 的个数、单个 CPU 的核数,而后能够通过命令查看使用率,vmstat、mpstat、top

3.2 内存使用率,free -m、vmstat、top

3.3 磁盘 I /O,iostat、iotop、

3.4 网络 I /O,netstat、ifconfig、tcpstat、

三、性能测试留神的问题

1、咱们在做性能测试的时候,零碎的运行会越来越快,前面的访问速度比咱们第一次拜访的速度快了好几倍,这是因为 Java 语言编译的程序是,.java 文件先编译为.class 文件,而后通过解释器将.class 的字节码转换老本地机器码后,能力运行。为了节约内存和执行效率,代码最后被执行时,解释器会率先解释执行这段代码。随着代码被执行的次数增多,虚拟机发现某个办法或代码运行的特地频繁,就被认定为热点代码(Hot Spot Code)。为了进步热点代码的执行效率,在运行时虚拟机将会通过即时编译器(JIT)把这些代码编译成为本地平台相干的机器码,而后贮存在内存中,之后每次运行代码时,间接从内存中获取。这样就会导致第一次零碎运行慢,前面拜访的速度快几倍。

2、在做性能测试的时候,每次测试解决的数据集都是一样的,然而后果却有差别,这是因为测试时,随同着很多不稳固因素,比方机器其余过程的影响、网络稳定以及每个阶段 JVM 垃圾回收的不同等。咱们能够通过屡次测试,将测试后果求均匀,只有保障平均值在正当范畴之内,并且稳定不是很大,这种状况,性能测试就算通过。

四、定位性能问题的时候,能够应用自下而上的策略剖析排查

当咱们进行压测之后,咱们会输入一份性能测试报告,其中包含,RT、TPS、TP99,被压服务器的 CPU、内存、I/O,以及 JVM 的 GC 频率。通过这些指标能够发现性能瓶颈。咱们能够采纳自下而上的形式进行剖析。

1、首先从操作系统层面,查看零碎的 CPU、内存、I/O、网络的使用率是否异样,再通过命令查找异样日志,最初通过日志剖析,找到导致瓶颈的问起因。

2、还能够从 Java 利用的 JVM 层面,查看 JVM 的垃圾回收频率以及内存分配情况是否存在异样,剖析垃圾回收日志,找到导致瓶颈的起因。

3、如果零碎和 JVM 层面都没有出现异常状况,而后能够从应用服务业务层查看是否存在性能瓶颈,例如,Java 编程问题,读写数据库瓶颈等。

五、优化性能问题的时候,能够应用自上而下的策略进行优化

整体的调优程序,咱们能够从业务调优到编程调优,最初再到零碎调优

1、应用层调优

首先是优化代码,代码问题往往会因为耗费系统资源而暴漏出来,例如代码导致内存溢出,使 JVM 内存用完,而产生频繁的 FullGC,导致 CPU 偏高。

其次是优化设计,次要是优化业务层和中间件层代码,例如能够采纳代理模式,放在频繁调用的创建对象的场景里,共享一个创建对象,缩小创建对象的耗费。

再次是优化算法,抉择适合的算法升高工夫复杂度。

2、中间件调优

MySQL 调优

1)、表构造与索引优化。

次要是对数据库设计、表结构设计以及索引设置维度进行的优化,设计表构造的时候,思考数据库的程度与垂直的拓展能力,提前布局好未来数据量、读写量的增长,布局好分库分表计划。对字段抉择适合的数据类型,优先选用较小的数据结构。

2)、SQL 语句优化。

次要是对 SQL 语句进行的优化,应用 explain 来查看执行打算,来查看是否应用了索引,应用了哪些索引。也能够应用 Profile 命令剖析语句执行过程中各个分步的耗时。

3)、MySQL 参数优化。

次要是对 MySQL 服务的配置进行优化,例如连接数的治理,对索引缓存、查问缓存、排序缓存等各种缓存大小进行优化

4)、硬件及系统配置。

对硬件设施和操作系统设置进行优化,例如调整操作系统参数、禁用 swap、减少内存、降级固态硬盘。

3、零碎调优

首先是操作系统调优,Linux 操作的内核参数设置能够进行调优,已达到提供高性能的目标。\
其次,JVM 调优,设置正当的 JVM 内存空间,以及垃圾回收算法来进步性能,例如,如果业务逻辑会创立大对象,咱们就能够设置,将大的对象间接放到老年代中,这样能够缩小年老代频发产生 YongGC,缩小 CPU 的占用工夫。

4、调优的策略

首先是工夫换取空间,有的时候系统对查问速度要求不高,对存储空间要求较高,这个时候咱们能够思考用工夫换取空间。

其次是空间换取工夫,用存储空间晋升访问速度,典型的就是 MySQL 的分库分表策略,MySQL 表单数据存储千万以上的时候,读写性能就会降落,这个时候咱们能够将数据进行拆分,以达到查问的时候,每个表的数据是大量的,以达到晋升性能的目标。

5、兜底策略

零碎调优后,依然还会存在性能问题,这个时候咱们须要有兜底策略,
首先是限流,对系统的入口设置最大拜访限度,同时采取断熔措施,返回没有胜利的申请。
其次是横向扩容,当访问量超过某一个阈值时,零碎能够主动横向减少服务。

作者:京东衰弱 牛金亮

内容起源:京东云开发者社区

退出移动版