Kafka request.log中RequestQueueTimeMs、LocalTimeMs、RemoteTimeMs、ThrottleTimeMs、含义

Kafka request.log中RequestQueueTimeMs、LocalTimeMs、RemoteTimeMs、ThrottleTimeMs、含义

要理解各个延时项的含义,必须从Kafka收到TCP请求、处理请求到返回TCP包整个流程开始梳理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ns0shcE7-1688922891392)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709232406001.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y8LKfDFV-1688922891393)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709232659184.png)]

RequestQueueTimeMs

Processor 执行processNewResponses() 方法,不断 poll队列 得到socketchannel 拿到对应的client信息拼接connectionId 执行register(String id, SocketChannel socketChannel),注册Selector上,用于真正的请求获取和响应发送I/O操作

Processor 执行processCompletedReceives 从Selector中提取已接收到的所有请求数据, 如果有对应的socketchannel ,创建Requestnew RequestChannel.Request(processor = id, context = context,... 对象,添加到requestChannel的requestQueue中

override def run(): Unit = {
  startupComplete()
  try {
    while (isRunning) {
      try {
        //建立新链接
        configureNewConnections()
        //注册response写事件
        processNewResponses()
        poll()
        //简单理解成op_read事件
        processCompletedReceives()
        processCompletedSends()
        processDisconnected()
        closeExcessConnections()
      } catch {
        case e: Throwable => processException("Processor got uncaught exception.", e)
      }
    }
  } finally {
    debug(s"Closing selector - processor $id")
    CoreUtils.swallow(closeAll(), this, Level.ERROR)
    shutdownComplete()
  }
}

我们可以看到,在selector中当channel有数据可读时,会调用processCompletedReceives()方法,这个时候 startTimeNanos记录了当前时间[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3px0jfuG-1688922891393)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709233757030.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38U0SZHB-1688922891394)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709233854063.png)]

此时请求已经被封装为req,但是并没有真正的被处理,此时这个请求是被放入了requestQueue中,等待I/O线程进行处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3m311ufZ-1688922891394)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709234112670.png)]

KafkaRequestHandler时请求处理线程类,也是我们之前说的IO线程。每个请求处理线程实例,负责从 SocketServer 的 RequestChannel 的请求队列中获取请求对象,并进行处理。

所以如果RequestQueueTimeMs过高,说明请求进入requestQueue后由I/O线程取出时间过长,可以考虑增加IO线程数量。

LocalTimeMs

请求被取出后,会由KafkaApis中对应的方法进行处理

apis.handle(request)

在最后的finally方法中,记录了apiLocalCompleteTimeNanos

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtbnKncX-1688922891395)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709235239490.png)]

LocalTimeMs正是记录了request真正在broker中处理的时间,也就时本地的处理时间。如果这一步延时较长,需要根据请求类型(Fetch/Produce/OffsetCommit)请求的处理逻辑来分析究竟是哪一部分的具体逻辑导致处理超时了

RemoteTimeMs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ph7GrQhM-1688922891395)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230709235710496.png)]

val apiRemoteTimeMs = nanosToMs(responseCompleteTimeNanos - apiLocalCompleteTimeNanos)

在RequestTime的sendResponse方法中,我们看好了responseCompleteTime被记录了。

在生产环境中,我们经常会看到对于Fetch以及Produce请求,Remote Time可能会达到500ms左右,这是什么原因呢?

当Request被后面的I/O线程处理完成后,还要依靠Processor线程发送Response给请求方。但是要注意,有一些请求不是立即可以回复的,例如Produce请求(ack=-1)以及Fetch请求(设置了min.fetch.bytes/fetch.max.wait.ms)。当要求不被满足时,kafka通过时间轮来处理一些延时操作(例如DelayFetch等)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4mwBWn4i-1688922891395)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710001008208.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mM8J10jD-1688922891396)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710001411243.png)]

我们可以看到,当延时操作真正执行时时,sendResponse方法才会被调用。也就是说对于ack=-1的produce请求以及设置了min.fetch.bytes/fetch.max.wait.ms的Fetch请求(延时操作请求),RemoteTimeMs高的原因往往是可以返回相应的条件没有被满足;对于produce请求(ack=-1),我们可以排查副本间同步的时延是不是比较高(broker间网络带宽);对于Fetch请求,可能是消息不够多满足不了最小的拉取量,等待500ms返回

