kafka与linux系统调用

       尽管kafka的消息保存在磁盘中,kafka确有着高吞吐率,支持每秒百万级的写入请求,一个重要的原因是kafka使用了多项linux系统调用,使得读写速度那么快。本篇首先简要介绍kafka,然后说明kafka使用的linux系统调用mmap和sendfile。
       kafka的broker为消息中间件处理节点(服务器),一个节点就是一个broker,一个Kafka集群由一个或多个broker组成。Kafka对消息进行归类,发送到集群的每一条消息都要指定一个topic。topic物理上的概念,每个topic包含一个或多个partition,一个partition对应一个文件夹,这个文件夹下存储partition的数据和索引文件,每个partition内部是有序的。kafka consumer,从broker读取消息消费数据。

       kafka高吞吐率原因:

  1. 顺序写盘
    每个partition在存储层面是一个append log文件,发布到此partition的消息会追加到log文件的尾部,为顺序写人磁盘(顺序写磁盘比随机写内存的效率还要高)。每条消息在log文件中的位置成为offset(偏移量),offset为一个long型数字,唯一标记一条消息。
  2. Memory Mapped Files(mmap)
    即便是顺序写硬盘,硬盘访问速度还是不可能赶上内存,所以kafka的数据并不是实时写入硬盘,它充分利用操作系统分页存储提高IO效率。mmap的工作原理是直接利用操作系统的page cache实现文件到内存的直接映射,完成映射之后对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。通过mmap,进程像读写硬盘一样读写内存。
  3. 基于sendfile实现零拷贝
    消费者consumer从硬盘读取消息时,使用了linux系统调用sendfile,为何称为“零拷贝”呢,这是由于传统read/write方式用到多次拷贝和上下文切换,而使用sendfile减少了拷贝次数和内核空间与用户空间之间的切换。普通文件传输过程:硬盘文件-》内核空间-》用户空间 -》内核空间(socket缓冲区)-》网络协议引擎。
    kafka与linux系统调用_第1张图片sendfile系统调用在内核版本2.1中被引入,目的是简化通过网络在两个本地文件之间进行的数据传输过程。sendfile系统调用的引入,不仅减少了数据复制,也减少了上下文切换的次数,消除冗余步骤,从而减少开销,提高性能。sendfile传输过程:硬盘文件-》内核空间-》内核空间(socket缓冲区)-》网络协议引擎。
    kafka与linux系统调用_第2张图片
    参考:Kafka架构图
    为什么Kafka速度那么快

你可能感兴趣的:(kafka)