作者的原创文章,转载须注明出处。原创文章归作者所有,欢迎转载,但是保留版权。对于转载了博主的原创文章,不标注出处的,作者将依法追究版权,请尊重作者的成果。

如何做好性能测试分析诊断调优-暨《软件性能测试、分析与调优实践之路》-赠书。

  

一个系统或者软件性能的重要性自然是无需多说,永远没有哪个用户可以忍受打开一个网站或者软件需要很久才能响应,性能是评估一个系统或者软件最实在的指标,如果一个网站做得再好看、再漂亮,但是性能上不去,那也只是华而不实。

笔者在离开测试岗进入研发岗已经有好几个年头了,按理说不应该再去写关于软件测试的书籍了而应该更多的去关注编程语言等研发工作,但是笔者在研发岗位上奋斗几年后发现其实性能并不应该是软件测试工程师一个人的事情,而是一个涉及到非常多IT岗位的共同工作,例如架构师、技术经理、研发工程师、网络工程师、运维工程师等都应该去关注性能。为什么这么说呢?因为性能测试的工作不仅仅是为了完成一项性能测试任务来获取系统或者软件的性能指标,而更多的是要去发现性能问题、去分析诊断性能问题、去针对性能问题进行调优。某个性能问题可能是架构设计缺陷引起,也有可能是网络布线不足导致,当然也可能是几行代码的影响,所以这是一个和很多IT岗位都相关的工作,是很多IT岗位都需要一起去重视的工作。正因为性能如此重要,所以笔者在转岗后还是对性能念念不忘,从而也就有了这本书的问世,当然笔者也希望借助本书能让不同IT岗位的“同行”都能更多的去关注性能问题。

这是一本理论和实践相结合的同时面向研发和测试岗的关于性能分析诊断调优实践的图书,比起其他的很多性能测试的图书,本书中内容更侧重于介绍如何去发现性能问题、分析诊断性能问题以及对发现的性能问题进行调优。书中的内容涵盖了性能测试基础、linux和windows服务器的性能分析、web和应用中间件的性能分析、java应用程序的性能分析、数据库的性能分析、安卓APP的性能分析以及具体的性能分析案例实践。这本书主要是面向有一定性能测试基础或者编程语言基础的朋友,对于刚刚接触性能测试的朋友来说可能会稍显吃力,建议在阅读本书的同时可以搭配其他的基础书籍一起效果会更好,笔者相信读完本书的朋友以后肯定不会再为“性能问题”而发愁。

性能到底有多重要呢,我们可以举一个网站访问的例子来说明,一个网页的加载速度如果超过4-5秒,可能25%的人会选择放弃。百度的搜索结果响应时间慢0.4秒,一天的搜索量可能会减少千万左右。所以一个系统,一个网站的性能决定了其能够支撑业务的能力。

不同的群体对性能的理解可能会存在很大的差异,普通的用户更加关心响应时间和稳定性。

  • 访问页面响应还要让我等多久才能加载出来?
  • 为什么有时候会访问失败?为什么会出现502?

架构师和工程师可能更加关心架构设计和代码编写的性能

  • 应用架构设计是否合理?
  •  技术架构设计是否合理?
  •  数据架构设计是否合理?
  • 部署架构设计是否合理?
  • 代码是否存在性能问题?
  • JVM中是否有不合理的内存分配和使用?
  • 线程同步和线程锁是否合理?
  •  代码的计算算法是否可以进一步优化以减少CPU的消耗时间?

运维工程师可能更加关心系统的监控以及稳定性情况

  •  服务器各项资源使用率在正常范围内吗?
  •  数据库的链接数在正常范围内吗?
  • Sql执行时间正常吗,是否存在慢查询日志?
  • 系统能够支撑7*24小时连续不间断的业务访问吗?
  • 系统是高可用的吗,服务器节点宕机了会影响用户使用吗?
  •  对节点扩容后,可以提高系统的性能吗?