ThrottleTimeMs

这个指标项记录了请求被流控的时间,往往出现在做分区副本迁移时设置了流控或设置了client/user级别流控时。Kafka内置了一套软流控机制对请求的回包速度进行了限制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPzLQJi7-1688922891396)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710002456500.png)]

如果这个指标较高,那么我们需要看看我们是否配置了相关的流控配置项

ResponseQueueTimeMs

当请求经过一系列处理后真正完成,会被封装为response。此时与request请求一样不会真正被发送,而是被放入到response队列中等待I/O线程取出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9g4m9q6k-1688922891396)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710003105716.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w26mGi5D-1688922891396)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710003141692.png)]

所以这里与RequestQueueTimeMs的意义类似,如果发现这个值比较高,可以可以考虑增加IO线程数量

ResponseSendTimeMs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yfNq26Km-1688922891396)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710003313698.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cU4oCliU-1688922891397)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710003501504.png)]

当Processor将Response返回给Request发送方后,对于有些请求需要将其放入inflightResponses,也就是一个临时的Response队列中。这个队列存在的原因是Fetch/Produce请求的回调逻辑要在 Response 被发送回发送方之后,才能执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrOlmEYA-1688922891397)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710005058479.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HKgzpgyU-1688922891397)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710003912114.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJAHFBNh-1688922891397)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710003844837.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v1F7ACkN-1688922891397)(C:\Users\jimmy\AppData\Roaming\Typora\typora-user-images\image-20230710010545426.png)]
在这里插入图片描述

用一个图来表示

在这里插入图片描述

如果ResponseSendTime较高,表示端到端的时延比较高,要对从broker->客户端以及客户端 ->broker整个链路上的网络问题进行排查(是不是网卡队列阻塞了,broker网络带宽达到瓶颈等)

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

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

相关文章

软件工程师,学习下JavaScript ES6新特性吧

概述 作为一名软件工程师,不管你是不是前端开发的岗位,工作中或多或少都会用到一点JavaScript。JavaScript是大家所了解的语言名称,但是这个语言名称是Oracle公司注册的商标。JavaScript的正式名称是ECMAScript。1996年11月,JavaS…

RT-Thread 互补滤波器 (STM32 + 6 轴 IMU)

作者:wuhanstudio 原文链接:https://zhuanlan.zhihu.com/p/611568999 最近在看无人驾驶的 Prediction 部分,可以利用 EKF (Extended Kalman Filter) 融合不同传感器的数据,例如 IMU, Lidar 和 GNSS,从而给出更加准确的…

Go语言github.com/gorilla/websocket框架websocket协议通信实战

websocket是实际开发中比较常用的应用层协议,本文利用github.com/gorilla/websocket框架进行websocket通信实战。 目录 1.下载github.com/gorilla/websocket 2.websocket服务端 3.websocket Go客户端 4.websocket 网页客户端 5.运行结果展示 1.下载github.com…

Red Hat Subscription 开发者订阅与激活订阅

目录 前言 进入开发者页面 创建红帽账户 阅读Red Hat订阅; 激活订阅 查看订阅状态 前言 使用命令时会出现以提示,命令不可正常使用。 根据提示信息,我们可以知道,需要通过Red Hat Subscription,开发者订阅。 …

图像分类——图像增强方法

目录 常用的图像增强方法tf.image进行图像增强翻转和裁剪颜色变换 使用ImageDataGenerator(进行图像增强) 常用的图像增强方法 tf.image进行图像增强 离线实现 import tensorflow as tf import matplotlib.pyplot as plt import numpy as npcatplt.imread(./cat.jpg) plt.ims…

Scala中的集合

水善利万物而不争,处众人之所恶,故几于道💦 目录 一、集合简介 二、集合关系继承图 一、集合简介 Java中的集合: Scala中的集合: Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合…

单片机基于stm32单片机的数字温度计设计_kaic

