dbaplus社群 02月19日
平均耗时仅 1.5ms 的接口,在超时 100ms 下成功率竟不到 5 个 9 ?!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入分析了平均耗时仅1.5ms的接口,在调用方设置100ms超时的情况下,仍然出现大量超时的现象。通过对RPC调用链路的拆解和监控,发现问题并非出在平均耗时上,而是存在大量超过100ms的长尾效应。进一步排查发现,I/O操作和CPU操作都可能出现偶发性的高耗时。文章提出了弹性超时的解决方案,允许少量请求在一定时间内延长超时时间,从而提高服务质量,适用于网络抖动、GC、CPU抖动等偶发性超时场景。该方案在转转的RPC框架中得到应用,并取得了良好的效果。

⏱️ **RPC调用链路分析**:文章详细介绍了转转RPC框架SCF的调用过程,包括序列化、发送、反序列化、执行等环节,指出任意环节都可能发生抖动导致超时。

📈 **长尾效应与耗时分布**:通过监控发现,接口的平均执行耗时虽低,但存在大量超过100ms的长尾请求,原因可能包括GC、CPU时间片分配等,刷新了对接口耗时的认知。

🔧 **弹性超时解决方案**:针对偶发性超时场景,提出了弹性超时的优化方案,允许少量请求在一定时间内延长超时时间,从而在不影响用户体验的前提下提高服务质量。

📊 **监控与问题排查**:文章强调了监控的重要性,通过对接口内部各个环节进行分段监控,定位了I/O操作和CPU操作容易出现高耗时的问题。

杜云杰 2025-02-19 07:15 广东

验证过程刷新了我们的认知……



分享概要

一、背景

二、验证与分析

1、准备工作

2、验证

3、问题分析

4、排查

5、原因

三、解决方案

1、框架优化-弹性超时

四、总结


一、背景


一个春暖花开的午后,客服技术部佩姐(P)找过来向我们反馈一个问题,如下是我们的对话:




P:云杰,我们最近在治理服务质量,有个接口的成功率达不到公司标准5个9。


我:赞,你们也开始质量治理了,详细说说。


P:我们sccis有个重要的lookupWarehouseIdRandom接口,先查询缓存,未命中的再从数据库查并回写到缓存,平均执行耗时只有1.5ms。现在scoms在调它,超时时间配的还是100ms,结果发现每天还有500多个超时,成功率不到5个9,达不到公司标准。你们框架是不是有问题啊,帮忙看看!


我:不至于吧!?平均执行耗时1.5ms,在调用方超时时间配100ms(60多倍!)的情况下竟然还有这么多超时?


P:真的!!不信你看看!!!


我:看看就看看!



如下开始本篇的研究之旅。


二、验证与分析


1、准备工作


在开始验证之前,先简要介绍下转转RPC框架SCF的调用过程,如下图所示:




如上是一次完整的RPC调用链路。


2、验证


通过监控我们发现接口的平均执行耗时确实在1.5ms左右,如下图所示:



但调用方scoms在超时时间为100ms的情况下确实仍然有很多请求超时:



太让人震惊了!!!


3、问题分析


通过如上的RPC调用过程链路示意,我们可以看出任意一个子过程都可能会发生抖动,造成超时。但我们可以从整体上把链路分为框架和业务两个部分(分界点如图所示):



因为框架耗时复杂多变,不好统计,我们可以统计业务的执行耗时分布,以此来判断问题出在框架上还是出在业务上。



正好服务方的接口有耗时分布监控,通过监控我们发现绝大部分情况都在5ms内处理完成,但仍有314个请求处理时间直接超过了100ms!!!


耗时分布


这个发现也让我们大吃一惊:平均执行耗时1.5ms的接口,竟然还会有这么多请求执行耗时越过100ms!! 那么这些时间都花在哪里了呢?


4、排查


目前的监控都是接口的整体执行耗时,我们需要深入接口内部看看时间都花在哪里了。我们对接口分为如下几个部分,并分段监控起来。



监控结果如下所示:



从结果可以看到:



5、原因


原来我们是被1.5ms给平均了!什么原因会导致这种长尾效应呢?情况可能有很多,GC(极度怀疑)、CPU时间片分配等。如下是sccis的GC监控:



为此,我们也对比了转转商品服务zzproduct的getProductById()接口,发现也有同样的情况:


getProductById()耗时分布



三、解决方案


至此,我们看到业务接口平均执行耗时虽然仅有1.5ms,但仍会出现不少超过100ms的长尾效应,当然框架也会出现。其原因有多种,GC(极有可能)、CPU时间片分配、网络抖动等等。


而这,也确实刷新了我们所有人的认知。


反过来想,如果业务接口要达到公司要求的5个9要求,该怎么办呢?其实很简单,我们可以参照调用方的TP9999来设置超时时间。如下图,scoms调用该接口的TP99999是123ms,而业务把超时时间配置成了100ms,那肯定达不到5个9的标准了。要么把超时时间改为123ms(简单直接),要么优化业务逻辑(目测很难,因为平均执行耗时只有1.5ms)或JVM调优(很有希望)。



1、框架优化-弹性超时


基于本文分析,RPC框架也可以针对这种长尾效应做一定优化:不改变超时时间100ms配置情况下,允许一段时间(可配)一些量(可配)的请求在200ms(可配)时间内返回,既提高了服务质量,又不太影响用户体验,我们称之为弹性超时方案。


1)效果


如下图所示,我们在服务管理平台支持按服务&函数设置弹性超时,这里我们将上文zzscoms调zzsccis的IInventoryWrapCacheFacade.lookupWarehouseIdRandom(List)函数配置成每40秒允许15个请求的超时时间延长至1300毫秒。


弹性超时配置


通过配置弹性超时,我们看到这种偶发性的超时基本被容忍消灭掉了,如下图所示:图片


2)适用场景


弹性虽好,可不要贪杯!它更多适用于一些偶发性超时场景,比如网络抖动、GC、CPU抖动、冷启动等,如果是大面积的超时还是需要深入分析治理。


四、总结


本文深入分析了平均耗时仅有1.5ms的接口也会出现大量100ms+的前因后果,并在框架层面给出了弹性超时的解决方案。这也刷新了我们的认知,由于GC、CPU时间片等原因,一些看起来很简单的操作(如i++)也会出现偶发性长耗时。


作者介绍

杜云杰,高级架构师,转转架构部负责人,转转技术委员会执行主席,腾讯云TVP。负责服务治理、MQ、云平台、APM、分布式调用链路追踪、监控系统、配置中心、分布式任务调度平台、分布式ID生成器、分布式锁等基础组件。


作者丨杜云杰

来源丨公众号:转转技术(ID:zhuanzhuantech)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn


阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

RPC框架 服务治理 弹性超时 性能优化 长尾效应
相关文章