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网络带宽达到瓶颈等)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

感想:由于看不懂官方代码的原因,自己这方面耽误了一段时间,一方面,在AI与经济学之间犹豫了许久,另一方面,工作 了半年,也没发工资,没空找培训代码的课程,所以停止更新了三…

wx.getUserProfile too frequently 问题

接口调用频率规范 概念介绍 小程序wx接口可分为“普通接口”和“限频接口”。 “限频接口”指的是一个用户在一段时间内不允许频繁调用的wx接口,此类接口一般会调用到微信后台系统资源,为了保护系统,同时防止用户资源被滥用,开…

软件测试基础概念

什么是需求 什么是需求?简单来说就是我想吃饭,这件事就是我的需求,我不想上课,这也是我的需求。对于软件测试来说,需求可以分为用户需求和软件需求。 用户需求 用户需求简单可以理解为甲方提出的要求,如…

git基础教程(linux)

1.git简介 git 分布式版本控制 git两大特点: 版本控制:支持多人同时开发 分布式: 2.安装与配置 安装 sudo apt-get install git安装成功,运行如下命令: git3.创建一个版本库 (1)新建一个目录git_test&#xff0c…

zabbix服务部署

文章目录 zabbix1 zabbix简介1.1 组成部件1.2 监控原理1.3 Zabbix 6.0新特性1.4 Zabbix6.0功能组件1.4.1 Zabbix Server1.4.2 数据库1.4.3 Web界面1.4.4 Zabbix Agent1.4.5 Zabbix Proxy1.4.6 Java Gateway 2 部署zabbix服务端2.1 部署Nginx2.2 安装PHP2.3 修改Nginx配置2.4 修…

找工作不用愁!送你一份Salesforce顾问面试秘籍(下)(含答案)

作为SaaS行业的先驱,Salesforce的发展一路高歌猛进。在Salesforce生态系统中不仅能学习到最新的技术,而且比其他行业的同岗位享有更高的薪水,这也驱使了越来越多人加入Salesforce大军。 在之前的文章中,自由侠部落为学习者梳理了…

奥威BI-金蝶云星空SaaS版一站式平台:对接数据、做分析

金蝶云星空和BI大数据分析平台都在企业数字化转型中扮演了重要的角色,为企业提供了全面的数字化解决方案和数据分析功能,两者强强联合不仅能提高部署效率,更能增强数据分析、数据可视化效果,帮助企业更好地适应市场变化和用户需求…

Arcgis Pro NDVI(植被指数)导出RGB

在arcgis中计算的NDVI栅格数据,取值范围为-1到1,直接导出JPG或者PNG,会出现导出错误的问题: 导出出错, 设置导出格式为TIFF,然后选中使用渲染器,勾选强制RGB颜色,即可导出你选择的色…

【C++STL】list的反向迭代器

list的反向迭代器 文章目录 list的反向迭代器reverse.h疑问1:为什么在迭代器当中不需要写深拷贝、析构函数疑问2:为什么在迭代器当中需要三个模板参数?疑问3:反向迭代器是怎么实现的?疑问4:为什么*解引用不…

创建UI组件库后上传NPM

上篇已经讲了如何创建自己的组件库,这篇讲怎么上传npm后,可以下载使用 1.首先看下组件的文件结构 在index.js中要写上每个组件可以按需引用的条件 import Button from "./src/button";Button.install function(Vue) {Vue.component(Button.…

Kubernetes 容器类型 Init - pause - sidecar - app容器

目录 Kubernetes 的容器类型 Init 初始化容器 参考文档:Init 容器 | Kubernetes 使用 Init 容器的情况 案例:定义了一个具有 2 个 Init 容器的简单 Pod 你通过运行下面的命令启动 Pod: 发现两个Init容器都没有运行成功 查看更多详细…

Mycat【什么是Mycat、Mycat与其他中间件区别、Mycat应用场景、核心概念详解、Mycat原理】(一)-全面详解(学习总结---从入门到深化)

目录 Mycat概述_什么是Mycat Mycat概述_Mycat与其他中间件区别 Mycat概述_Mycat应用场景 Mycat概念_核心概念详解 Mycat概述_Mycat原理 Mycat部署安装_MySQL主从复制概述 Mycat概述_什么是Mycat 什么是Mycat Mycat是数据库中间件,所谓中间件数据库中间件是连…