性能测试可以发现的问题或者执行的目标描述如下:

1、了解系统的各项性能指标,通过性能压测来了解系统能承受多大的并发访问量、系统的平均响应时间是多少、系统的tps是多少等。

2、发现系统中存在的性能问题,常见的性能问题如下:

  • 系统中是否存在负载均衡不均的情况,负载均衡不均匀一般指的在并发的情况下,每台服务器接收的并发压力不均匀而导致的部分服务器可能因为压力过大而出现性能急剧下降,而部分服务器因为过小而出现资源浪费的情况。
  • 系统中是否存在内存泄漏问题,内存泄漏是指应用程序代码在每次执行完后,不会主动释放内存资源而导致内存使用一直增加,最终会使服务器物理内存全部耗光,程序运行逐渐变慢最终因为无法申请到内存而退出运行,而且多数时候是非常缓慢的增加,不容易被发现,一般需要通过高并发性能压测才能暴露。
  • 系统中是否存在连接系统问题,连接泄漏包含的非常广泛,可以是数据库连接泄漏、http连接泄漏或者其它的tcp/utp连接泄漏。除了系统实际情况需要建立长连接外,一般短连接都应该是用完就需要关闭和释放。
  • 系统中是否存在线程安全问题,线程安全问题是在高并发访问的多线程处理的系统中经常会出现的问题,如果系统中存在线程安全问题,就会出现多个线程先后更改数据造成所得到的数据全部脏数据,有时候甚至会造成巨大的经济损失。
  • 系统中是否存在死锁问题,死锁问题也是多线程系统中经常会遇到的一个经典问题,一般常见的有系统死锁、数据库死锁等。
  • 系统中是否存在网络架构或者应用架构扩展性问题,扩展性问题一般是指在性能指标无法满足预期的情况下,通过横向或者纵向扩展硬件资源后,系统性能指标无法按照一定的线性规律进行快速递增。
  • 发现系统的性能瓶颈在何处,性能瓶颈一般是指因为某些因素而造成系统的性能的无法持续上升。

3、 解决性能压测中存在的问题和性能瓶颈,通过不断的性能调优,使得系统可以满足预期的性能指标。

一个优秀的性能测试工程师至少需要具备:

1)、熟练使用常用的性能测试工具,包括LoadRunner,Jmeter、nGrinder等,并且精通这些工具来编写性能压测脚本以及设置性能压测场景。

2)、熟练掌握性能测试的基础以及概念,能编写出一个相对完美的性能测试方案,以及能合理的设置性能压测的场景。

3)、熟练掌握Linux、Windows等常见服务器的性能监控以及分析诊断性能瓶颈,比如CPU大幅度的波动怎么办? CPU频繁的上下文切换如何定位?如何看到某个线程当前在执行什么?

4)、熟悉常见的Web中间件,应用中间件以及如何去对中间件进行性能监控分析和参数调优。

5)、熟悉Java应用程序的监控以及日志分析, 目前大部分的性能测试都还是以Java 应用为主,包括大数据的很多项目也都是基于Java,比如Hadoop、Spark、Flink等。

6)、掌握数据库的性能监控以及瓶颈定位分析,最常见的就是掌握Mysql的监控,比如慢日志的分析、执行计划、如何从监控中看出查询有没有走索引?

7)、能写出一个完整的性能压测报告,报告中除了包括压测场景,性能指标外,还要分析性能的拐点,性能的趋势、当前的性能瓶颈在哪里? 可以给出哪些可行的调优方式等等。

《软件性能测试、分析与调优实践之路》中到底讲了些什么?

《软件性能测试、分析与调优实践之路》 是预计于2020年6~7月份由清华大学出版社出版的侧重于性能调优分析的指导性图书,全书目录如下:

序... 4

1     性能测试和性能分析的基础概念... 5

1.1.     性能测试的基础概念... 5

1.1.1       性能测试的分类... 6

