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

    本节主要讲解kafka的高吞吐,这里的主要指的是Kafka为什么快?

    主要因为应用了 顺写日志、页缓存、零拷贝、消息压缩等技术。

1.顺写日志

    kafka依赖文件系统(磁盘)来存储消息。kafka在设计时采用文件追加的方式来写入消息。

    只能在日志文件的尾部追加新的消息,并且不允许修改已经写入的消息,属于典型的顺序写盘操作。

    顺序写盘的速度不仅比随机写盘的速度快,而且比随机写内存的速度快。

2.页缓存

    页缓存是操作系统实现的一种主要的磁盘缓存,以此减少磁盘I/O的操作。

    具体来说,就是把磁盘的数据缓存到内存中,把磁盘的访问变为对内存的访问。

    页缓存中使用了"预读后写"操作。

2.1 页缓存的读取

	    Linux系统在读取文件时,会优先从页缓存中读取文件内容,如果页缓存不存在,系统会先从磁盘中读取文件内容更新到页缓存中,
	
	    然后再从页缓存中读取文件内容并返回。大致过程如下:
	
	         ① 进程调用库函数read发起读取文件请求
	
	         ② 内核检查已打开的文件列表,调用文件系统提供的read接口
	
	         ③ 找到文件对应的inode,然后计算出要读取的具体的页
	
	         ④ 通过inode查找对应的页缓存 如果页缓存节点命中,则直接返回文件内容;
	
	           如果没有对应的页缓存,则会产生一个缺页异常(page fault)。
	
	           这时系统会创建新的空的页缓存并从磁盘中读取文件内容,更新页缓存,然后重复第4步
	         
	         ⑤ 读取文件返回
	
	    所以说,所有的文件内容的读取,无论最初有没有命中页缓存,最终都是直接来源于页缓存。
	
	    read通常会阻塞直到进程读取到数据,而为了减少读操作的这种延迟,
	
	    Linux系统还是用了“预读”的技术,即从磁盘中读取数据时,内核将会多读取一些页到页缓存中。

2.2 页缓存的写入

	    因为页缓存的存在,当一个进程调用write时,对文件的更新仅仅是被写到了文件的页缓存中,
	
	    让后将对应的页标记为dirty,整个过程就结束了。
	
	    Linux内核会在周期性地将脏页写回到磁盘,然后清理掉dirty标识。
	    
	    由于写操作只会把变更写入页缓存,因此进程并不会因此为阻塞直到磁盘IO发生 ("后写"技术)。
	
	    如果此时计算机崩溃,写操作的变更可能并没有发生在磁盘上。
	
	    所以对于一些要求比较严格的写操作,比如数据系统,就需要主动调用fsync等操作及时将变更同步到磁盘上。
	Kafka 中大量使用了页缓存,这是 Kafka 实现高吞吐的重要因素之一。 
	
	消息都是先被写入页缓存,然后由操作系统负责具体的刷盘任务的。
	
	同时Kafka中同样提供了同步刷盘及间断性强制刷盘(fsync)的功能,

3 零拷贝

    零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之。

    零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。

    Linux操作系统而言,零拷贝技术依赖于底层的 sendfile()方法实现。

    对应于 Java 语言,FileChannal.transferTo()方法的底层实现就是sendfile()方法。

3.1 非零拷贝技术

    首先讲解一下正常的非零拷贝技术,考虑一个常见情形:你需要将静态内容(类似图片、文件)展示给用户。

    这个情形就意味着需要先将静态内容从磁盘中复制出来放到内存buf中,

    然后将这个 buf 通过套接字(Socket)传输给用户,进而用户获得静态内容。

    在这个过程中,文件A 经历了4次复制的过程,如图所示

        ① 调用read()时,文件A中的内容被复制到了内核模式下的 Reader Buffer 中。

        ② CPU 控制将内核模式数据复制到用户模式下。

        ③ 调用write()时,将用户模式下的内容复制到内核模式下的 Socket Buffer。

        ④ 将内核模式下的 Socket Buffe 的数据复制到网卡设备中传送。

在这里插入图片描述

3.2 零拷贝技术

    采用了零拷贝技术,那么应用程序可以直接请求内核把磁盘中的数据传输给 Socket,如图所示

    零拷贝技术通过DMA(Direct Memory Access)将文件内容复制到内核模式下的Read Buffer。
    
    数据只经历了2次复制就从磁盘中传送出去了 并且上下文切换也变成了2次。

在这里插入图片描述

4.面试题:“kafka为什么快?” 的正确回答姿势

   一般来讲,面试题有以下几种:

       1. Kafka 为什么这么快?
       2. 如何对 Kafka 集群进行调优?
       3. Kafka 的高性能网络架构是如何设计的?
       4. Kafka 集群资源如何评估?


    示范如下: Kafka 为什么这么快? 

        1. 首先,Kafka 作为一个消息系统,通过 topic 的方式来管理 message,

            把这些消息都顺序写入磁盘文件来提高写入速度,其实这些消息并没有实时写入磁盘,

            而是充分利用了现代操作系统分页存储来利用内存提高IO效率。

        2. 其次,它的工作原理是直接利用操作系统的 page 来实现文件到物理内存的直接映射。

           完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。
        
        3. 再次,Kafka 也基于 sendfile 实现 zero copy,简化网络上和两个本地文件之间的数据传输,

           sendfile 的引入不仅减少了数据复制,还减少了上下文切换。
        
        4. 最后,Kafka 为了能网络上提高传输数据的效率,message 也支持压缩。在很多情况下,系统的瓶颈不是CPU或磁盘,
           而是网络 IO,对于需要在广域网上的数据中心之间发送消息的数据流水线尤其如此。

        总结:Kafka 速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络 IO 损耗,

            通过 mmap 提高 IO 速度,写入数据的时候由于单个 partition 是末尾添加所以速度最优;

            读取数据的时候配合 sendfile 直接暴力输出。

        (注:第4小节摘抄于微信公众号:过往记忆大数据)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值