kafka性能分析

DDS与MQ对比分析 努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧! 阅读详情
1
.通过磁盘顺序读写,效率高,appendLog,对比raid-5 7200rpm的磁盘
sequence io 600M/s
random io 100kb/s
kafka写操作时,依赖底层文件系统的pagecache功能,pagecache会将尽量多的将空闲内存,当做磁盘缓存,写操作先写到pageCache,并将该page标记为dirty;发生读操作时,会先从pageCache中查找,当发生缺页时,才会去磁盘调整;当有其他应用申请内存时,回收pageCache的代价是很低的
,使用pageCache的缓存功能,会减少我们队JVM的内存依赖,JVM为我们提供了GC功能,依赖JVM内存在kafka高吞吐,大数据的场景下有很多问题。如果heap管理缓存,那么JVM的gc会频繁扫描heap空间,带来的开销很大,如果heap过大,full gc带来的成本也很高;所有的In-Process Cache在OS中都有一份同样的PageCache。所以通过只在PageCache中做缓存至少可以提高一倍的缓存空间。如果Kafka重启,所有的In-Process Cache都会失效,而OS管理的PageCache依然可以继续使用。

2.sendFile
传统网络IO模型
① 操作系统将数据从磁盘拷贝到内核区的pagecache
② 用户程序将内核区的pagecache拷贝到用户区缓存
③ 用户程序将用户区的缓存拷贝到socket缓存中
④ 操作系统将socket缓存中的数据拷贝到网卡的buffer上,发送

问题:四次system call 两次context切换,同一份数据在缓存中拷贝多次,效率很低,拷贝动作完全可以在内核中进行,将2 3 步去掉,sendfile就是完成这一功能

kafka设计初衷是数据的拷贝完全通过pageCache来进行,尽量减少磁盘读写,如果kafka生产消费配合的好,那么数据完全走内存,这对集群的吞吐量提升是很大的

当集群只有写操作时,此时的集群只有写,没有读操作。10M/s左右的Send的流量是Partition之间进行Replicate而产生的。从recv和writ的速率比较可以看出,写盘是使用Asynchronous+Batch的方式,底层OS可能还会进行磁盘写顺序优化。而在有Read Request进来的时候分为两种情况,第一种是内存中完成数据交换。

② 已经从pageCache刷出的数据,这时候的数据可以看出大部分走的是磁盘io

TIPS
① kafka官方不建议使用log.flush.interval.messages和log.flush.interval.ms来强制刷盘,因为高可靠应该通过replica副本来保证,强制刷盘对系统性能影响很大(生产是100000 和60000)
② 可以通过调整/proc/sys/vm/dirty_background_ratio和/proc/sys/vm/dirty_ratio来调优性能。
a. 脏页率超过第一个指标会启动pdflush开始Flush Dirty PageCache。
b. 脏页率超过第二个指标会阻塞所有的写操作来进行Flush。
c. 根据不同的业务需求可以适当的降低dirty_background_ratio和提高dirty_ratio。
(生产是10 和 20)

2 partition

Partition是Kafka可以很好的横向扩展和提供高并发处理以及实现Replication的基础。
扩展性方面。首先,Kafka允许Partition在集群内的Broker之间任意移动,以此来均衡可能存在的数据倾斜问题。其次,Partition支持自定义的分区算法,例如可以将同一个Key的所有消息都路由到同一个Partition上去。 同时Leader也可以在In-Sync的Replica中迁移。由于针对某一个Partition的所有读写请求都是只由Leader来处理,所以Kafka会尽量把Leader均匀的分散到集群的各个节点上,以免造成网络流量过于集中。

并发方面。任意Partition在某一个时刻只能被一个Consumer Group内的一个Consumer消费(反过来一个Consumer则可以同时消费多个Partition),Kafka非常简洁的Offset机制最小化了Broker和Consumer之间的交互,这使Kafka并不会像同类其他消息队列一样,随着下游Consumer数目的增加而成比例的降低性能。此外,如果多个Consumer恰巧都是消费时间序上很相近的数据,可以达到很高的PageCache命中率,因而Kafka可以非常高效的支持高并发读操作,实践中基本可以达到单机网卡上限。

不过,Partition的数量并不是越多越好,Partition的数量越多,平均到每一个Broker上的数量也就越多。考虑到Broker宕机(Network Failure, Full GC)的情况下,需要由Controller来为所有宕机的Broker上的所有Partition重新选举Leader,假设每个Partition的选举消耗10ms,如果Broker上有500个Partition,那么在进行选举的5s的时间里,对上述Partition的读写操作都会触发LeaderNotAvailableException。

