前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >问题排查-线上CPU300%排查过程(dubbo引起的)

问题排查-线上CPU300%排查过程(dubbo引起的)

作者头像
颍川
发布2021-12-06 15:52:50
7320
发布2021-12-06 15:52:50
举报
文章被收录于专栏:颍川颍川

概述

监控告警发现线上某台服务器cpu300%,下面记录排查过程

查看服务器情况

代码语言:javascript
复制
top
在这里插入图片描述
在这里插入图片描述

查看哪个线程cpu占用高

代码语言:javascript
复制
 ps -mp 39954 -o THREAD,tid,time|sort -r|head -n 30
进程中那个线程cpu占用高
进程中那个线程cpu占用高

转换 线程id为16进制

代码语言:javascript
复制
printf "%x\n" 40009
9c49
转换
转换

查看问题堆栈信息

代码语言:javascript
复制
 jstack 39954|grep 9c49 -A 15
jstack
jstack

分析堆栈信息 由上图可以看出,是线程名为 “DubboSaveRegistryCache-thread-1” 线程占用线程过高,根据堆栈信息查看代码 dubbo 问题的代码位置在 AbstractRegistry 152 行

代码语言:javascript
复制
 com.alibaba.dubbo.registry.support.AbstractRegistry.doSaveProperties(AbstractRegistry.java:152)

查看代码

代码语言:javascript
复制
    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

github
github

官方解决方案(2.7.2/2.5.10)修复

官方修复日志#3748

官方解决方案
官方解决方案

我们项目为什么会触发该问题

引起该问题的关键是缓存文件的配置 dubbo.registry.file ,查看我们配置发现 dubbo.registry.file 配置确实有问题,改正后消失,在官方没有修复这个错误之前的版本,我们使用这个配置一定要小心

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 我们项目为什么会触发该问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档