作者简介
罗茂林,携程国际机票后台研发总监,主要负责国际机票引擎的研发工作。致力于系统性能优化和研发效率提升。
一般情况下,在计算密集型服务中,即使处理单个请求也需要使用到服务器的所有CPU。如果单台服务器连续接收到两个请求,要么两个请求互相争抢CPU,要么后来的请求排在前面的后面等待处理。最终,会导致平均处理时间变长。常规的负载均衡策略(如轮询、随机等)下,负载均衡器不关心服务器的负载情况,这就很容易造成服务器同时收到多个请求,从而使服务器的服务质量下降。
一、背景
有一天,携程国际机票查询引擎经过一次改造后,虽然平均响应时间得到了提升,但是响应时间也有非常大的波动。从监控图上看,非常明显的尖刺持续存在。如下图:
经过分析,我们发现这次改造深度优化了服务的并行计算能力,使得引擎成为了一个完全的计算密集型服务,它的最大并发处理能力为1。然而,我们却没有相应的修改负载均衡策略,而是继续使用的轮询策略。
对于计算密集型服务,如果使用轮询策略,有如下三种情况:
理想情况是连续两个请求之间无间隔、无重叠,既下一个请求刚好在上一个请求处理完成的时刻到达。这种情况下,后来的请求没有等待时间,服务器也没有空闲时间,得到了充分的利用。