Kafka效率篇-提升效率三板斧

news2024/10/5 20:21:33

kafka在效率上做了很多的努力。最初的一个使用场景是处理网页上活跃的数据,它往往有非常大的体量,每个页面都能产生数十条写入。而且我们假设每条消息都会被至少一个消费者消费(通常是多个),因此,我们努力让消费变得更加的简单。

我们发现,从构建和运行一定数量的类似的系统的经验来看,消费的效率是有效的多租户运营的关键。假如下游基础设施服务由于应用系统的略微使用就会很容易达到瓶颈,那么很小的变动通常会产生问题。通过效率变得更高,我们可以确保应用系统在相当的负载下,会比下游基础设施更早出问题。这句话的意思就是,kafka系统作为基础设施,会比应用系统更加能抗压力。当你尝试运行一个能够容纳数十或成百应用的中心化集群服务,这是非常重要的一点,因为由于使用模式的改变几乎每天都在发生。

上一节讨论了磁盘效率的问题,假如磁盘访问效率低的问题已经被消除,那么在这类系统中还有两个常见的低效问题

  • 许多小型的I/O操作
  • 过多的字节拷贝

低效问题解决

小型的IO操作

先来说小型的IO操作,这类问题发生在客户端和服务端(broker)之间,以及服务端自己的持久化操作。为了避免这个问题,我们的协议是去构建一个抽象的“数据集”的概念,用来组织一批消息。这个操作允许将消息放在一起发送网络请求并且分摊网络往返的开销,而不是说同一时间只发送一条消息。这带来的好处就是:broker端也能够一次性将一块块的消息附加到日志文件中去,而消费者端也能够同时拉取一大块连续的消息。
单条-批量发送

上图简单说明了,通过消息集的方式发送,能够大幅度减少网络请求,增加kafka的吞吐。

但针对单条消息来说,转微批的方式,会产生一定的延时。直接影响的两个参数为:linger.ms + batch.size。

这两个参数,这里有个误区,我先解释下这两个参数分别的作用:

  • linger.ms:它是kafka 生产者的一个配置,用来控制批量发送消息的等待时间,就是说,当我收到一条消息后,我会默认等待linger.ms的时间,才会发送这批消息,默认linger.ms这个参数默认值是0。
  • batch.size:这个参数可能熟悉的人比较多,它也是用来控制批量发送消息的,不过linger.ms控制的是时间,而batch.size控制的是消息的大小,一旦在producer端暂存的消息大小超过了batch.size,那么就会执行send动作,这里的批是按照partition分组的,就是说发往每个partition的大小不能超过batch.size的大小,否则就会直接发送。默认值为:16384byte,即16KB。

问题来了,很多人在kafka调优过程中,会配置batch.size的大小,比如说调整到1MB或2MB。但是此时kafka吞吐并没有变化,这是为什么呢?

其实问题就出现在linger.ms。消息转微批发送这个动作,是由linger.ms和batch.size两个参数来控制的,即只要这两个参数满足一个,就会将这一批消息发送出去。而linger.ms的默认值为0,就意味着,只要来一条消息,就会立马发送,此时batch.size是不会生效的。

题主在压测过程中,将linger.ms调整成100ms,此时整体业务的tps由200提升到350,说明微批生效。(数字不具备参考意义)

因此:想提高一批消息的大小,要同时调整linger.ms和batch.size。

转批式发送之后,发送的网络包更大了,针对磁盘的操作也有更大的磁盘顺序操作,在内存中也是更大的连续内存块了。这一个操作,将上游随机的消息写入转成了顺序写入。

字节拷贝

  另一个低效的操作是字节拷贝。当消息接受的速率较低时,这不会是一个问题,但是假如负载上来之后,影响就会很大。为了避免这个问题,我们在producer、broker、comsumer端都使用了标准的字节消息格式,这意味着在消息传输过程中,不需要做修改。

在broker端,消息日志就是以文件目录的形式保存的,每个文件由一系列的消息集填充,这些消息集以同样的格式被生产者和消费者使用。保持相同的格式允许一个最重要的优化手段:持久日志块的网络传输。 现代linux操作系统提供了一个高度优化的代码路径,用于将数据从页缓存传输到socket。在操作系统中,这个操作是由sendfile这个系统调用完成的。

在理解sendfile之前,我们先了解一下一般的数据是怎么从文件传输到socket:

  1. 操作系统从磁盘中读取数据并写入到内核空间的页缓存中去
  2. 应用系统将数据从内核区读取到用户空间下的缓冲区
  3. 应用系统将修改后的数据写回到内核空间,并写入到socket缓冲区。
  4. 操作系统将数据从socket 缓冲区拷贝到NIC 缓冲区并发送到网络

下图解释了传统数据的拷贝流程:

在这里插入图片描述

下图描述了文件传输到socket产生的上下文切换:

在这里插入图片描述

