10.性能测试——调优方法

10.性能测试——调优方法

1.CPU

CPU资源利用率很高的话,需要看CPU消耗User,Sys,Wait那种状态下。

如果CPU User非常高,需要查看消耗在哪个进程,可以用top(linux)命令看出,接着用top –H –p 看哪个线程消耗资源高,如果是java应用,就可以用jstack看出此线程正在执行的堆栈,看资源消耗在哪个方法上,查看源代码就知道问题所在;如果是c++应用,

可以用gprof性能工具进行分析

如果CPU Sys非常高,可以用strace(linux)看系统调用的资源消耗及时间。

如果CPU Wait非常高,考虑磁盘读写了,可以通过减少日志输出、异步或换速度快的硬盘。

2.Memory

操作系统未最大化利用内存,一般都设置大量的cache,因此,内存利用率高达99%并不是问题,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。

3.磁盘I/O

磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘。

4.网络I/O

网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩、减少内容大小、在本地设置缓存以及分多次传输等。

5.内核参数

内核参数一般都有默认值,这些内核参数默认值对于一般系统没问题,但是对于压力测试来说,可能运行的参数将会超过内核参数,导致系统出现问题,可以用sysctl来查看及修改。

6.JVM

jvm主要分析GC/FULL GC是否频繁,以及垃圾回收的时间,可以用jstat命令来查看,对于每个代大小以及GC频繁,通过jmap将内存dump,再借助工具HeapAnalyzer来分析哪地方占用的内存较高以及是否有内存泄漏可能。

7.JDBC连接池

连接池不够用的情况下,可以通过参数进行调整增加;但是对于数据库本身处理很慢的情况下,调整没有多大的效果,需要查看数据库方面以及因代码导致连接未释放的原因。

8.SQL

SQL效率低下也是导致性能差的一个非常重要的原因,可以通过查看执行计划看SQL慢在哪里,一般情况,SQL效率低下原因主要有:产生全表扫描、索引性能低、表中有几百万行,产生大量数据、产生大量日志,消耗资源。

软件性能测试中性能调优方法概述

确定性能调优的目标

性能调优,首先是要确定性能调优的目标是什么,如果现在应用已经满足了需求,就没必要去做性能调优了,毕竟不经过一个系统的过程,其实是无法确定你所做的性能调整是否真的调优了性能,是否没有造成应用中[其他](javascript:;)的问题,所以确定性能目标是非常重要的,在定义性能目标的时候通常这么定义的呢:

1、最大并发数

2、Quality of Service

服务的质量,在软件系统方面我们认为主要表现在请求的出错率,系统的load等。

3、最长响应时间

对于任何请求所能承受的最大响应时间。

4、TPS

每秒需要支持的最大事务数,最典型的指标是:“某页面最高需要支撑每秒7000次的访问次数”。

例如一个[web](javascript:;)系统,需要定义出来的目标是:

并发目标:最高支撑200并发;

QoS:出错率须控制在万分之一,系统的load最高只能到达10;

TPS:每秒完成7000次请求的处理;

最大响应时间:最长允许的响应时间为5秒。

至于请求的平均响应时间这些就不在性能调优目标中定义,因为要达到TPS的要求,响应时间是必须要达到一个级别的,而且响应时间随着高并发是会出现劣化的。

当然,还可以把性能指标定到更为细节,例如某个方法的TPS在100并发时需要达到多少。

在确定好了性能目标后,重要的就是如何来测量系统的性能了。

测量系统性能

对于新系统而言,需要评估出其正式运行时的数据量的增长情况;而对于已运行的系统,则需要根据监控获取到系统的运行数据(例如高峰并发数、系统的响应速度情况、系统的load、网络流量、每类请求在总的请求中所占的百分比等)。
对于新系统而言,要评估出具体的性能相对来说稍微好做一点,因为此时系统通常较为单纯,数据量的增长也不可能是一夜之间增长的,因此基本可以按照一种正常的方法在[测试](javascript:;)环境评估出其正式运行的性能。

而对于已运行的系统而言,则较为麻烦,因为通常来讲要在测试环境中模拟正式运行环境基本是不太可能的,因此这个时候通常要采取一些模拟的方法或更高压力的方法来尽量更为准确的评估出系统的性能。

在测试系统性能时,通常可采用的方法有:

1、单元测试;

可借助[单元测试](javascript:;)来测试某个请求的性能;

2、压力测试;

压力测试无疑是测量系统性能中最常采用的方式,根据定义的性能目标对系统进行压力测试,以确定系统是否满足性能要求,同时也可以根据压力测试的结果来分析系统的瓶颈,进而进行对应的调优,可用于做压力测试的工具还是不少的,像loadrunner、jmeter等等

分析系统性能瓶颈

根据测量系统性能的结果,多数是可以分析出系统性能的瓶颈,同时还可以结合像jvm堆栈、jprofiler、系统[日志](javascript:;)等来进行进一步的确定,另外也可以根据性能调优人员的经验,例如可以去了解开发人员是否采用了不适合的数据结构等。

简单说一个线程分析的例子:

借助kill -3 pid来获取到目前jvm的线程堆栈信息,特别需要关注的是里面wait for monitor这样的线程,这种线程是指在等待锁的线程,等待一两分钟后再次kill -3 pid,看看这些wait for monitor的线程的变化情况,这对于分析线程中是否存在不合理的竞争过高的锁的分析是非常重要的。

这一步无疑也是性能调优过程中最难的一步了,分析系统性能瓶颈这种基本只能结合实际例子来讲了,正确在后续抽取一两个例子来进行讲解。

性能调优

在分析出系统性能的瓶颈后,其实这一步相对来说还好做些,当然,需要建立在对软硬件知识都有很好的深入了解的基础上,在这里列举一些比较常见的性能调优的手段。

Redhat[Linux](javascript:;)内核

Redhat linux内核版本升级到2.6,2.6和2.4的差别还是很多的,例如对epoll的支持、NPTL的采用;epoll的支持对于**[java](javascript:??**而言也是很重要的,在高并发的情况下nio是否采用epoll还是有挺大的差别的;而NPTL的采用对于多线程程序而言更是极为重要。

另外需要关注像linux的File Handles是多少、network buffer是多少、MTU是多少、Memory Page size是多少等等。

JVM

JVM调优的[文章](javascript:;)相对来说比较多,大家需要了解的主要是-Xms/-Xmx、并行GC、-XX:MaxPermSize/-XX:MaxNewSize、-XX:ThreadStackSize、NIO采用epoll等等。

简单的列这两个,其实性能调优的手段还有非常的多,例如简单的增加CPU、买更快速度的硬盘、增加内存、提升网络带宽等这些从硬件角度下手的方式,还有像[数据库](javascript:;)调优、应用服务器调优等等。

来源:不戴眼镜的眼镜男

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年6月7日
下一篇 2020年6月7日

相关推荐