仅作记录,以备后续方便翻阅。
一、性能测试方法归纳
测试方法 | 测试方法简述 | 测试目的和关注点 |
负载测试 | 通过模拟系统所承载的并发用户或请求流量的负荷,用不断加压的方式观察系统在不同压力下的性能变化,在满足性能指标的情况下,系统所能承受的最大负载量。 | 通过不同负载测试得出响应性能指标: 1.得出系统最优tps; 2.得出系统最优tps时硬件资源利用率; 3.得出系统最优并发数。 |
压力测试 | 指判断被测系统在强压力下何时出现不可恢复的崩溃现象,如宕机、僵死、异常现象等。 | 着重于系统在强压力下的性能状况: 1.得出系统崩溃点的tps; 2.得出系统崩溃点的tps硬件资源利用率; 3.得出系统极限并发数。 |
容量测试 | 为了确定系统可处理同时在线的最大用户数,使系统承受超额的数据容量来发现它是否能够正确处理。 | 1.获取系统在拐点时的性能数据; 2.获取系统性能点下降时的性能数据容量测试在资源占用和其他应用方面都有设定的指标,如CPU、内存、磁盘使用量、平均负载等,这些指标的设定一般采用8/2原则,即CPU使用量不超过80%等。 |
稳定性测试 | 指给定的负载下,系统长时间健康运行不出现故障、不出现异常的峰值。 1、给定的负载一般是以容量极限为参考,用8/2原则制定负载模式。但在实际的稳定性测试中,一般使用恒定的负载进行测试。 2、测试执行时间一般按24小时×7天,但这只是个参考值,而不是个标准值。具体时间看系统看需求,几小时到几天不等。 | 1.长时间测试中系统不宕机; 2.被测业务场景无性能问题; 3.某业务出现错误时,系统可稳定持续运行。关注系统稳定性,要对资源、连接池、JVM年老区变化、tps、应用系统响应时间和DB健康状况进行关注。 |
二、监控分析
1、一些小工具
Nmon:监控服务器的硬件资源,如cpu、Memory、Disk和网络等。
Visual VM:监控DB的连接数、JVM堆内存使用情况和线程情况。
Toad和Oracle EM企业管理器:获取Oracle数据库的AWR报告,监控数据库cpu、负载、索引、Top X使用频率的SQL语句、Top X的会话等。
MySQL可以分析Performance_schema性能检测库和MySQL的慢日志(slow log)。
2、执行性能测试时监控和分析的过程(参考):
a)使用性能测试工具收集应用系统的业务性能数据,并监控数据有无性能异常;
b)观察服务器的硬件资源和性能状况,判断硬件是否存在瓶颈,监控数据包括cpu、Memory、Disk、I/O、网络和数据库连接数等;
c)了解JVM,分析JVM参数是否存在问题,监控JVM使用情况是否有异常;
d)4深入分析问题根源,如分析JVM、查询代码异常、使用Oracle分析工具分析数据库问题,结合第1步的业务性能,最后确定瓶颈所在的位置;
e)找出可优化的参数和硬件资源,调整之后进行调优测试;
f)调优后,对先前的性能问题进行回归测试,监控性能数据,验证性能问题是否已经解决。
三、JVM基础
1)运行时的数据区:
JVM内存中的堆只有一个,被所有线程共享,用来存储对象本身以及数组,而数组引用是存放在Java栈中的。Java的垃圾回收机制会自动处理空间释放的问题,因此这部分空间也是Java垃圾收集器(Garbage Collector)需要进行内存管理的主要区域。
方法区也是被线程共享的区域,存储了每个类的信息,包括类的名称、方法、字段、静态变量、常量以及编译器编译后的代码等。
四、JVM垃圾回收
JVM根据Generation(代)进行垃圾收集,分为New Generation(新生代)、Tenured Generation(年老代)、Permanent Generation(持久代),其中新生代包括一个Eden、两个Survivor区。“持久代”就是方法区,新生代和年老代都在堆空间内。
——JVM的垃圾收集器主要包含三种回收方式:
1、Minor GC
指从新生代(包括Eden和Survivor区域)回收内存的过程。Survivor区分为S1区和S2区,一般会保持一个区是空的。新建的对象都会放置在Eden区中,当Eden区已满、无法分配空间给新建对象时,就会发生Minor GC。此时会将存放在Eden区中的存活对象复制到原先为空的S1区,而Eden区基本上会被清空。另一个S2区的存活对象会被复制到年老代,S2会清空。Minor GC发生后,Eden区和其中一个Survivor区被清空,而另一个Survivor区保留着短期的存活对象。
2、Major GC
指从年老代回收内存的过程。Major GC大都是由Minor GC触发的。如果Survivor区全满,装不下更多来自Eden区或者另一个Survivor区的对象时,就会将有一定年龄的存活对象复制至年老代。当年老代放置不下对象时,就会触发Major GC。Major GC的执行代价比Minor GC要昂贵很多,速度比Minor GC要慢至少10倍以上。
3、Full GC
指清理整个堆空间的过程,包括新生代和老年代。当垃圾回收出现异常时,会记录GC的执行频率和回收内存的日志,并以此为依据判断JVM是否有性能问题,以及调整JVM参数和减少GC频率等。
——JVM出现的最常见问题有内存泄露和内存溢出:
1、内存泄露(Memory Leak)
指程序在运行过程中动态申请的内存空间不再使用后没有及时得到释放,从而导致内存无限增长。这可能是算法问题或新建对象过多没有释放。
2、内存溢出(Out Of Memory,OOM)
指用户在对其数据缓冲区操作时,超过了其缓冲区的边界,尤其是对缓冲区写操作时,缓冲区的溢出很可能导致程序的异常,也就是分配的内存不足以放下数据项。
内存泄露的堆积,会耗尽所有内存,最后导致内存溢出。
——导致OutOfMemoryError异常的常见原因有以下几种,参考:
1)JVM启动参数的内存值设定过小,造成堆溢出;
2)一次性加载数据量过大,比如生命对象分配的空间过大;
3)集合类引用对象后,未能及时清空,使得JVM内存不能回收;
4)代码中存在死循环或者产生过多重复的对象实体;
5)线程池过小,不能再新建更多的原生线程(Native Thread);
6)交换空间小。(Survivor区)