目录

前言:Kafka为何那么快(高效)

1.文件系统

2.降低时间复杂度

3.零拷贝

4.下一节预告


前言:Kafka为何那么快(高效)

  • 利用磁盘顺序写的优势
  • 预读取后写入
  • 尽量避免使用 in-memory cache
  • 将消息打包降低大量小型IO操作的影响
  • 零拷贝(基于mmap的索引和日志读写用到的TransportLayer)

1.文件系统

Kafka 对消息的存储和缓存严重依赖于文件系统。人们对于“磁盘速度慢”具有普遍印象,事实上,磁盘的速度比人们预期的要慢的多,也快得多,这取决于人们使用磁盘的方式。

使用6个7200rpm、SATA接口、RAID-5的磁盘阵列在JBOD配置下的顺序写入的性能约为600MB/秒,但随机写入的性能仅约为100k/秒,相差6000倍以上。

线性的读取和写入是磁盘使用模式中最有规律的,并且由操作系统进行了大量的优化。

  • read-ahead 是以大的 data block 为单位预先读取数据

  • write-behind 是将多个小型的逻辑写合并成一次大型的物理磁盘写入

关于该问题的进一步讨论可以参考 ACM Queue article,他们发现实际上顺序磁盘访问在某些情况下比随机内存访问还要快!

        为了弥补这种性能差异,现代操作系统主动将所有空闲内存用作 disk caching(磁盘高速缓存),所有对磁盘的读写操作都会通过这个统一的 cache( in-process cache)。

即使进程维护了 in-process cache,该数据也可能会被复制到操作系统的 pagecache 中,事实上所有内容都被存储了两份。

此外,Kafka 建立在 JVM 之上,任何了解 Java 内存使用的人都知道两点:

  1. 对象的内存开销非常高,通常是所存储的数据的两倍(甚至更多)。

  2. 随着堆中数据的增加,Java 的垃圾回收变得越来越复杂和缓慢。

kafka选择了一个非常简单的设计:相比于维护尽可能多的 in-memory cache,并且在空间不足的时候匆忙将数据 flush 到文件系统,我们把这个过程倒过来。所有数据一开始就被写入到文件系统的持久化日志中,而不用在 cache 空间不足的时候 flush 到磁盘。实际上,这表明数据被转移到了内核的 pagecache 中。

Pagecache页面缓存

  • Page cache(页面缓存)

    Page cache 也叫页缓冲或文件缓冲,是由好几个磁盘块构成,大小通常为4k,在64位系统上为8k,构成的几个磁盘块在物理磁盘上不一定连续,文件的组织单位为一页, 也就是一个page cache大小,文件读取是由外存上不连续的几个磁盘块,到buffer cache,然后组成page cache,然后供给应用程序。

  • Buffer cache(块缓存)

    Buffer cache 也叫块缓冲,是对物理磁盘上的一个磁盘块进行的缓冲,其大小为通常为1k,磁盘块也是磁盘的组织单位。设立buffer cache的目的是为在程序多次访问同一磁盘块时,减少访问时间。

  • Page cache(页面缓存)与Buffer cache(块缓存)的区别

    磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。

    我们通过文件系统操作文件,那么文件将被缓存到Page Cache,如果需要刷新文件的时候,Page Cache将交给Buffer Cache去完成,因为Buffer Cache就是缓存磁盘块的。

    简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。

    Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。

    Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。

2.降低时间复杂度

消息系统使用的持久化数据结构通常是和 BTree 相关联的消费者队列或者其他用于存储消息源数据的通用随机访问数据结构。BTree 的操作复杂度是 O(log N),通常我们认为 O(log N) 基本等同于常数时间,但这条在磁盘操作中不成立。

存储系统将非常快的cache操作和非常慢的物理磁盘操作混合在一起,当数据随着 fixed cache 增加时,可以看到树的性能通常是非线性的——比如数据翻倍时性能下降不只两倍。

        kafka选择把持久化队列建立在简单的读取和向文件后追加两种操作之上,这和日志解决方案相同。这种架构的优点在于所有的操作复杂度都是O(1),而且读操作不会阻塞写操作,读操作之间也不会互相影响。

