{{format('0')}} {{format('235')}} {{format('2436')}}

高性能并发队列Disruptor队列策略占用CPU过高调试笔记 [ 技术杂谈 ]

九叶的小窝 文章 正文

As Long As You Love Me.
分享

九叶

{{nature("2022-09-26 16:59:25")}}更新

1. 原因

前几天晚上同事突然和我说新开的服务器CPU占用率过高预警

后来经过排查是有个服务的线程长时间占用一颗CPU核心

2. 排查问题

2.1 使用top命令分析线程信息

top -Hp pid

查询到线程ID为18735长时间占用CPU

2.2 保存线程栈信息

jstack pid > /tmp/threadStack.log

2.3 在线程栈中查找线程信息

将线程 18735转换为十六进制得到 492f

cat /tmp/threadStack.log | grep -A 10 '492f'

问题线程信息

找到问题原因是 disruptor消息队列的 YieldingWaitStrategy类下的 waitFor方法的问题 该方法为等待策略方法

粗略的看了下方法内容 应该是为了保持高性能实时性的队列服务所以占用资源过多

3. 解决问题

定位代码

该方法定义了队列服务使用什么等待策略(WaitStrategy)

我们将方法修改为即可

    @Bean
    public Disruptor<PersonalReportEvent> disruptor(){
        return new Disruptor<>(PersonalReportEvent::new,
                2*1024, DaemonThreadFactory.INSTANCE, ProducerType.SINGLE, new BlockingWaitStrategy());
    }

4. 验证

后经测试 YieldingWaitStrategy 策略十二线程 占用9%-10%

后经测试 BlockingWaitStrategy 策略十二线程 占用0%-1%

评论 0
0
{{userInfo.data?.nickname}}
{{userInfo.data?.email}}
TOP 2
Minecraft | [1.12.2] 核电工艺模拟器 1.2.25 —— 汉化版

{{nature('2021-12-07 15:29:00')}} {{format('2465')}}人已阅读

TOP 3
SSM搭建Spring单元测试环境

{{nature('2021-01-31 20:01:00')}} {{format('1049')}}人已阅读

TOP 4
dispatcher-servlet.xml文件配置模板

{{nature('2020-12-11 21:17:00')}} {{format('965')}}人已阅读

TOP 5
Windows平台Nacos启动报错无法创建Bean实例

{{nature('2021-04-22 15:16:00')}} {{format('943')}}人已阅读

目录

标签云

JVM Debug Java

一言

# {{hitokoto.data.from || '来自'}} #
{{hitokoto.data.hitokoto || '内容'}}
作者:{{hitokoto.data.from_who || '作者'}}
自定义UI
配色方案

侧边栏