问题排查-线上CPU300%排查过程(dubbo引起的)
2023-04-18 12:54:13 时间
概述
监控告警发现线上某台服务器cpu300%,下面记录排查过程
查看服务器情况
top
查看哪个线程cpu占用高
ps -mp 39954 -o THREAD,tid,time|sort -r|head -n 30
转换 线程id为16进制
printf "%x
" 40009
9c49
查看问题堆栈信息
jstack 39954|grep 9c49 -A 15
分析堆栈信息 由上图可以看出,是线程名为 “DubboSaveRegistryCache-thread-1” 线程占用线程过高,根据堆栈信息查看代码 dubbo 问题的代码位置在 AbstractRegistry 152 行
com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:152)
查看代码
private final ExecutorService registryCacheExecutor = Executors.newFixedThreadPool(1, new NamedThreadFactory("DubboSaveRegistryCache", true));
public void doSaveProperties(long version) {
if (version < lastCacheChanged.get()) {
return;
}
if (file == null) {
return;
}
// Save
try {
File lockfile = new File(file.getAbsolutePath() + ".lock");
//创建问题出现问题 抛出异常
if (!lockfile.exists()) {
lockfile.createNewFile();
}
//其他代码省略
} catch (Throwable e) {
if (version < lastCacheChanged.get()) {
return;
} else {
//异常处理 继续进入该方法 形成死循环
registryCacheExecutor.execute(new SaveProperties(lastCacheChanged.incrementAndGet()));
}
logger.warn("Failed to save registry store file, cause: " + e.getMessage(), e);
}
}
private class SaveProperties implements Runnable {
private long version;
private SaveProperties(long version) {
this.version = version;
}
@Override
public void run() {
doSaveProperties(version);
}
}
分析代码可以看出,dubbo在创建缓存配置文件的时候出现错误,抛出异常后,继续放在线程池里面处理,形成了死循环
会是dubbo的问题吗? 会是dubbo的问题吗,我去github 搜索 issues 查看是否有人提出改问题,查询发现官方已经有人向官方提出这个问题 #3748
官方解决方案(2.7.2/2.5.10)修复
我们项目为什么会触发该问题
引起该问题的关键是缓存文件的配置 dubbo.registry.file ,查看我们配置发现 dubbo.registry.file 配置确实有问题,改正后消失,在官方没有修复这个错误之前的版本,我们使用这个配置一定要小心
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击