1.2.9性能问题的定位分析
性能问题的分析、定位或者调优,很大程度是一种技术问题,需要测试人员具备多方面的专业知识。数据库、操作系统、网络等方面的管理和技术开发都是一个合格的性能测试人员需要拥有的技能。只有这样,才能从多角度全方位地去考虑分析问题。本节分4个方面进行深入讲解,分别是性能问题分析方法论、性能数据解读建议、性能常见问题和案例、性能调优建议。
1.性能问题分析方法论
性能问题的定位排査过程比较复杂,可以釆用“拆分问题,隔离分析”的方法进行分析,即逐步定位、从外到内、由表及里、逐层分解、隔离排除。以下的分析顺序供读者参考:日志分析…网络瓶颈(对局域网可以不考虑这一层)…服务器操作系统瓶颈(参数配置)…中间件瓶颈(参数配置、Web服务器等)…应用瓶颈(业务逻辑、算法等)f数据库瓶颈(SQL语句、数据库设计、索引)。
其实这也是根据请求流入系统的顺序层层递进分析的,而上面每一环节的监控方法在性能测试的监控部署这一节都有涉及。接下来,我们需要解读监控收集的数据,分析异常,由此可见性能测试是环环相扣的、系统性的工作。
另外,做性能测试的时候,我们一定要确保瓶颈不发生在自己的测试脚本和测试工具上。
基于上述思想的指导,在具体执行层面,可以参考如下分析过程。
首先,当系统有问题的时候,我们不要急于去调査我们代码,这毫无意义。我们首先需要看的是操作系统的报告。看看操作系统的CPU利用率、内存使用率、操作系统的IO,还有网络的IO和网络连接数等。通过观察以下这些最直观的数据,我们就可以知道软件的性能问题基本上出在哪里。
(1)査看CPU利用率,如果CPU利用率不高,但是系统的吞吐量和响应上不去,这说明我们的程序并没有忙于计算,而是忙于别的一些事,例如网络的IO。另外,CPU的利用率还要看内核态的和用户态的,一旦内核态的上去了,整个系统的性能就下来了。而对于多核CPU,CPU0是相当关键的,如果CPU0的负载高,则会影响其他核的性能,因为CPU各核间是需要调度的,这靠CPU0完成。
(2)査看10大不大,10与CPU利用率相反,CPU利用率高则10不大,10大则CPU就小。关于10,我们要看3个指标,即磁盘文件10、网卡的10、内存换页率。这3个指标都会影响系统性能。
(3)査看网络带宽使用情况。在Linux下,可以使用sar、iptraf、tcpdump这些命令来査看。
(4)查看系统的连接数是不是接近65535,TIME_WAIT的连接是不是非常多。若连接数较大,可能配置是有问题的。
如果CPU利用率不高、操作系统的10不高、内存使用率不高、网络带宽使用率不高,但是系统的性能依然上不去,这说明我们的程序有问题。例如,我们的程序被阻塞了,可能是因为等某个锁、可能是因为等某个资源,或者是在切换上下文。
通过了解操作系统的性能,我们才能知道性能的问题,例如带宽不够、内存不够、TCP缓冲区不够等。很多时候不需要调整程序,只需要调整一下硬件或操作系统的配置就可以了。具体配置项的调优,可以参考调优章节。
接下来,我们需要使用性能检测工具。可以使用性能测试的监控部署这一节中讲到的阿里开源工具TProfiler,统计top的方法耗时,结合Java自带的jstack命令,查看每个线程的运行状态,定位代码有无死循环、逻辑错误等问题。
最后,其实很多时候性能问题最终都会落到数据库上,因为磁盘的读写能力永远是跟不上CPU的计算能力的。而对于数据库,我们可以通过解读淘宝开源工具OrzDBA的监控数据,分析有无出现瓶颈,是否缺失数据索引等。
以上就是性能问题分析的一种思路,从服务器操作系统层面、中间件层、应用层、数据库层,逐层排査定位。