摘 要 古往今来,陶瓷在我们的生活中一直都是不可或缺的物品,而随着当今社会经济的快速发展,人们对于这些高档陶瓷产品的使用性能和产品质量上的要求也愈加严格。那么在陶瓷品的生产过程中,想要提高陶瓷品的品质和合格率,能够随时监测温度的温度计是必不可少的。 本课题的研究是…

MySQL单表查询练习题

目录 第一题 第二题 第三题 第一题 1.创建数据表pet,并对表进行插入、更新与删除操作,pet表结构如表8.3所示。 (1)首先创建数据表pet,使用不同的方法将表8.4中的记录插入到pet表中。 mysql> create table pet( name varchar(…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql客户管理系统源码

IDEASpringBootmybatisSSMlayuiMysql客户管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.客户管理4.添加客户5.充值记录管理6.消费记录管理7.客户类型8.添加客户类型 三、部分代码UserMapper.javaLoginController.javaUser.java 四、其他获取源码 一、…

【MQ】Windows上RabbitMQ的安装与启动

文章目录 下载Erlang安装RabbitMQ 下载Erlang RabbitMQ基于Erlang语言,因此使用RabbitMQ之前需要先安装Erlang,如下 Erlang语言下载 这里我是用的是25.2.2这个版本,我的机器是64bit的,所以下win64的即可。 下载完毕安装包之后点…

List移除元素的四种方式

List 移除某个元素 四种方式: 方式一,使用 Iterator ,顺序向下,如果找到元素,则使用 remove 方法进行移除。方式二,倒序遍历 List ,如果找到元素,则使用 remove 方法进行移除。方式…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停

文章目录 问题场景排查过程处理解决事后反思 问题场景 我们的平台服务使用docker部署,使用docker-compose进行管理,部署到CentOS7的服务器里平台部署到客户环境时,一小部分客户,使用自己机房或单独的服务器。很多客户不愿意采购新…

【MySQL】SQL索引失效的几种场景及优化

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度, 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,…

【东南亚情报局】Lazada饰品商家如何做到8倍的增长率

用小小的商品挖呀挖呀挖,在东南亚的市场,种出大大的花~如何抓住东南亚消费者的心巴,踩中时尚节拍,本篇文章《东南亚情报局》一起看看饰品趋势都有哪些特征! 【1.指南篇】 Y2K:Y2K风格在亚洲迅速火爆起来,…

微信小程序精选,多样化的功能与便捷体验

白噪音Pro、魔术字体和天天倒计时,这三款微信小程序正越来越受到我们的欢迎。它们各自具有独特的功能和特点,为我们提供了多样化的体验。现在,让我们一起来详细介绍一下这三款小程序。 首先是白噪音Pro。随着生活节奏的加快和压力的增加&…

【图像处理】Python判断一张图像是否亮度过低

比如: 直方图: 代码: 这段代码是一个用于判断图像亮度是否过暗的函数is_dark,并对输入的图像进行可视化直方图展示。 首先,通过import语句导入了cv2和matplotlib.pyplot模块,用于图像处理和可视化。 i…

LeetCode 203. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 (1)直接使用原来的链表来进行移除节点操作: //不带头结点删除元素节点 class Solution { public:Lis…

【C语言督学营 第十八天】考研408排序大题初探(将排序思想融入题目)

文章目录 题目一分析代码实战 题目二分析代码实战 补充(快排与归并)数据结构大题注意点!!!(评分标准) 题目一 分析 (1)算法的基本设计思想 由题意知,将最小的nl2个元素放在Ai中,其余的元素放在A2中&#x…

vue+elementui实现app布局小米商城,样式美观大方,功能完整

目录 一、项目效果在线预览 二、效果图 1.首页效果图 2.分类,动态分类商品数据根据所属分类动态切换 3.购物车,动态添加购物车(增、删、改、查) 4.我的 5.登录注册 6.商品详情 7.搜索(动态模糊搜索、搜索历史…

如何安装本地Go Tour教程(或者叫A Tour of Go离线版),以及中文版安装不了该怎么办

Go 官方是有一个在线教程 A Tour of Go,可以在线学习 Go 的编程,并且有中文版。英文原版页面如下: 出人意料的是,Go 提供了离线版(各个语言都有),下载安装之后就可以在本地编译运行查看结果&a…