1.1.2       性能测试的场景... 6

1.2.     常见的性能测试指标... 7

1.2.1       响应时间... 7

1.2.2    TPS/QPS. 8

1.2.3       并发用户... 8

1.2.4    PV/UV.. 8

1.2.5       点击率... 9

1.2.6       吞吐量... 9

1.2.7       资源开销... 9

1.3.     性能测试的目标... 10

1.4.     性能测试的基本流程... 11

1.4.1       性能需求分析... 11

1.4.2       制定性能测试计划... 12

1.4.3       编写性能测试方案... 13

1.4.4       编写性能测试案例... 15

2     性能分析与调优思想... 15

2.1      性能分析调优模型... 15

2.2      性能分析调优思想... 18

2.2.1       分层分析... 18

2.2.2       科学论证... 19

2.2.3       问题追溯与归纳总结... 19

2.3      性能调优技术... 22

2.3.1       缓存调优... 22

2.3.2       同步转异步推送... 23

2.3.3       拆分... 23

2.3.4       任务分解与并行计算... 24

2.3.5       代码优化... 24

2.3.6       索引与分库分表... 24

3     服务器的性能监控和分析... 24

3.1      Linux服务器的性能指标监控和分析... 25

3.1.1       通过vmstat深挖服务器的性能问题... 25

3.1.2       如何通过mpstat 分析服务器的性能指标... 29

3.1.3       如何通过pidstat发现性能问题... 31

3.1.4       从lsof中能看到什么... 39

3.1.5       如何通过free看懂内存的真实使用... 49

3.1.6       如何通过top发现问题... 50

3.1.7       网络流量如何监控... 54

3.1.8    nmon对Linux服务器的整体性能监控... 61

3.2      Windows服务器的性能指标监控和分析... 64

3.2.1    Windows性能监视器... 64

3.2.2    Windows性能监视器下的性能分析... 79

4     web中间件的性能分析... 84

4.1      nginx的性能分析和调优... 84

4.1.1    nginx的负载均衡策略的选择... 84

4.1.2    nginx进程数的配置优化... 87

4.1.3    nginx事件处理模型的优化... 87

4.1.4    nginx客户端连接数的优化... 90

4.1.5    nginx中文件传输的优化... 91

4.1.6    nginx中FastCGI配置的优化... 94

4.1.7    nginx的监控... 97

4.2      apache的性能分析和调优... 99

4.2.1    apache的工作模式选择和进程数调优... 99

4.2.2    apache的mod选择和优化... 104

4.2.3    apache的keepAlive优化... 107

4.2.4    apache的ab压力测试工具... 108

4.2.5    apache的性能监控... 111

5     应用中间件的性能分析... 112

5.1      tomcat的性能分析和调优... 113

5.1.1    tomcat的组件以及工作原理... 113

5.1.2    tomcat容器Connector性能参数优化... 118

5.1.3    tomcat容器的I/O优化... 120

5.2      wildfly的性能分析和调优... 125

5.2.1    wildfly standalone模式介绍... 125

5.2.2    wildfly standalone模式管理控制台性能参数优化... 129

5.2.3    wildfly standalone模式性能监控... 140

6     java应用程序的性能分析和调优... 149

6.1      jvm基础知识... 149

6.1.1    jvm简介... 149

6.1.2       类加载器... 151

6.1.3    java虚拟机栈和本地方法栈... 154

6.1.4       方法区与元数据区... 154

6.1.5       堆区... 155

6.1.6       程序计数器... 157

6.1.7       垃圾回收... 157

6.1.8       并行与并发... 162

6.1.9       垃圾回收器... 163

6.2      jvm如何监控... 165

6.2.1    jconsole. 165

6.2.2    jvisualvm.. 173

6.2.3    jmap. 186

6.2.4    jstat 187

6.3      jvm性能分析与诊断... 188

6.3.1       如何读懂gc日志... 188

6.3.2    jstack. 193

