一、超时现象反馈在发布卡点的过程中,有同学反馈发布过程中偶尔会出现超时。集中做上下游节点多的服务,多做几十个、几百个节点的服务。不一定,一批服务偶尔会有一个节点出现。刚出现的前几种情况,因为没有触发threaddump,所以无法定位问题所在。在RPC框架中,如果服务端线程池默认使用了80%以上的线程,就会触发threaddump,方便观察运行状态。直到两个服务触发了转储,谜团才被揭开。2、超时现象跟踪链接日志:客户端AppXXXService调用服务Appxxx超时,最多50秒。服务消费者报错:客户端在等待中取消请求,调用时间为:2021-11-0222:11:59.148耗时监控曲线:服务基本在同一时间段发起下游服务,所有超时发生。服务器端队列监控:队列显示很多任务瞬间添加,磁盘IO和CPU有上升的threaddumps,通信线程调用SynchronizationContext,底层工作通信线程如何调用采集节点的业务方法。3.问题的根本原因是RPC框架中的代码中使用了SynchronizationContext,这里和gRPC分享一下。SynchronizationContext使用的队列是ConcurrentLinkedQueue队列,单线程串行执行。问题原因:回到上面的线程栈,业务节点发现event和gRPC底层通信共享了SynchronizationContext,导致线程阻塞和乱序执行。问题已解决:SynchronizationContext不再与gRPC共享,如果您使用单独的实例,则可以。这个问题是测试同学通过故障注入复现的。