再进一步,如果挂掉的Broker是整个集群的Controller,那么首先要进行的是重新任命一个Broker作为Controller。新任命的Controller要从Zookeeper上获取所有Partition的Meta信息,获取每个信息大概3-5ms,那么如果有10000个Partition这个时间就会达到30s-50s。而且不要忘记这只是重新启动一个Controller花费的时间,在这基础上还要再加上前面说的选举Leader的时间 -_-!!!!!!

此外,在Broker端,对Producer和Consumer都使用了Buffer机制。其中Buffer的大小是统一配置的,数量则与Partition个数相同。如果Partition个数过多,会导致Producer和Consumer的Buffer内存占用过大。


tips
1. Partition的数量尽量提前预分配,虽然可以在后期动态增加Partition,但是会冒着可能破坏Message Key和Partition之间对应关系的风险。
2. Replica的数量不要过多,如果条件允许尽量把Replica集合内的Partition分别调整到不同的Rack。
3. 尽一切努力保证每次停Broker时都可以Clean Shutdown,否则问题就不仅仅是恢复服务所需时间长,还可能出现数据损坏或其他很诡异的问题。

3
Producer
Kafka的研发团队表示在0.8版本里用Java重写了整个Producer,据说性能有了很大提升。我还没有亲自对比试用过,这里就不做数据对比了。本文结尾的扩展阅读里提到了一套我认为比较好的对照组,有兴趣的同学可以尝试一下。

其实在Producer端的优化大部分消息系统采取的方式都比较单一,无非也就化零为整、同步变异步这么几种。

Kafka系统默认支持MessageSet,把多条Message自动地打成一个Group后发送出去,均摊后拉低了每次通信的RTT。而且在组织MessageSet的同时,还可以把数据重新排序,从爆发流式的随机写入优化成较为平稳的线性写入。

此外,还要着重介绍的一点是,Producer支持End-to-End的压缩。数据在本地压缩后放到网络上传输,在Broker一般不解压(除非指定要Deep-Iteration),直至消息被Consume之后在客户端解压。

当然用户也可以选择自己在应用层上做压缩和解压的工作(毕竟Kafka目前支持的压缩算法有限,只有GZIP和Snappy),不过这样做反而会意外的降低效率!!!! Kafka的End-to-End压缩与MessageSet配合在一起工作效果最佳,上面的做法直接割裂了两者间联系。至于道理其实很简单,压缩算法中一条基本的原理“重复的数据量越多,压缩比越高”。无关于消息体的内容,无关于消息体的数量,大多数情况下输入数据量大一些会取得更好的压缩比。

不过Kafka采用MessageSet也导致在可用性上一定程度的妥协。每次发送数据时,Producer都是send()之后就认为已经发送出去了,但其实大多数情况下消息还在内存的MessageSet当中,尚未发送到网络,这时候如果Producer挂掉,那就会出现丢数据的情况。

为了解决这个问题,Kafka在0.8版本的设计借鉴了网络当中的ack机制。如果对性能要求较高,又能在一定程度上允许Message的丢失,那就可以设置request.required.acks=0 来关闭ack,以全速发送。如果需要对发送的消息进行确认,就需要设置request.required.acks为1或-1,那么1和-1又有什么区别呢?这里又要提到前面聊的有关Replica数量问题。如果配置为1,表示消息只需要被Leader接收并确认即可,其他的Replica可以进行异步拉取无需立即进行确认,在保证可靠性的同时又不会把效率拉得很低。如果设置为-1,表示消息要Commit到该Partition的ISR集合中的所有Replica后,才可以返回ack,消息的发送会更安全,而整个过程的延迟会随着Replica的数量正比增长,这里就需要根据不同的需求做相应的优化。

tips
1. Producer的线程不要配置过多,尤其是在Mirror或者Migration中使用的时候,会加剧目标集群Partition消息乱序的情况(如果你的应用场景对消息顺序很敏感的话)。
2. 0.8版本的request.required.acks默认是0(同0.7)。

