RocketMQ问题篇02 | Broker存储过慢异常分析

RocketMQ问题篇01 | Broker存储过慢异常分析

  • 1、问题描述
  • 2、磁盘IO分析(排除硬件问题)
  • 3、刷盘源码分析(排除刷盘逻辑)
  • 4、macloud的告警源代码分析(定位至pageCache有问题)
  • 5、操作系统排查(排除mmap对应操作系统内存分配产生缺页中断、刷盘脏页回写可能导致的情况)
  • 6、结合堆栈日志进一步进行rocketmq源码分析(分析rocketmq中pageCache逻辑)
  • 7、DLedgerCommitLog的逻辑分析(分析rocketmq中DLedger模块pageCache逻辑)
  • 8、[问题解决] Subbmit PR to Github To fixed DLedger pagecachert overtime

1、问题描述

钉钉告警触发时间:2022年7月26日 22:24

钉钉告警触发内容:
在这里插入图片描述
背景描述:发生告警时候排查了另外一台master集群的几点,其正常。

2、磁盘IO分析(排除硬件问题)

   提交了阿里云工单,并通过iostat、iotop等命令监测了磁盘io情况,排除磁盘问题;

在这里插入图片描述
在这里插入图片描述

3、刷盘源码分析(排除刷盘逻辑)

线上刷盘的配置
在这里插入图片描述
大总结:broker启动的时候会启动一个异步线程,用于处理消息的刷盘逻辑,(故:告警系统中刷盘超时误导性提示)代码如下:
在这里插入图片描述
在这里插入图片描述
此处的StoreType比较重要,rocketmq有两种数据处理方式:FILE、MEMORY,公司使用FILE-MMAP机制;

在这里插入图片描述
在这里插入图片描述
启动了一个异步线程来执行刷盘逻辑,Thread.sleep(interval);默认配置500ms,读取配置参数syncFlushTimeout以下是具体逻辑:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

4、macloud的告警源代码分析(定位至pageCache有问题)

   根据异步刷盘告警,根据第3点刷盘逻辑,其异步操作且没有线程阻塞逻辑,排除异步刷盘逻辑问题;

此处的告警错误:不应该提示刷盘超时,应提示:写入pageCache超时

在这里插入图片描述

5、操作系统排查(排除mmap对应操作系统内存分配产生缺页中断、刷盘脏页回写可能导致的情况)

排查其缺页中断、脏页回写的场景:

步骤1:消息写入:

第一次发消息 -> 生成内存映射文件new MappedFile(nextFilePath, this.mappedFileSize);--产生缺页中断

第2次发消息 -> 从文件队列获取到mappedFile,追加写入新消息;

第N次发消息 -> 从文件队列获取到mappedFile发现文件已满,生成下一个内存映射文件new MappedFile(nextFilePath, this.mappedFileSize);--产生缺页中断

步骤2:消息刷盘

 详细见异步刷盘逻辑,攒500毫秒数据,超过16kb则执行刷盘,不够则一直攒数据,10秒后还没攒够16kb数据则强制刷盘;-–产生脏页回写

