性能调优(2)—— 架构

Posted by 皮皮潘 on 05-05,2022

性能指标

指标名称定义作用
响应时间从发出请求到最后响应数据所需要的时间系统最重要的性能指标,最直接地反映了系统的快慢
并发数系统同时处理的请求数反映系统的负载压力情况,性能测试的时候,通常每个线程模拟一个用户请求,这个线程数就是性能指标中的并发数
吞吐量单位时间内系统处理请求的数量体现系统的处理,一般用每秒HTTP请求书HPS,每秒事务数TPS,每秒查询数QPS这样的一些指标来衡量

吞吐量、响应时间和并发数三者之间是有关联性的。吞吐量=并发数÷响应时间。并发数不变,响应时间足够快,那么单位时间的吞吐量就会相应地提高。

性能测试

性能测试就是使用性能测试工具,通过多线程模拟用户请求,对系统施加高并发的访问压力,得到以上这些性能指标。事实上,随着请求线程数,即并发数逐渐增加,系统的吞吐量和响应时间会呈现出不同的性能特性。具体说来,整个测试过程又可细分为性能测试负载测试压力测试三个阶段。

性能测试是以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受的范围内是否达到了性能预期目标。这个过程中,随着并发数的增加,吞吐量也在增加,但是响应时间变化不大。系统正常情况下的并发访问压力应该都在这个范围内。

负载测试则是对系统不断施加并发请求,增加系统的压力,直到系统的某项或多项指标达到安全临界值。这个过程中,随着并发数的增加,吞吐量只有小幅的增加,达到最大值后,吞吐量还会下降,而响应时间则会不断增加。

压力测试是指在超过安全负载的情况下,增加并发请求数,对系统继续施加压力,直到系统崩溃或不再处理任何请求,此时的并发数就是系统的最大压力承受能力。这个过程中,吞吐量迅速下降,响应时间迅速增加。到了系统崩溃点,吞吐量为 0,响应时间无穷大。

1917_1.png

性能优化

架构方面针对性能的核心优化思路有三个:1. 通过横向扩展结合负载均衡的方式降低单一服务器的负载压力 2. 通过缓存的方式降低系统的读负载压力 3. 通过消息队列的方式降低系统的写负载压力

负载均衡

所谓负载均衡,就是对于应用服务器进行横向扩展,将高并发的用户请求分发到多台应用服务器组成的一个服务器集群上,利用更多的服务器资源处理高并发下的计算压力,提升整体的性能指标,但是由于所有用户的请求都会先到达负载均衡服务器,因此此时负载均衡服务器往往会成为一个新的瓶颈

而负载均衡器又主要分为三种类型,其性能依次从低到高分别为:应用层负载均衡服务器、IP负载均衡服务器、链路层负载均衡服务i其

对于应用层负载均衡服务器而言,当用户的请求到达负载均衡服务器后,它会从应用服务器集群中选择一台服务器 ,然后对该服务器发起HTTP请求调用。该服务器处理完成后,将响应内容返回给负载均衡服务器,再由负载均衡服务器返回给用户

对于IP负载均衡服务器而言,当用户的请求到达负载均衡服务器后,它会将用户请求数据包中的目标IP改写为应用服务器集群中一台服务器的IP并转发给目标服务器,并且当应用服务器处理完成后,将响应数据包中的源IP改写为负载均衡服务器的IP,最后发还给用户(本质上就是NAT)

对于链路层负载均衡而言,当用户的请求到达负载均衡服务器后,它并不修改请求数据包的 IP 地址,而是修改数据链路层里的网卡 mac 地址,再转发给目标应用服务器,而在应用服务器处则通过虚拟IP的方式,设置自身的虚拟IP与负载均衡服务器的IP一致从而可以接受到达应用服务器的数据包,应用服务器返回响应数据的时候,因为 IP 地址没有修改过,所以这个响应会直接到达用户的设备,而不会再经过负载均衡服务器。

分布式缓存

使用分布式缓存可以减少不必要的计算与IO,快速响应用户请求,进而改善系统的读操作性能,常见的分布式缓存有三种:CDN、反向代理和分布式对象缓存。

CDN(Content Delivery Network)即内容分发网络。当用户上网的时候都需要移动、电信这样的网络服务商提供网络服务,而这些服务商需要在全国范围内部署骨干网络、交换机机房,才能完成网络连接服务。因为这些交换机机房可能会离用户非常近,因此互联网应用可以在这些交换机机房中部署对应的缓存服务器,从而使得用户可以近距离获得自己需要的数据,既提高了响应速度,又节约了网络带宽和服务器资源。

反向代理是在应用程序服务器前的代理服务器,所有的网络请求都需要通过反向代理才能到达应用程序服务器,因此可以在反向代理处加一个缓存,尽快将数据返回给用户,而不是发送给应用服务器,这就是反向代理缓存

CDN 和反向代理缓存对应用程序是透明的,通常被当做系统前端的一部分。而应用程序如果要使用缓存,就需要分布式对象缓存,例如:Redis、MemCache等

消息队列

优化写操作性能的主要手段是使用消息队列,将写操作异步化,应用服务器收到用户写操作请求后,不是直接调用数据库,而是将写操作请求发送给消息队列服务器,再由消息消费者服务器从消息队列服务器消费消息,完成对数据库的写操作。

这样会带来两个好处:

  1. 用户请求发送给消息队列就可以直接返回响应给用户了,而消息队列服务器的处理速度要远远快于数据库,用户端的响应时间可以极大缩短;
  2. 消息队列写数据库的时候,可以根据数据库的负载能力控制写入的速度,即使用户请求并发很高,也不会导致数据库崩溃,消息队列可以使系统运行在一个性能最优的负载压力范围内。

消息队列将直接调用的高峰访问压力推迟到访问低谷的时候处理,使系统保持在性能最优的状态下运行,这种在用户请求高并发的时候控制处理速度,在用户请求低谷的时候,继续处理请求的方式也被称作削峰填谷

小结

上述的三种高性能架构是最常用的架构性能优化手段,可以解决大多数系统架构性能问题。但是性能优化是一个系统的工程,它并不是只能优化架构与代码

对于一个全球用户访问的系统,在全球各地部署多个数据中心,就近为用户服务可以极大降低网络传输的延迟,提升性能;对于一些少量而重要的数据计算,使用更好的 CPU、更大的内存、更快的硬盘,也就是说,进行垂直伸缩,也可以极大改善性能;而对操作系统、虚拟机进行参数优化,对使用的第三方软件包进行升级改造,有时候也会对性能实现成倍的提升

参考

  1. 《高并发架构实战课》