6.3.3    MemoryAnalyzer. 200

6.4      jvm性能调优技巧... 211

6.4.1       如何减少gc. 211

6.4.2       另类java内存泄漏... 213

7     数据库的性能分析... 214

7.1      mysql数据库的性能监控... 214

7.1.1       如何查看mysql数据库的连接数... 214

7.1.2       如何查看mysql数据库当前运行的事务与锁... 214

7.1.3    mysql中数据库表的监控... 218

7.1.4       性能测试时mysql中其它常用监控... 222

7.2      mysql数据库的性能定位... 225

7.2.1       慢sql 225

7.2.2       执行计划... 226

8     性能测试案例分析... 229

8.1      jmeter对http 服务的性能压测分析... 229

8.2      LoadRunner对http 服务的性能压测分析... 243

8.3      jmeter对rpc 服务的性能压测分析... 262

8.3.1    jmeter 如何通过自定义Sample来压测RPC服务... 262

8.3.2    jmeter对GRPC服务的性能压测分析... 273

9     安卓APP的性能分析... 281

9.1      adb. 281

9.2      DDMS. 284

9.3      Android Studio profiler 299

9.4   systrace  306

业内专家如何点评《软件性能测试、分析与调优实践之路》

点评1:做技术的人既要能脚踏实地又要能高瞻远瞩,最好还要有归纳整理传授的能力。永清的这本书,讲的透讲的深讲的好用,实在是少有的精品。
点评人简介:蒋彪,工学硕士,06年参加工作,历任上海欧姆龙软件工程师,苏宁易购DevOps研发中心高级架构师,苏宁人工智能研究院高级架构师,现任福特中国研究院软件技术专家。曾在InfoQ等知名学术刊文发表多篇技术论文,在电子工业出版社出版《微服务与Docker实战》《人工智能中台化架构》等书。工作之余兼任南大软件学院客座讲师,南京信息工程大学数理学院客座讲师。在软件研发流程管理,DevOps,中台化架构等领域都有独到见解。

点评2:这是一本融合了研发和测试在一起的关于性能调优实践的图书,非常适合软件测试和研发工程师去品读。

点评人简介: 刘玉辉: 多年研发和架构从业经验,历任Java高级研发工程师、高级架构师、研发经理等职位。先后在1号店个性精准化、苏宁大数据和人工智能研发中心等知名企业及部门工作多年,现主要关注人工智能、图像识别、语义机器人等领域。

点评3:书中关于软件性能调优总结的很透彻,是一本难得的好书。

点评人简介: 程大伟:多年研发、架构、技术管理的从业经验,历任Java高级研发工程师、技术经理、高级架构师、研发经理、研发总监等职位。涉足的行业领域包括公安、金融、互联网、移动通信、大数据等。 目前在紫金普惠信息咨询江苏有限公司任产品架构总监,对于研发和技术管理有着自己独到的见解。

点评4:保障系统稳定性与安全性,软件测试不可忽视,作者把理论与实践结合,沉淀了丰富的知识和经验,给我们带来了很多惊喜。

点评人简介:阿里巴巴高级开发工程师    江荣彬(叶寄)

本书作者简介:从事功能测试、自动化测试、性能测试、Java软件开发、大数据开发、架构师等工作十多年,在自动化测试设计、性能测试设计、性能诊断、性能调优、分布式架构设计等方面积累了多年经验,参与过的系统涉及公安、互联网、移动互联网、大数据、人工智能等领域。先后任职于江苏飞搏软件、苏宁大数据研发中心、苏宁研究院、苏宁人工智能研发中心、紫金普惠研发中心,历任测试经理、技术经理、部门经理、高级架构师等职位,重点关注大数据、图像处理、高性能分布式架构设计等领域,著有《robot framework 自动化测试框架核心指南》。
为了感谢大家支持,博客园短消息发送的第21位和41位 赠送《robot framework 自动化测试框架核心指南》样书一本(自2020年3月10号起),第71位赠送《软件性能测试、分析与调优实践之路》一本(预计7月-8月送出)。
   
   
 
 
 