内存分页监控(https://www.5ibc.net/centos/157.html)

sar -B 1 10 --每1秒采样一次,连续采样10次,监控内存分页:
在这里插入图片描述在这里插入图片描述
输出项说明:
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

6、结合堆栈日志进一步进行rocketmq源码分析(分析rocketmq中pageCache逻辑)

堆栈日志:根据log日志putMessage not in lock分析,其告警信息会被触发,但是其逻辑实际为page cache,此异常会出现业务端少部分消息无法发送成功(业务也有发送失败日志),根据源码最终定位最有可能的是写入pageCache超时;
在这里插入图片描述
定位至日志打印的代码位置:

final AtomicLong[] times = this.initPutMessageDistributeTime();是返回上次收集的数据,直接打印。
在这里插入图片描述
broker启动时会运行此线程,属于异步打印,60秒执行一次(上图503行):
在这里插入图片描述
分析:[<=0ms]:0 [0~10ms]:4 [10~50ms]:0 [50~100ms]:0 [100~200ms]:0 [200~500ms]:0 [500ms~1s]:0 [1~2s]:0 [2~3s]:0 [3~4s]:0 [4~5s]:0 [5~10s]:0 [10s~]:1

final AtomicLong[] times = this.putMessageDistributeTime; 统计各个时间段内的数量,根据不同档位+1计数
long value参数是耗时具体多少毫秒,放入对应的档位中;
在这里插入图片描述
先看一下日志:
在这里插入图片描述
elapsedTime耗时高达38秒,放入大于10秒的统计档位中。
putResultFuture.thenAccept会等待this.commitLog.asyncPutMessage(msg);执行完成,所以耗时在这里:
在这里插入图片描述
检查commitLog的实现,线上配置走DLedgerCommitLog逻辑,如下。
在这里插入图片描述
在这里插入图片描述

7、DLedgerCommitLog的逻辑分析(分析rocketmq中DLedger模块pageCache逻辑)

在这里插入图片描述
在这里插入图片描述
主 写入pageCache的逻辑。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、[问题解决] Subbmit PR to Github To fixed DLedger pagecachert overtime

https://github.com/apache/rocketmq/issues/4814

在这里插入图片描述
在这里插入图片描述
提交PR,合并请求通过。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/367795.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用apifox创建一个Mock Server Api 接口

安装 下载 Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能&#xff0c;接口开发、测试、联调效率&#xff0c;提升 10 倍。最好用的接口文档管理工具&#xff0c;接口自动化测试工具。 创建mock api项目中使用 创建项…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

短剧小程序开发:打造高效、便捷的娱乐体验

随着移动互联网的普及和用户需求的多样化&#xff0c;短剧小程序作为一种新型的应用形态&#xff0c;逐渐受到了广大用户的青睐。短剧小程序开发旨在为用户提供一种高效、便捷的娱乐体验&#xff0c;让用户在忙碌的生活中轻松享受到精彩的短剧内容。本文将探讨短剧小程序开发的…

备战蓝桥杯---搜索(BFS基础1)

如果DFS是时光回溯&#xff0c;那么BFS则是影子分身。 下面是它的定义&#xff1a; 下面直接看题&#xff1a; 十分经典&#xff0c;在这注意存的时候可以用i*mj的形式&#xff0c;可以当作模板&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using name…

卡诺图:逻辑相邻与几何相邻的统一

文章目录 1.一句话记住卡诺图2.卡诺图的由来、定义和特点3.填写卡诺图&#xff08;用卡诺图表示逻辑函数&#xff09;⑴根据真值表填写卡诺图⑵根据最小项&#xff08;或最大项&#xff09;填写卡诺图⑶根据函数的与或表达式填写卡诺图 4.用卡诺图化简逻辑函数⑴化简步骤⑵画圈…

c#的反汇编对抗

文章目录 前记nim攻防基础FFI内存加载加解密、编码 后记C#类型转换表nim基础 前记 随便编写一个c#调用winapi并用vs生成dll,同时用csc生成exe using System; using System.Runtime.InteropServices; namespace coleak {class winfun{[DllImport("User32.dll")]publ…

AutoCAD .NET 层次结构介绍

AutoCAD .NET API 提供了一种面向对象的编程接口&#xff0c;通过它可以与AutoCAD进行深度集成和自定义功能开发。以下是基于.NET框架下AutoCAD对象层次结构的基本介绍&#xff1a; Autodesk.AutoCAD.ApplicationServices 命名空间 根对象&#xff0c;代表运行中的AutoCAD应用程…

模板简要介绍,C++读书笔记

2014年2月3日 内容整理自《程序设计教程&#xff1a; 用C语言编程 第三版》 陈家骏 郑滔 --------------------------------------------------------------------------------------------------------------------------------- &#xff08;一&#xff09;函数模板 1…

苹果的ipad可能会缓存vue项目的数据或者pinia数据

如果你发现开发的vue项目在ipad上出现了异常&#xff0c;比如数据出现NaN的情况&#xff0c;或者computed计算属性没生效&#xff0c;或者pinia里面的数据没生效&#xff0c;可能就是ipad浏览器safari缓存了数据导致的&#xff0c;只需要清空safari里面缓存的数据就可以了&…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort)&#xff1a; 代码详解&#xff1a; 冒泡排序的优化&#xff1a; 选择排序(SelectSort)&#xff1a; 代码详解&#xff1a; 插入排序&#xff08;InsertSort&#xff09;&#xff1a; 代码详解&#xff1a; 希尔排序(ShellSort)&#xff1a; 法一…

深度学习图像分类相关概念简析+个人举例1(ANN相关概念与计算)

&#xff08;1&#xff09;神经网络&#xff1a;英文全称Artificial Neural Network&#xff0c;简称为ANN。 神经网络是一种模仿人脑神经元结构和功能的人工智能模型。它由多个神经元&#xff08;也称节点、单元&#xff09;组成&#xff0c;每个神经元通过计算输入和权重的线…

从零开始复现GPT2(六):生成代码的实现

源码地址&#xff1a;https://gitee.com/guojialiang2023/gpt2 GPT2 模型文本生成配置生成框架文本生成类实现文本生成代码 模型 文本生成 配置 class GenerateConfig(object):def __init__(self,seq_len: int,nucleus_prob: float,use_gpu: bool):self.seq_len seq_lenself…

【C/C++ 10】扫雷小游戏

一、题目 写一个扫雷小游戏&#xff0c;每次输入一个坐标&#xff0c;若该处是地雷&#xff0c;则游戏失败&#xff0c;若该处不是地雷&#xff0c;则显示周围地雷数量&#xff0c;若扫除全部非地雷区域&#xff0c;则扫雷成功。 二、算法 设置两张地图&#xff08;二维数组&…

手把手教你开发Python桌面应用-PyQt6图书管理系统-主界面UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

移远(Quectel)物联网通信解决方案

一、方案简介 无线通信模块是具备无线通信的电路模块&#xff0c;它能通过无线连接传输数据&#xff0c;能识别分析主控制器发来的命令&#xff0c;控制节点设备的工作&#xff0c;或者向主控制器发送当前节点设备的工作状态。 市面上常用的无线通信模组包括蓝牙模组、WLAN模…

2024年【上海市安全员B证】最新解析及上海市安全员B证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员B证最新解析根据新上海市安全员B证考试大纲要求&#xff0c;安全生产模拟考试一点通将上海市安全员B证模拟考试试题进行汇编&#xff0c;组成一套上海市安全员B证全真模拟考试试题&#xff0c;学员可通过…

算法练习-二叉树的节点个数【完全/普通二叉树】(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

ubuntu22.04 安装部署01:禁用内核更新

一、前言 ubunut22.04系统安装以后&#xff0c;内核更新会导致各种各样的问题&#xff0c;因此锁定初始安装环境特别重要&#xff0c;下面介绍如何锁定内核更新。 二、操作方法 2.1 查看可用内核 dpkg --list | grep linux-image dpkg --list | grep linux-headers dpkg --…

STM32--USART串口(2)串口外设

一、USART简介 可配置数据位&#xff1a;不需要校验就是8位&#xff0c;需要校验就选9位&#xff1b; 停止位&#xff1a;决定了帧的间隔; STM32F103C8T6USART&#xff1a;USART1挂载在APB2总线上&#xff0c;USART2和USART3挂载在APB1总线上&#xff1b; 二、USART框图 TXE…

Python中使用Opencv-python库绘制直线、矩形、圆、文本

Python中使用Opencv-python库绘制直线、矩形、圆、文字 在Python中使用Opencv-python绘制直线、矩形、圆、文本非常简单&#xff0c;分别使用到line、rectangle、circle、putText这几个函数&#xff0c;具体可以参考https://docs.opencv.org/4.9.0/d6/d6e/group__imgproc__dra…