架构第七周总结
性能测试,就是模拟用户请求,对系统施加高并发的访问压力,观察系统的性能指标。
系统性能指标主要有响应时间、并发数、吞吐量和性能计数器。
响应时间,是指从发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,最直接地反映了系统的快慢。并发数是指系统同时处理的请求数,这个数字反映了系统的负载压力情况。性能测试的时候,通常在性能压测工具中,用多线程模拟并发用户请求,每个线程模拟一个用户请求,这个线程数就是性能指标中的并发数。吞吐量是指单位时间内系统处理请求的数量,体现的是系统的处理能力。一般用每秒 HTTP 请求数 HPS、每秒事务数 TPS、每秒查询数 QPS 这样的一些指标来衡量。
吞吐量、响应时间和并发数三者之间是有关联性的。并发数不变,响应时间足够快,那么单位时间的吞吐量就会相应的提高。比如说并发数是 1,响应时间如果是 100ms,那么 TPS 就可以是 10。如果响应时间是 500ms,但是 TPS 吞吐量就变成了 2。
性能计数器,指的是服务器或者操作系统性能的一些指标数据,包括系统负载 System Load、对象和线程数、内存使用、CPU 使用、磁盘和网络 I/O 使用等指标,这些指标是系统监控的重要参数,反映系统负载和处理能力的一些关键指标,通常这些指标和性能是强相关的。这些指标很高,成为瓶颈,通常也预示着性能可能会出现问题。当监控系统发现性能计数器超过阈值的时候,就会报警,以便及时发现、处理系统的性能问题。
使用性能测试工具,通过多线程模拟用户请求对系统施加高并发的访问压力,得到以上这些性能指标。事实上,性能测试随着性能测试工具逐渐增加请求线程数,系统的吞吐量和响应时间会呈现出不同的性能特性。具体说来,整个测试过程又可细分为性能测试、负载测试、压力测试三个阶段。
性能测试是指以系统设计初期规划的性能指标为预期目标,对系统不断地施加压力,验证系统在资源可接受的范围内是否达到了性能的预期目标。这个过程中,随着并发数的增加,吞入量也在增加,但是响应时间变化不大。系统正常情况下的并发访问压力应该都在这个范围内。
负载测试则是对系统不断地施加并发请求,增加系统的压力,直到系统的某项或多项指标达到安全临界值。这个过程中,随着并发数的增加,吞吐量只有小幅的增加,达到最大值后,吞吐量还会下降,而响应时间则会不断增加。
压力测试是指在超过安全负载的情况下,增加并发请求数,对系统继续施加压力,直到系统崩溃,或者不再处理任何请求,此时的并发数就是系统的最大压力承受能力。这个过程中,吞吐量迅速下降,响应时间迅速增加,到了系统崩溃点,吞吐量为 0,响应时间无穷大。
稳定性测试是指持续地对被测试系统施加一定的并发访问压力,使系统运行较长一段时间,以此检测系统是否稳定。通常,线上系统的负载压力是不稳定的,有时候,为了更好地模拟线上访问压力,稳定性测试的并发访问压力也可以不断调整压测线程数,在不稳定的并发压力下,测试系统的稳定性。
软件性能优化的两个基本原则
你不能优化一个没有测试的软件(要有测试指标,用数字说话)
你不能优化一个你不了解的软件(对需要优化的软件架构有深入的了解)
性能优化的一般步骤是:首先进行性能测试,根据测试结果进行性能分析,寻找性能的瓶颈点,然后针对瓶颈进行优化,优化完成后继续进行性能测试,观察性能是否有所改善,是否达到预期的性能目标,如果没有达到目标,继续分析新的瓶颈点,不断迭代优化。性能优化的一个前提是需要进行性能测试,了解系统的性能指标,才能有目标地进行性能优化。另一个前提是,必须要了解系统的内部结构,能够分析得到引起性能问题的原因所在,并能够解决问题。
系统性能优化的分层思想
机房和骨干网络性能优化(数据中心优化,异地多活、专线网络、自主 CDN)
服务器与硬件性能优化 (升级 CPU、磁盘、内存、网卡等硬件)
操作系统性能优化 (关闭必要的功能, 修改某些系统参数)
虚拟机性能优化 (例如 JVM)
基础组件性能优化 (Web 容器,数据库连接池,MVC 框架等)
软件架构性能优化的三板斧
缓存 (从内存中获取数据,减少数据库访问;缓存结果,减少计算)
异步 (即时响应,更好的用户体验;控制消费速度,合适的负载压力)
集群 (使很多台服务器对使用者而言看起来像一台服务器)
代码优化
通过各种编程技巧和设计模式提升代码的执行效率,如使用合理的数据结构优化性能,编写性能更好的 SQL 语句以及使用更好的数据库访问方式,实现异步 I/O 与异步方法调用,避免不必要的阻塞,还可以使用线程池、连接池等对象池化技术,复用资源,减少资源的创建。当然最重要的还是利用各种设计模式和设计原则,开发清晰、易维护的代码。
用户体验优化性能优化
让用户有更好的性能体验。同样 500 毫秒的响应时间,如果收到全部响应数据后才开始显示给用户,相比收到部分数据就开始显示,对用户的体验就完全不一样。同样,在等待响应结果的时候,只显示一个空白的页面和显示一个进度条,用户感受到的性能也是完全不同的。
评论