前言
性能测试大致分以下几个步骤:
- 需求分析
- 脚本准备
- 测试执行
- 结果整理
- 问题分析
今天要说的是最后一个步骤——“问题分析”;?
需求描述
?
有一个服务,启动时会加载一个1G的词表文件到内存,请求来了之后,会把请求词去词表里做模糊匹配,如果匹配到了就向一个后端服务发送一条http请求,拿回数据之后,返回给客户端的同时,向mysql记录请求的唯一标识和一个请求次数的标记; 其中有几个关键函数
模糊匹配(fuzzyMatching)
后端请求函数(sendingRequest)
拼装请求函数(buildResponse)
记录mysql请求次数标记(signNum)
问题及分析
?
第一组:完全随机请求词,qps达到1k时,服务器未见异常,cpu、内存、带宽均未满,qps无法继续提升;
第二组:解决后端服务的问题后,第二组使用平均30个字的请求词,来打压,qps到400时,cpu load已满;
第三组:解决了上述两个问题之后,使用完全随机请求词,qps到达3k后降低至1k,然后再次提升到3k,如此反复;
第四组:将后端换做真实的服务来做整体压测,发现qps最高只能到300,此时检查各项指标,发现入口带宽占满了;
perf+火焰图定位函数问题
这里简单说一下如何使用perf+火焰图来直观的定位性能问题:
perf
Perf 拥有了众多的性能分析能力,举例来说,使用 Perf 可以计算每个时钟周期内的指令数,称为 IPC,IPC 偏低表明代码没有很好地利用 CPU。Perf 还可以对程序进行函数级别的采样,从而了解程序的性能瓶颈究竟在哪里等等。Perf 还可以替代 strace,可以添加动态内核 probe 点,还可以做 benchmark 衡量调度器的好坏。
生成火焰图
1、第一步 使用压力测试工具对程序进行打压,压到程序拐点; $sudo perf record -e cpu-clock -g -p 11110 Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data. 2、第二步 用perf script工具对perf.data进行解析 perf script -i perf.data &> perf.unfold 3、第三步 将perf.unfold中的符 进行折叠: ./stackcollapse-perf.pl perf.unfold &> perf.folded 4、最后生成svg图: ./flamegraph.pl perf.folded > perf.svg
到这儿可以生成函数调用火焰图,如下图:
原生的perf可以直接定位C/C++的程序,通常编译debug版本的程序能看到更多的信息,java、go等语言可以通过各自定制的工具来生成,原理类似;通过火焰图可以轻松定位到哪个函数的处理时间最长,从而找到问题所在;
结尾
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!