以上能看出来明显的低效,其中涉及到四次数据拷贝以及两次系统调用。而使用sendfile,避免了重复的拷贝动作,并且允许操作系统直接将数据从页缓存发送到网络中去,在这个优化下,只会存在一次CPU级别的拷贝动作(页缓存-NIC缓冲区)以及一次系统调用(sendfile)。

先粗略介绍一下零拷贝的使用,可以通过调用transferTo()方法,其底层就是使用了sendfile。

public void transferTo(long position, long count, WritableByteChannel target);

下图表示了使用sendfile之后,我们发送文件需要的代价:

在这里插入图片描述

细节内容,建议大家看官网的解释:

https://developer.ibm.com/articles/j-zerocopy/

我们期望的用户使用场景为一个topic多个消费者,这种场景下,使用了零拷贝之后,数据只需要被拷贝到页缓存,并且就能够被每个消费者重复使用了,而不是将数据保存在内存中并且每次读取都需要拷贝到用户空间去。这就允许消息的消费速率几乎能够达到网络的速率,也就是说此时网络带宽是我们消息系统的瓶颈(压测调优过程中,往往也是以带宽打满为标准)。

页缓存和sendfile的组合意味着在消费者连接的kafka集群中,你看不到磁盘的读取动作,数据几乎都会存在于缓存中。当然异常场景下也会有一些性能问题,这里我举个栗子:

  • 假如测试利用脚本启动了大量的消费者,并且消费大量无关的topic,导致了broker所在的机器上,cache被大量的占用了,此时,真正有效的topic数据,可能会由于内存淘汰策略,已经被刷入到磁盘中去了,这就导致了真正需要用到的topic的数据,每次消费,都需要从磁盘中读取了。

以上是一个真实的案例。

TLS/SSl操作只能在用户空间,目前kafka还不支持内核态的SSL_sendfile。由于这个限制,假如开启了SSL,那么sendfile就会失效。

可以通过以下两个配置开启SSL:

  • security.protocol
  • security.inter.broker.protocol

端到端批量压缩机制

上面有提到,在压测过程中,往往瓶颈不是cpu或内存,而是带宽。这个对于需要在两个数据中心之间传输的场景尤为明显。当然用户可以一个一个的压缩待发送的消息,但是这就造成很低的压缩比。

因为大部分数据的冗余,都是因为重复性,可能由于相同的类型或者json报文中相同的key。有效的压缩操作,最好需要压缩大量的消息而不是单条单条的压缩。

Kafka支持高效的批处理格式,一批消息可以被归在一起,压缩然后发送给服务端(broker)。服务端为了校验这批消息,会解压这批数据。例如说会校验这批消息的数量是否与请求头中消息数保持一致(验证消息是否丢失)。这批消息会以压缩的格式保存在服务端,在服务器日志中会保留压缩的形式并且以同样的形式发送到消费者端。因此消费者端需要以相同的解压缩协议对消息进行解压。

目前kafka支持的压缩协议有:GZIP、Snappy、LZ4和ZStandard。其中GZIP是比较推荐的。

总结

总结一下本文的大致内容,主要解释了kafka如何提高效率的,主要解决了小型IO和大量的字节拷贝问题。

  • 小型IO的问题,kafka的解法是转微批的方式。
  • 字节拷贝问题,kafka利用了零拷贝技术实现,减少了数据的重复拷贝问题,但目前还没做到真正的“零拷贝”。
  • 利用压缩技术,使的网络带宽能够更高效的使用。
  • 后续会出一个关于零拷贝的文章(先埋个坑)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对称加密介绍

一、什么是对称加密 对称密钥算法(Symmetric-key algorithm),又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。 对称加密的特点是,在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。 这…

智慧公厕:数据驱动的公共厕所智慧化管理

公共厕所作为城市基础设施的重要组成部分,对于城市居民的生活质量和城市形象有着不可忽视的影响。然而,传统的公共厕所管理模式存在诸多问题,如设施老化、卫生状况不佳等,严重限制了公众对于公共厕所的使用体验。随着大数据和智能…

ViLT 浅析

ViLT 浅析 论文链接:ViLT 文章目录 ViLT 浅析创新点网络结构总结 创新点 本文先分析了4种不同类型的Vision-and-Language Pretraining(VLP) 其中每个矩形的高表示相对计算量大小,VE、TE和MI分别是visual embedding、text embedding和modality interact…

类型注解-Python

师从黑马程序员 类型注解的语法 类型注释的限制 import json import randomvar_1 : int10 var_2 : str"itheima" var_3 : boolTrueclass Student:pass stu :StudentStudent()my_list:list [1,2,3] my_tuple:tuple(1,2,3) my_dict:dict{"itheima":666}my_l…

智慧安监中的物联网主机E6000

物联网主机E6000的研发背景主要源于我国对物联网技术在安全生产、环境监测、火灾预警与防控、人员定位与紧急救援等领域的迫切需求。近年来,随着物联网技术的飞速发展,我国政府对智慧安监的重视程度不断提升,相关的政策扶持力度也在加大。在这…

