软件测试中主要可以分为两大类的测试类型,1)功能测试 2)性能测试
那么我们通常所说的性能测试主要重视哪方面的指标?从一个开发的角度,在指标不达标时如何找到性能瓶颈并做出相应的性能优化呢?
什么是性能?
性能测试是指在一定条件下系统行为表现是否符合需求规格的性能指标。
我们需要先理清在性能测试中我们主要关注的性能指标有哪些?
- 响应时间
- 并发用户数
- 网络吞吐量,性能计数器
- 资源利用率(CPU占用率,内存占用率…)
- TPS
- HPS
1.关于性能瓶颈
性能测试是为了验证软件系统是否能够达到需求规格说明中所提出的性能指标,发现了软件系统中所存在的性能瓶颈,达到了优化软件系统的目的。
性能瓶颈一般可以分为以下几个大类:
- 硬件上的性能瓶颈
一般是指CPU、内存、I/O读写速率,磁盘空间方面的问题。 - 网络上的性能瓶颈
一般是指网络带宽、网络波动,延时,丢包等问题。 - 应用程序上的性能瓶颈
一般指开发出来的应用程序存在架构不合理,程序设计问题造成的大量用户并行使用时出现的性能底下的问题等 - 数据库性能瓶颈
一般是指对于数据库的增删查改操作中数据库索引,锁,表空间,慢sql,数据量等对性能造成的影响 - 中间件性能瓶颈
使用的中间件中的超时设置,线程池设置,缓存策略,最大连接数,负载均衡算法的选择等造成的性能问题。
2.性能优化思路
数据库性能
- 工作中的数据大小超过了可用内存RAM
- 长短查询混合
- 写-写冲突,导致锁等待
- 大的联合查询沾光内存
编程
- 线程:死锁、
- 算法复杂度
- 栈空间,内核栈大小有限,如果内核栈空间满了,就可能出现栈溢出等一系列错误
4.外部部件依赖
磁盘
- 本地磁盘存储
- 随机磁盘读写->磁盘寻道
- 磁盘碎片化
- 操作系统
- 内核缓存刷入磁盘,填充Linux缓冲区缓存
- TCP缓冲区过小,导致频繁操作磁盘空间
缓存
- 不使用memcached
- HTTP中没有对长度较长的header,etags字段进行压缩
- 字节码缓存(PHP)
CPU
- 上下文切换(线程过多,在不同进程的线程切换时需要先记录运行信息,在切换线程,这里面包括了上下文切换带来的系统性能消耗)
- IO等待(所有的CPU都挂起等待比较慢的IO)
- CPU缓存
- 背板吞吐量
网络
- 网卡的最大输出带宽,IRQ达到饱和状态,软件中断占用了100% 的CPU
- DNS查找
- 丢包
- 网络磁盘访问
- 共享SAN(storage area network)
- 服务器失败(无响应)
内存
- 内存溢出(杀进程,进入swap,越来越慢)
- 内存溢出导致磁盘频繁读写
- 内存库开销
- 内存碎片
- malloc的空间无法分配
定位思路
1.查看相关日志
在系统出现异常后,最直观的反映应该出现在相关日志中。一个优秀的程序,除了能高效的完成相关功能外,还需要在出现问题使能够在不中断程序的情况下,以最小的代价能够查找定位问题出现的地方,最基础的定位手段就是检索日志中的内容。通过检索服务端或客服端中的日志,迅速确定可能导致系统瓶颈的几个方向。
一些日志日容对应的系统问题:
-
Too many open files
超过可打开文件限制。在打开文件后会返回一个文件描述符,文件描述符的实际内容为一个句柄,Linux下存在句柄数限制,默认情况下每个进程可以调用的最大句柄数为1024,超出限制不能打开新文件或者网络套接字,线上服务可能出现服务被拒绝的情况。这种情况下首先要优化打开的文件和套接字的数量,其次要考虑是否出现了句柄打开了没有对称关闭的情况。 -
Out Of Memory Error /Cannot allocate memory
超出可申请的内存数量/无法申请内存。内存异常,需要检查代码是否出现了内存溢出的情况。可以通过观察流量峰值后内存占用是否显著下降来判断是否存在内存未释放的情况。 -
SQL Exception
数据库语句执行出错。一般下面还会跟有相关的数据库返回信息。数据库执行出错一般与表的存在与否,表中的行列问题,表中是否存在无法查询的非法数据如不可见字符、数据缺失等的问题。 -
Connection closed /Connection refused
连接关闭/连接被拒绝。一般与连接数量限制有关,也有可能是服务端未就绪。
2.数据流向定向
了解相关系统的架构,并需要理清数据流向,将每一个可能出现瓶颈的地方标出来,然后设计相关的测试用例,逐一排查流程中各个可能的瓶颈位置。在这个过程中可以绘制数据流向图来辅助定位。
3.分析硬件资源占用率
如果在日志中没有找到相关异常,那么我们可以通过分析硬件资源的占用率来确定资源瓶颈。主要关注CPU、内存、磁盘I/O、网络I/O四个硬件的占用率。
-
CPU占用率
CPU占用率可以通过TOP指令来查看相关进程的CPU占用率。CPU的高占用率并不代表一定有某些问题。但是长时间的CPU满负荷运行则有可能是达到了运算资源的瓶颈。还需要关注是CPU在消耗在User还是Sys在wait,在wait的情况下还要观察其他硬件资源的情况,查看CPU在等待什么资源。 -
内存占用率
内存在性能测试中也是重点需要关注的指标。它可以反映内存泄漏这个重大缺陷。在观察内存时需要重点关注压力测试前的内存情况,以及压力测试后内存的恢复情况,如果撤除压力后,内存依旧保持高占用则要考虑出现内存泄漏的可能。 -
磁盘I/O
通常情况下,磁盘是计算机中速度最慢的部件。所以在和诺情况下磁盘I/O会成为系统的瓶颈。 -
网络I/O
当业务请求和响应中包含报表,图表之类较大尺寸的数据传输时,往往会遇到网络瓶颈,这也是CC攻击实现的原理。
4.软件性能瓶颈
在系统中各种中间件的广泛使用也导致了性能瓶颈的出现。对于Web系统,超过七成的瓶颈都出现数据库子系统,所以当上面的几步都无法确定瓶颈位置时要优先对数据库进行监控分析。