kafka吞吐量高的原因

kafka高性能的原因:

1.顺序读写磁盘

2.充分利用操作系统页缓存

3.零拷贝

4.对消息批量读写

5.对消息批量压缩:节省网络IO的开销,提高了数据的传输效率

6.存储方面通过分区,分段+索引的方式。

(1)顺序读写:基于磁盘的随机读写确实很慢,但磁盘的顺序读写性能却很高,一些情况下磁盘顺序读写性能甚至要高于内存随机读写。(Kafka的message是不断追加到本地磁盘文件末尾的,而不是随机的写入,这使得Kafka写入吞吐量得到了显著提升 。)

(2)Page Cache:为了优化读写性能,kafka利用了操作系统本身的page cache,就是利用操作系统自身的内存而不是JVM空间内存,这样做的好处是:

         1:避免Object消耗:如果是使用java堆,java对象的内存消耗比较大,通常是所存储数据的两倍甚至更多。

         2:避免GC问题:随着JVM中数据不断增多,垃圾回收将会变得复杂与缓慢,使用系统缓存就不会存在GC问题。

通过操作系统的page cache,kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。

(3)零拷贝:(不使用的时候,数据在内核空间和用户空间之间穿梭了两次),使用零拷贝技术后避免了这种拷贝。通过这种 “零拷贝” 的机制,Page Cache 结合 sendfile 方法,Kafka消费端的性能也大幅提升。这也是为什么有时候消费端在不断消费数据时,我们并没有看到磁盘io比较高,此刻正是操作系统缓存在提供数据。

(4)分区分段+索引:topic 中的数据是按照一个一个的partition即分区存储到不同broker节点的,每个partition对应了操作系统上的一个文件夹,partition实际上又是按照segment分段存储的,这也非常符合分布式系统分区分桶的设计思想。kafka的message消息实际上是分布式存储在一个一个segment中的,每次文件操作也是直接操作的segment。为了进一步的查询优化,kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件.这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据处理的并行度。

(5)批量读写:Kafka数据读写也是批量的而不是单条的。在向Kafka写入数据时,可以启用批次写入,这样可以避免在网络上频繁传输单个消息带来的延迟和带宽开销。假设网络带宽为10MB/S,一次性传输10MB的消息比传输1KB的消息10000万次显然要快得多。

(6)批量压缩:

在很多情况下,系统的瓶颈不是CPU或磁盘,而是网络IO,对于需要在广域网上的数据中心之间发送消息的数据流水线尤其如此。进行数据压缩会消耗少量的CPU资源,不过对于kafka而言,网络IO更应该需要考虑。

  • 如果每个消息都压缩,但是压缩率相对很低,所以Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩
  • Kafka允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩
  • Kafka支持多种压缩协议,包括Gzip和Snappy压缩协议

     Kafka速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络IO损耗,通过mmap提高I/O速度,写入数据的时候由于单个Partion是末尾添加所以速度最优;读取数据的时候配合sendfile直接暴力输出。

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

posted @ 2020-10-23 17:11  hulifang  阅读(2943)  评论(0编辑  收藏  举报