乡村振兴与数字乡村建设:加强农村信息化建设,推动数字乡村发展,提升乡村治理和服务水平,构建智慧化的美丽乡村

目录 一、引言 二、数字乡村建设的必要性 1、推动农村经济转型升级 2、提升乡村治理水平 3、改善乡村民生福祉 三、数字乡村建设的现状与挑战 1、现状 2、挑战 四、数字乡村建设的未来发展路径 1、加强农村信息化基础设施建设 2、提升农民信息素养和技能水平 3、制…

解锁Spring Boot数据映射新利器:深度探索MapperStruct

解锁Spring Boot数据映射新利器:深度探索MapperStruct MapperStruct 是一个强大的 Java 映射工具,它的主要作用是简化对象之间的映射操作。在 Spring Boot 应用程序中,MapperStruct 通常用于将领域模型对象(Domain Model&#xff…

17_基于Flash和RAM的的文件系统选择

嵌入式系统常见文件系统 本文主要讲述在嵌入式系统中,常见的基于flash和内存(RAM)的文件系统类型,具体选择要结合实际需求灵活选配。 一、基于 Flash 的文件系统 基于 Flash 的文件系统主要包括 JFFS2、 YAFFS、 Cramfs 和 Romfs 等,各种文件系统具有不同的特点,本文将分…

基于微信小程序的预约挂号系统(源码)

博主介绍:✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&#x1f447…

【免费】2024年全新超强版本itvboxfast如意版影视APP源码 TV+手机双端后台PHP源码

首先,让我们了解一下ITVBox如意版影视源码的特点和优势。这一源码基于先进的技术和框架开发,具有稳定、高效的性能,能够满足影视网站的各种需求。与此同时,该源码还提供了丰富的功能和模块,包括影视资源管理、会员系统…

C语言——文件相关操作补充

一、文件读取结束的判定 当我们使用例如fgetc、fgets、fscanf、fread等函数来读取文件内容时,我们可能遇到需要判断文件读取的结束,一般情况下都是通过这些函数的返回值来判断文件读取是否结束。 1、fgetc 返回读取的字符的ASCII值,如果读…

能源效率:未来可持续发展的全球当务之急

当前全球正面临着严重的能源与气候危机,能源消耗不断增长导致环境污染、气候变化等问题日益严重。在这一背景下,提高能源效率成为了当务之急。今天,我们来简要探讨一下能源效率在全球可持续发展中的重要性,重点关注建筑物能源效率…

了解当前经济,VBA一键获取不同货币实时汇率

了解当前经济数据,VBA一键获取不同货币间实时汇率 当下较火的经济新闻:黄金价格、日元贬值、美元加息等,咱们不去分析了解这些经济变动背后的动机及原因,做一点本份的事,如何用VBA获取不同货币之间的实时汇率。这肯定是需要联网的,现从“外汇查询” 网站(https://www.wa…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: Django-i18n本地化-L10n多语言国际化翻译工具表单验证性能优化 引言 在数字化时代,网站和应用程序必须跨越地域限制,服务于全球…

微信小程序踩坑,skyline模式下,简易双向绑定无效

工具版本 基础库版本 Skline模式 页面json设置 问题描述 skyline模式下,textarea,input标签设置简易双向绑定 model:value是无效的,关闭skyline模式就正常使用了 截图展示 这里只展示了textarea标签,input标签的简易双向绑定也是无效的 总结 我在文档里面是没找到skyline里面不…

第3周 后端微服务基础架构与前端项目联调配备

第3周 后端微服务基础架构与前端项目联调配备 1. 微服务项目层次设计与Maven聚合1.1 项目层次设计1.2 父项目pom1.2.1 打包方式 1.3 创建通用 ************************************************************************************** 1. 微服务项目层次设计与Maven聚合 1.1…

【JS红宝书学习笔记】第3章 语言基础

第3章 语言基础 1. 语法 标识符(变量、函数、属性或函数参数的名称):一般使用驼峰法命名,关键字、保留字、true、false 和 null 不能作为标识符。 标识符的第一个字符必须是一个字母、下划线(_)或美元符号…

MySQL数据库基础(数据库操作,常用数据类型,表的操作)

MySQL数据库基础(数据库操作,常用数据类型,表的操作) 前言 数据库的操作1.显示当前数据库2.创建数据库3.使用数据库4.删除数据库 常用数据类型1.数值类型2.字符串类型3.日期类型 表的操作1.查看表结构2.创建表3.删除表 总结 前言 …

【电子实验3】简单变调电子门铃

🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

Maven:Maven基础

Maven apache旗下的一个开源项目,一款用于管理和构建java项目的工具 什么是Maven 一个项目管理和构建工具,基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档. Maven的作用 依赖管理 方便快捷的管理项目依赖的资源jar包,避免版本冲突问题 统一…