4
Consumer
Consumer端的设计大体上还算是比较常规的。
• 通过Consumer Group,可以支持生产者消费者和队列访问两种模式。
• Consumer API分为High level和Low level两种。前一种重度依赖Zookeeper,所以性能差一些且不自由,但是超省心。第二种不依赖Zookeeper服务,无论从自由度和性能上都有更好的表现,但是所有的异常(Leader迁移、Offset越界、Broker宕机等)和Offset的维护都需要自行处理。
• 大家可以关注下不日发布的0.9 Release。这帮货又用Java重写了一套Consumer。把两套API合并在一起,同时去掉了对Zookeeper的依赖。据说性能有大幅度提升哦~~

tips
强烈推荐使用Low level API,虽然繁琐一些,但是目前只有这个API可以对Error数据进行自定义处理,尤其是处理Broker异常或由于Unclean Shutdown导致的Corrupted Data时,否则无法Skip只能等着“坏消息”在Broker上被Rotate掉,在此期间该Replica将会一直处于不可用状态。

Kafka系列之:深入理解Kafka集群调优 阅读详情

相关推荐

国产安全芯片在密码算法国密体系下的性能适配策略

国密体系即国家商用密码体系,是保障信息安全的核心技术体系。自20世纪90年代末起步,国密体系经历了从无到有、从弱到强的发展历程。1999年,国家密码管理局成立,标志着国密体系的正式建立。2000年,国密SM1算法首次发布,开启了国密算法的标准化进程。此后,SM2、SM3、SM4等算法陆续推出,形成了完整的对称与非对称密码算法体系。:2010年,国密标准正式纳入国家标准体系,国密算法在金融、政务、通信等关键领域的应用得到明确规范。

qq_40552871的博客 1356

Kafka性能优化

合理配置Kafka生产者和消费者参数:调整Kafka生产者和消费者的参数,如批量大小、发送缓冲区、接收缓冲区等,以适应不同的数据流量和处理需求。优化磁盘性能:Kafka的性能受到磁盘的影响,使用高性能的SSD磁盘或者RAID配置可以提高数据写入和读取的速度。使用批量发送:生产者可以采用批量发送消息的方式,将多条消息一次性发送到Kafka,减少网络开销和提高吞吐量。合理设置数据保留策略:根据业务需求和存储资源,设置合理的数据保留时间和保留大小,避免数据过期和浪费存储空间。

kankan_s的专栏 450

为什么AI时代的优秀组织,都在学习Meta的Pod结构?看完秒懂

当AI技术重塑产业格局,企业协作正面临前所未有的挑战——层级繁琐、跨部门内耗、迭代滞后,传统组织模式早已难以跟上技术革新的步伐。作为全球AI原生企业的标杆,Meta独创的Pod组织模式,用“小而美”的自治单元打破困局,成为AI时代高效协作的典范。本文将从定义、运作、价值到未来演进,全面拆解Pod模式,为企业组织变革提供可参考的思路与路径。德鲁克曾说:“组织的功能就是让平凡的人做平凡的事。”而Meta Pod打破这一局限,通过去中心化、指标导向、跨界融合,让优秀人才产生“化学反应”。

Kiss_AIHR的博客 1182

Kafka实战分析(一)- 设计、部署规划及其调优

1. Kafka概要设计 kafka在设计之初就需要考虑以下4个方面的问题: 吞吐量/延时 消息持久化 负载均衡和故障转移 伸缩性 1.1吞吐量/延时 对于任何一个消息引擎而言,吞吐量都是至关重要的性能指标。那么何为吞吐量呢?通常来说,吞吐量是某种处理能力的最大值。而对于Kafka而言,它的吞吐量就是每秒能够处理的消息数或者每秒能够处理的字节数。很显然,我们自然希望消息引擎...

Swordfall的博客 1142

AI Pika 生成进击的巨人动漫分镜案例

AI Pika 生成进击的巨人动漫分镜案例 Pika 是一个使用AI生成和编辑视频的平台。

独立开发,substack顶级编辑 2576

代谢组学数据分析实战:用R语言从PCA、PLS-DA到OPLS-DA一步步搞定(附代码)

本文详细介绍了使用R语言进行代谢组学数据分析的全流程,从数据预处理到PCA、PLS-DA和OPLS-DA模型构建与验证。通过实际案例和代码示例,帮助研究者掌握关键分析技术,提升数据解读能力,特别适合生命科学领域的研究人员。

weixin_28689507的博客 133

生产环境-kafka集群磁盘与节点数量规划方案

kafka集群生产次磁盘与节点数量规划方案

Pushkin.的博客 4060

深入解析NPN与PNP传感器驱动电路的设计逻辑与实战应用

