在高并发大量用户的场景,系统一般会面临如下三个挑战:
1. 日益增长的用户数量
2. 日渐复杂的业务
3. 急剧膨胀的数据
这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一段时间内的请求响应时间从低到高排序,高于95%请求响应时间的下确界)的前提下,不断提高系统吞吐量,提升流量高峰时期的服务可用性。
本文主要目标是为类似的场景提供优化方案,确保系统在流量高峰时期的快速响应和高可用。
性能瓶颈场景
在讲解如何性能优化之前,有必要先了解下性能瓶颈在哪里,以下我们先从瓶颈(各种性能堵塞场景)讲起,明确问题所在,然后我们再根据瓶颈,来看如何来解决方案。
1.长请求拥塞瓶颈
这是一种单次请求时延变长而导致系统性能恶化甚至崩溃的恶化模式。
对于多线程服务,大量请求时间变长会使线程堆积、内存使用增加,最终可能会通过如下三种方式之一恶化系统性能:
线程数目变多导致线程之间CPU资源使用冲突,反过来进一步延长了单次请求时间;
线程数量增多以及线程中缓存变大,内存消耗随之剧增,对于基于Java语言的服务而言,又会更频繁地full GC,反过来单次请求时间会变得更长;
内存使用增多,会使操作系统内存不足,必须使用Swap,可能导致服务彻底崩溃。
典型恶化流程图如下图:
长请求拥塞反模式所导致的性能恶化现象非常普遍,所以识别该模式非常重要。
典型的场景如下:某复杂业务系统依赖于多个服务,其中某个服务的响应时间变长,随之系统整体响应时间变长,进而出现CPU、内存、Swap报警,在分布式环境下,从而引起连锁反应,最后造成雪崩的情况。
系统进入长请求拥塞反模式的典型标识包括:被依赖服务可用性变低、响应时间变长、服务的某段计算逻辑时间变长等。
2.多次请求杠杆造成性能瓶颈
客户端一次用户点击行为往往会触发多次服务端请求,这是一次请求杠杆。
每个服务端请求进而触发多个更底层服务的请求,这是第二次请求杠杆。每一层请求可能导致一次请求杠杆,请求层级越多,杠杆效应就越大。
在多次请求杠杆反模式下运行的分布式系统,处于深层次的服务需要处理大量请求,容易会成为系统瓶颈。
与此同时,大量请求也会给网络带来巨大压力,特别是对于单次请求数据量很大的情况,网络可能会成为系统彻底崩溃的导