在不产生任何性能损失的情况下能够访问几乎无限的硬盘空间,Kafka 可以让消息保留相对较长的一段时间(比如一周),而不是试图在被消费后立即删除。

        降低大量小型IO操作的影响

小型的 I/O 操作发生在客户端和服务端之间以及服务端自身的持久化操作中。

为了避免这种情况,kafka的协议是建立在一个 “消息块” 的抽象基础上,合理将消息分组。将多个消息打包成一组,而不是每次发送一条消息,从而使整组消息分担网络中往返的开销。

这个简单的优化对速度有着数量级的提升。批处理允许更大的网络数据包,更大的顺序读写磁盘操作,连续的内存块等等,所有这些都使 KafKa 将随机流消息顺序写入到磁盘, 再由 consumers 进行消费。

3.零拷贝

字节拷贝是低效率的操作,在消息量少的时候没啥问题,但是在高负载的情况下,影响就不容忽视。为了避免这种情况,kafka使用 producer ,broker 和 consumer 都共享的标准化的二进制消息格式,这样数据块不用修改就能在他们之间传递。

保持这种通用格式可以对一些很重要的操作进行优化: 持久化日志块的网络传输。现代的unix 操作系统提供了一个高度优化的编码方式,用于将数据从 pagecache 转移到 socket 网络连接中;在 Linux 中系统调用 sendfile 做到这一点。

  • 传统IO (4次上下文切换4次拷贝)

    假如将磁盘上的文件读取出来,然后通过网络协议发送给客户端。

    一般需要两个系统调用,但是一共4次上下文切换,4次拷贝

    read(file, tmp_buf, len);
    write(socket, tmp_buf, len);
    

  • 要想提高文件传输的性能,就需要减少「用户态与内核态的上下文切换」和「内存拷贝」的次数

  • mmap(4次上下文切换3次拷贝)

    mmap()系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝操作,它替换了read()系统调用函数。

    buf = mmap(file, len);
    write(sockfd, buf, len);
    

  • sendfile(2次上下文切换3次拷贝

    Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用函数 sendfile()

    首先,它可以替代前面的 read()和 write()这两个系统调用,这样就可以减少一次系统调用,也就减少了 2 次上下文切换的开销。

    其次,该系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,这样就只有 2 次上下文切换,和 3 次数据拷贝。

    #include <sys/socket.h>
    ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
    

    它的前两个参数分别是目的端和源端的文件描述符,后面两个参数是源端的偏移量和复制数据的长度,返回值是实际复制数据的长度。

  • 零拷贝(2次上下文切换2次拷贝)

    Linux 内核 2.4 版本开始起,对于支持网卡支持 SG-DMA 技术的情况下, sendfile() 系统调用的过程发生了点变化,具体过程如下:

  • 第一步,通过 DMA 将磁盘上的数据拷贝到内核缓冲区里;

  • 第二步,缓冲区描述符和数据长度传到 socket 缓冲区,这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里,此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中,这样就减少了一次数据拷贝;

4.下一节预告

  • kafka高效文件存储设计特点

推荐阅读

  • 深入浅出kafka原理-1-初识只作乍见之欢
  • 深入浅出kafka原理-2-Kafka为何那么快(高效)
  • 深入浅出kafka原理-3-高效文件存储设计特点
  • 深入浅出kafka原理-4-kafka网络机制原理

深入浅出kafka原理-2-Kafka为何那么快(高效)相关推荐

  1. kafka详解(JAVA API操作kafka、kafka原理、kafka监控)-step2

    1.JAVA API操作kafka  修改Windows的Host文件: 目录:C:\Windows\System32\drivers\etc (win10) 内容: 192.168.40.150 k ...

  2. 【kafka原理】kafka Log存储解析以及索引机制

    本文设置到的配置项有 名称 描述 类型 默认 num.partitions topic的默认分区数 int 1 log.dirs 保存日志数据的目录.如果未设置,则使用log.dir中的值 strin ...

  3. Kafka 原理简介

    Kafka 原理简介 Kafka 是一种高吞吐的分布式发布订阅的消息系统,可以处理消费者规模的网站中的动作流数据,具有高性能的,持久化,多副本,横向扩展能力. https://www.cnblogs. ...

  4. 深入浅出kafka原理-5-kafka同步副本ISR高低水位HW

    kafka replication副本 所谓副本,通产指分布式系统中不同机器中保存相同的数据拷贝,本质就是一个只能追加写消息的提交日志 提供数据冗余.即使系统部分组件失效,系统依然能够继续运转,因而增 ...

  5. 深入浅出kafka原理-1-初识只作乍见之欢

    目录 前言: 1.由来 2.特点 3.使用场景 4.两种模式 1.Kafka名词解释 2.Kafka历史由来 版本号 3.Kafka术语 前言: 1.由来 为什么使用消息队列? 从系统之间有通信需求开 ...

  6. kafka原理_P8架构师带你参透Kafka:设计原理、消息存储、消息消费原理等等

    本文转载自: linkedkeeper.com,作者:张松然 推荐阅读: 一个月面试了3家大厂Java岗,我发现这几个突破点 目录 Kafka的基本介绍 Kafka的设计原理分析 Kafka数据传输的 ...

  7. Apache kafka原理与特性(0.8V)

    前言: kafka是一个轻量级的/分布式的/具备replication能力的日志采集组件,通常被集成到应用系统中,收集"用户行为日志"等,并可以使用各种消费终端(consumer) ...

  8. python使用kafka原理详解真实完整版_史上最详细Kafka原理总结

    Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...

  9. Kafka原理+操作+实战

    Kafka原理+操作+实战 前面我和大家交流了kafka的部署安装.对于部署安装这都是小意思,不值得太多的提及.重点还是需要知道kafka原理.熟练掌握kafka命令以及灵活用于kafka场景. 干货 ...

最新文章

  1. 手机终端的阅读方式及未来
  2. 清华开源ResRep:剪枝SOTA!用结构重参数化实现CNN无损压缩 | ICCV 2021
  3. springmvc二十:数据绑定
  4. cocos2d-x 中文 乱码问题
  5. New Year and Ascent Sequence(二分)
  6. 一文说通Dotnet操作MongoDB GridFS
  7. 智慧城市同城V4小程序独立版v1.6.5+前端
  8. Android之播放一首简单的音乐
  9. 【Java从0到架构师】Redis 应用 - Jedis 基本使用、使用缓存的用户登陆、缓存常见问题
  10. mysql创建工作经历表_国内首款 Serverless MySQL 数据库重磅发布!
  11. 思科软件服务器怎么作用,TFTP 服务器的选择和使用
  12. photoshop文字变形教程:奇特的文字变形演示
  13. FrameBuffer操作
  14. Pr 视频效果:扭曲
  15. AC自动机模板(【CJOJ1435】)
  16. jQuery获取或设置元素的属性值
  17. minio 的python客户端工具
  18. C#控件之Windows Media Player简单加载视频播放
  19. 他被称为中国第一程序员,一人之力单挑微软,如今拜入武当修道(转载)
  20. 2021春季中国餐厅周联结600余家中高端餐厅即将开启

热门文章

  1. 检测您的CPU是否支持RemoteFX(SLAT二级地址转换)
  2. python登录京东滑动验证_Python 实现自动登录+点击+滑动验证功能
  3. Python 动物 , 人,狗,猫 面向对象关系 代码
  4. 古月居 机器人开发实践源码 编译报错问题解决方法
  5. 中国建设银行个人金融部组建PMO项目团队
  6. 电路分析第二章 戴维南、诺顿以及置换定理
  7. 推荐系统-通过数据挖掘算法协同过滤讨论基于内容和用户的区别
  8. 酷播云的统计分析功能截图
  9. shell编程之文本小工具
  10. 学习使我快乐 第十一天