附推荐序:

推荐序一

和永清认识时他还是一名测试工程师,当时我俩差不多一起入职,后来我发现他除了测试做的很好外,也很有程序员的逻辑思维能力,我就问他想不想转做研发,他没有做任何考虑就同意了,就这样我就把他拉入到了研发队伍中,一起共事有好几年了,永清给我的印象是一个非常踏实的工程师,非常喜欢钻研技术,虽然平时话很少,但是工作特别认真,喜欢脚踏实地的去做,他的这本书我看完后觉得就和他的为人一样,里面的内容虽然没有华丽的辞藻修饰,但是真的非常的实用,都是他平时工作中实践的归纳和总结。

这是一本融合了研发和测试在一起的关于性能调优实践的书,可能也和他自身的经历相关,他是一个“多能工”,功能测试、自动化测试、性能测试、Java开发、大数据开发、架构师这些他都做过。所以这本书既适合于软件性能测试工程师,也非常适合于软件研发工程师、技术经理等去品读。性能调优从我个人的角度来看,我比较认可作者在书中说的不仅仅是测试工程师一个人的事,应该是架构师、研发、运维等多种不同角色都需要去关注的。

我是一个做了多年研发的老工程师,后来又辗转做了多年的架构师。所以从研发和架构的角度来看,我个人非常喜欢书中关于JVM的性能调优部分,讲的非常的透彻,非常适合于很多Java研发工程师去多读读。我个人觉得研发工程师除了写代码外,还需懂得软件性能的重要性,更需要知道如何去写出高性能的代码。

最后作为永清的好朋友,我希望他的这本书可以大卖,也希望这本书能给更多读者带来帮助。

                                    刘玉辉   2020年4月

推荐序二

承蒙作者的信任,我很高兴能为这本关于性能测试、分析与调优的新书撰写序言。

我和作者是多年的朋友,第一次见面我还是一个青涩的开发,作者还是一名Linux系统玩的很“溜”的测试,转眼几个年头作者已成为我司的架构师,很佩服他的学习能力。

性能测试是一个关注度比较高的话题,尤其在一些大公司,由于访问量巨大,时常会造成系统“瘫痪”。如何避免出现性能问题其实是一直贯穿系统开发始终的。所以无论是产品、开发、测试、运维、DBA等角色,都要或多或少了解性能测试的方法论、具体的操作方式以及所使用的测试工具。本书不仅仅从测试的视角出发,还从开发的角度分析系统性能问题,其实所有的性能问题本源在于开发和架构的问题。

     作者考虑到本书的读者不仅仅是测试,还有其他岗位的读者。因此通过多种表现形式,力争使得本书尽可能的全面覆盖各个环节,作者以综述的方式突出了性能测试的关键指标,服务器如何监控与优化配置等等。对于多数读者来说这本书可以作为工具书,可以快速从中找到问题的解决方案。

尽管相对简短,但是本书涵盖了关于性能测试的诸多论题。我认为本书适合多种类型的读者,包括想对性能测试有深入了解的,想对架构和开发是如何影响性能测试的,想对服务器监控有更深入了解的等等。

我十分感谢作者能给我这个机会,我也很认可他的工作态度和学习能力,因此我很欣赏本书的很多内容,希望你们也能喜欢。

程大伟(产品架构总监)2020年4月 

关于软件性能分析调优,可以加微信号yq597365581或者微信号hqh345932,进入专业的性能分析调优群进行交流沟通。

posted @ 2020-03-10 21:26  张永清  阅读(3623)  评论(9编辑  收藏  举报
作者的原创文章,转载须注明出处。原创文章归作者所有,欢迎转载,但是保留版权。对于转载了博主的原创文章,不标注出处的,作者将依法追究版权,请尊重作者的成果。