某日应用收到,从错误日志可以看到是远程调用 dubbo keeper 上报监控信息时报错:
登录到 dubbo keeper 的服务器查看,发现 CPU 耗尽:
非常幸运 ,Java进程还在,赶紧做一个 jstack ,发现大量线程的堆栈信息如下:
通过搜索堆栈的上下文发现和这篇文章的分析是一致的 : https://www.cnblogs.com/flystar32/p/6751895.html
整个流程下来就是说在消费速度跟不上生产速度的时候,生产线程做了无限重试,重试间隔为1 nano,这个1 nano 会导致线程被频繁休眠/唤醒,造成kernal cpu 利用率高,context switch已经达到了cpu的极限,进而导致写log的线程的线程获取cpu时间少,吞吐量下降。