本文深入解析NPN与PNP传感器驱动电路的设计逻辑与实战应用,详细对比两者的电流路径差异和电平变化特性。通过实际案例分享电路设计要点,包括上拉电阻选择、保护二极管配置等,并提供工业应用中的选型策略和常见故障排查指南,帮助工程师优化传感器系统集成。

weixin_42561476的博客 472

kafka原理和性能分析测试

1、Kafka写数据流程: producer先从zookeeper的broker-list的节点找到partition(分区)的leader; producer将消息发送给该leader的partition; leader将消息写入本地log; followers从leader pull消息,实现replication的副本备份机制,同样写入本地log; replication写入本地log后向leader发送ack(确认); leader收到所有ISR中的replica的ACK后,增加HW(high w

LPAINI520的博客 672

ThreeJS教程:地图案例(包围盒、正投影)

推荐:将加入你的3D工具链。

jianshi2023的博客 1008

DBT关键切片重建算法

DBT通过有限角度(通常15°~50°)扫描,获取一系列低剂量投影图,重建出三维断层图像。传统FBP在稀疏角度下会产生严重的“伪影拖尾”和层间干扰。临床诊断中,放射科医生往往只关注几层关键切片(即病灶所在层),其余层仅作参考。

AI的内部世界的博客 89

kafka-ui实时监控:消费者组性能分析指南

在分布式流处理系统中,Apache Kafka®的消费者组(Consumer Group)扮演着关键角色,负责将消息从主题(Topic)中拉取并进行处理。然而,随着集群规模扩大和业务复杂度提升,消费者组常常面临三大核心挑战: - **消费延迟(Consumer Lag)突增**:消息堆积导致实时性下降 - **重平衡(Rebalance)频繁发生**:影响处理稳定性和吞吐量 - **资源利用率失...

gitblog_00547的博客 1289

libVLC 视频抓图

libVLC 中通过libvlc_video_take_snapshot核心接口来截图。以下是VLC播放器中使用的截图界面,我们仿照这个做一个界面。首先,你需要初始化 libVLC 实例和媒体播放器对象。1. 初始化 libVLC 和媒体播放器。菜单添加action,并响应槽函数。生成目录下snap.png。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1946

kafka 技术性能分析

1.通过磁盘顺序读写,效率高,appendLog,对比raid-5 7200rpm的磁盘 sequence io 600M/s random io 100kb/s kafka写操作时,依赖底层文件系统的pagecache功能,pagecache会将尽量多的将空闲内存,当做磁盘缓存,写操作先写到pageCache,并将该page标记为dirty;发生读操作时,会先从pageCache中查找,当...

u010325193的博客 471

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Kafka集群监控终极指南:使用kcat实现实时状态检测与性能分析 [特殊字符]

kcat作为Apache Kafka生态系统中不可或缺的轻量级命令行工具,为开发者和运维人员提供了强大的Kafka集群监控能力。这个非JVM的生产者和消费者工具让您能够快速诊断集群健康状态、分析消息流性能,并确保数据管道的可靠性。本指南将带您深入了解如何使用kcat进行专业的Kafka集群监控。 ## 🔍 kcat监控工具的核心功能 kcat是一款功能丰富的Kafka命令行工具,支持多种操作

gitblog_00725的博客 855

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Kafka的性能分析

都说Kafka的吞吐量很大,但是我一直不直到Kafka为何有如此大的吞吐量。最近在看Kafka权威指南,陆陆续续得到了如下结论: 1、分区:Kafka支持分区,这样就支持多个生产者和多个消费者同时请求,每个分区在不同的物理节点上,提高了整个broker集群的吞吐; 2、不支持针对每一条记录做持久化(rabbitMq支持):Kafka的持久化策略是针对segment的,通过log.segment...

weixin_30316097的博客 189

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Kafka produce flush 引起的性能分析

调用kafka producer发送数据时,发现延迟级别在10-200ms不等,与正常的kafka写入速度不匹配,于是开始找问题~ 一.场景: 一批数据,需要遍历每个数据并发送数据细节的信息到kafka,下面是我原始代码,每个人发送后执行一次flush操作。 val results = Array[DataObject](...) results.foreach(data => { val info = new ProducerRecord[String, String](top.

BITDDD小栈 1万+

kafka消息存储,性能分析,消息可靠性

一,消息的存储 消息发送端发送消息到broker上以后,消息是如何持久化的呢? kafka是使用日志文件的方式来保存生产者和发送者的消息,每条消息都有一个offset值来表示它在分区中的偏移量。Kafka中存储的一般都是海量的消息数据,为了避免日志文件过大,Log并不是直接对应在一个磁盘上的日志文件,而是对应磁盘上的一个目录,这个目录的命名规则是<topic_name>_<partition_id> 消息的文件存储机制 一个topic的多个partition在物理磁盘上的保存路径,路

weixin_45596022的博客 522

MQ选型?kafka,RocketMQ,rabbitMQ,ActiveMQ对比,性能分析

职业规划

chaochao2113的博客 1万+

kafka性能测试、性能分析与性能调优

前言:最近在做kafka、mq、redis、fink、kudu等在中间件性能压测,压测kafka的时候参考了这篇文章,大家可以借鉴下! 一、测试环境 测试使用到三台机器,机器配置如下: 共同配置: Intel® Core™ i7-7700 CPU @ 3.60GHz、Cores:4、Threads:2 32GB内存 1000Mb/sec网卡 差异化配置 2TB、7200rpm、SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s) 1TB、7200rpm、SATA 3.1, 6.0Gb

李文良的博客 5万+

对比测试:Apache Pulsar 与 Kafka 在金融场景下的性能分析

背景 Apache Pulsar 是下一代分布式消息流平台,采用计算存储分层架构,具备多租户、高一致、高性能、百万 topic、数据平滑迁移等诸多优势。越来越多的企业正在使用 Pulsar 或者尝试将 Pulsar 应用到生产环境中。 腾讯把 Pulsar 作为计费系统的消息总线来支撑千亿级在线交易。腾讯计费体量庞大,要解决的核心问题就是必须确保钱货一致。首先,保证每一笔支付交易不出现错账,做到高一致、高可靠。其次,保证计费承载的所有业务 7*24 可用,做到高可用、高性能。计费消息总线必须具备这些能力。

Apache Pulsar 912

深入理解kafka核心设计与实践原理_读书笔记_第5章 Kafka高吞吐性能分析

Kafka高吞吐性能分析1.顺写日志2.页缓存2.1 页缓存的读取2.2 页缓存的写入3 零拷贝3.1 非零拷贝技术3.2 零拷贝技术4.面试题:"kafka为什么快?" 的正确回答姿势 本节主要讲解kafka的高吞吐,这里的主要指的是Kafka为什么快? 主要因为应用了 顺写日志、页缓存、零拷贝、消息压缩等技术。 1.顺写日志 kafka依赖文件系统(磁盘)来存储消息。kafka在设计时采用文件追加的方式来写入消息。 只能在日志文件的尾部追加新的消息,并且不允许修改已

lightupworld的博客 489

kafka-docker网络模式对比:bridge、host与overlay性能分析

在使用Docker部署Kafka(卡夫卡)时,网络模式的选择直接影响消息传输效率和部署复杂度。本文将对比bridge(桥接)、host(主机)和overlay(覆盖)三种网络模式的性能表现,帮助你根据实际场景选择最优方案。通过[docker-compose.yml](https://link.gitcode.com/i/d877c9da5fa47d7101e602c1a282c2be)、[dock...

gitblog_00026的博客 1087

Python-SocketIO 消息管理器终极比较:Redis、Kafka、Kombu性能分析

Python-SocketIO 是一个强大的实时通信库,支持多种消息管理器来实现分布式系统的数据同步。在前100个字的介绍中,Python-SocketIO 消息管理器是构建高可用实时应用的关键组件,Redis、Kafka和Kombu是三种最常用的选择。本文将深入分析这三种消息管理器的性能特点和适用场景。 ## 🔥 为什么需要消息管理器? 在分布式 SocketIO 应用中,多个服务器实例需

gitblog_00490的博客 833

Kafka-King终极指南:用图形化界面彻底告别Kafka管理烦恼

你是否曾经面对Kafka集群管理时感到力不从心?传统的命令行工具让很多开发者望而却步,复杂的配置参数和难以直观理解的集群状态成为了Kafka学习道路上的最大障碍。现在,Kafka-King这款现代化的图形化Kafka管理工具,将为你打开一扇全新的大门,让你在几分钟内完成原本需要数小时的操作。 ## 为什么你需要Kafka-King? 在传统的Kafka管理过程中,开发者常常面临这些痛点: *

gitblog_00052的博客 1295
上一篇: kafka常用命令总结
下一篇: Linux常用命令
Java_Soldier
博客等级 码龄10年 27粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值