系统性能是互联网应用最核心的非功能性架构目标,系统因为高并发访问引起的首要问题就是性能的问题,高并发访问的情况下,系统因为资源不足,处理每个请求的时间都会变慢,看起来就是性能的变差。
因此性能优化是互联网架构师的核心职责之一,通常我们想到性能优化,首先想到的就是优化代码,事实上,一个系统就是有多个方面组成的,所有这些方面都可以进行优化。
性能优化的一个大前提就是必须知道当前系统的性能状况,然后才能进行性能优化,而了解系统性能状况必须通过性能测试。
性能测试就是模拟用户,对系统进行高并发的访问压力,观察系统的性能指标,系统性能指标主要有响应时间、并发数、吞吐量性能计数器。
响应时间,是指发出请求开发到收到最后响应数据所需要的时间,响应时间是系统最重要的性能指标,最直接反映了系统的快速。
并发数是指系统同时处理处理的请求数,这个数字反映了系统的负载压力情况,性能测试的时候,通常在性能压测工具中,用多线程模拟并发用户请求,每个线程模拟一个用户请求,这个线程数就是性能指标的并发数。
吞吐量是指单位时间内系统处理请求的数量,体现的是系统的处理能力,一般用每秒的HTTP请求数HPS、每秒事务数TPS、每秒查询数QPS这样的一些指标来衡量。
吞吐量、响应时间和并发数三者之间是有关联的,并发数不变,响应时间足够快,单位时间内的吞吐量就会相应的提高。比如说并发数是1,响应时间是100ms,TPS可以是10,。如果响应时间是1000ms,TPS吞吐量变成了1.
性能计数器指的是服务器或者操作系统性能的一些指标数据,包括系统负载System Load、对象和线程数、内存使用、CPU使用、磁盘和网络IO等指标。这些指标都是系统监控的重要参数,反映系统负载和处理能力的一些关键指标,通常这些指标和性能是强关联的。这些指标高的话,通常也预示着性能可能已经出现了问题,在实践中运维和开发人员会对这些指标设置一些报警和阀值。当监控系统发现性能计数器超过阀值的时候,就会向运维和开发人员进行报警处理。
性能测试是使用性能测试工具,通过多线程模拟用户请求对系统施加高并发的请求压力,得到以上这些指标。事实上,性能测试随着性能测试工具逐渐增加请求线程数,系统的吞吐量和响应时间会呈现出不同的性能特性,具体来说,整个测试过程又可以分为性能测试、负载测试、压力测试三个阶段。
性能测试是指系统设计初期规划的性能指标为预期的目标,对系统不断进行添加压力,验证系统在资源可以接受的范围内是否达到性能的预期指标,这个过程中,随着并发数的增加,吞吐量也在增加,响应时间变化不大的情况。
负载测试是对系统不断添加并发请求,增加系统的压力,直到系统的某项或多项指标达到安全的临界值。这个过程中,随着并发数的增加,吞吐量只有小幅度的增加,达到最大值以后,吞吐量还会下降,而响应时间会不断增加变大。
压力测试就是超过安全负载的情况下,增加并发请求数量,对系统继续添加压力,知道系统崩溃,或者不再处理任何请求了,此时并发数就是系统的最大压力承受能力,这个过程中,吞吐量迅速下降,响应时间迅速增加,一直到系统崩溃,吞吐量0。
性能压力测试工具不断增加请求线程数,持续对系统进行性能测试,负载测试、压力测试得到对应的TPS和响应时间。
一个系统是由很多方面构成的,程序只是这个系统的一个小部分,因此进行性能优化的时候,也需要从系统的角度出发,综合考虑方案。
用户体验优化:
性能优化的最终目的是让用户有更好的性能体验,所以性能优化最直接的其实是优化用户体验。同样500毫秒的响应时间,如果收到全部响应数据后才开始显示给用户,相比收到部分数据就开始显示,对用户的体验就完全不一样了,同样在等待响应结果的时候,显示一个空白的页面和显示一个进度条,用户感受性能也是完全不同的。
除了用户体验优化这种比较主观的性能优化,即使想要真正优化性能指标,进行客观的性能优化,也可以从系统的角度出发,全方位考虑系统的各个方面。
数据中心性能优化,开发软件是部署在数据中心的,对于一个访问的互联网应用而言,如果只有一个数据中心,那么最远的用户访问这个数据中心的时候,即使光速进行通信的话,一次请求的响应网络通信也需要130毫秒才能处理完毕。
所以现在大型互联网应用基本都采用多数据中心方案,在全球各个主要区域都部署自己的数据中心,就近进行用户提供服务,加快响应速度。
可以使用垂直伸缩、水平伸缩两种架构方案进行处理。有时候,硬件能力的提升对系统性能的影响是非常大的。
不同系统以及系统内部的某些特性也会对软件性能有重要的影响。分布式计算的某些服务器上,操作系统自身消耗cpu的占比较高。
比如说Java这样的编程语言开发的系统是需要运行在Linux虚拟机上面的,虚拟机的性能对系统的性能也有较大的影响,特别是垃圾回收,可能会导致应用程序出现巨大的卡顿。
在虚拟机之下,应用程序之上,依赖的各种基础组件,比如说Web容器,数据库连接池,MVC框架等等,这些组件的性能也会对系统性能有较大的影响。
技术架构的优化方案,比如说:缓存、消息队列、集群等
通过从缓存读取数据,加快响应时间,减少后端计算的压力,缓存主要是提升读的性能。
通过数据写入消息队列,异步进行计算的处理,提升系统的响应时间和处理速度,消息队列主要是提升写的性能。
单一的服务器进行伸缩,构建成一个集群完成同一种计算任务,从而提高系统的高并发压力的性能。各种服务器都可以构建集群、缓存集群、数据库集群等等。
数据结构的优化、sql语句的优化、异步编程Io的处理等。
此外还可以使用线程池、连接池等对象池的技术,复用资源、减少资源的创建。设计模式的使用,开发清晰、易懂的代码。
小结:
性能优化的顺序:性能测试、根据性能测试结果进行性能的分析,寻找性能瓶颈点,针对瓶颈进行优化的处理,优化完成后继续进行性能测试,观察性能是否有改善,是否达到预期的性能目标,如果没有达到目标,继续分析瓶颈点,迭代优化处理。
性能优化的一个前提是进行性能的测试,了解系统的性能指标,才能有目标进行性能优化,必须要了解系统的内容部结构,能够分析得到引起性能问题的原因所在,并解决问题。