美文网首页
Kafka 高性能原因分析

Kafka 高性能原因分析

作者: sleep_NULL | 来源:发表于2017-03-17 21:07 被阅读249次

    Kafka 作为一款基于磁盘存储的高吞吐消息中间件,常作为 log、event 等流式数据的通道,在流式计算领域也有丰富应用,下面简单分析其高吞吐、高性能的几点原因

    1. 零拷贝
      普通的数据传输一般涉及 read、write 两个系统调用,而 kafka 的 broker 传递数据给消费者使用零拷贝的技术,底层使用了 sendfile 的系统调用,减少了用户态与内核态的上下文切换和数据拷贝的次数,read、write 两次系统调用涉及 4 次的上下文切换和 4 次的数据拷贝才能从一端到另一端,而 sendfile 系统调用只需要 2 次的上下文切换和 3 次的数据拷贝,减少了两次的上下文切换和一次拷贝动作,善用零拷贝可以优化基于磁盘的分布式系统的数据传输

    2. 顺序写 + page cache
      普通磁盘的随机写性能较低,顺序写的性能则好很多,kafka 的存储模型就是一个 FIFO 的队列模型,不断地追加写文件,直到达到配置的大小限制(默认1GB)后进行翻滚,而当 kafka 的 partition 增多后,每个磁盘的随机写会增加,kafka 本身写入逻辑非常简单,使用普通的 java api,所以其完全依赖 linux 系统本身的 page cache,写到 page cache 后不是立刻写入磁盘,而要等待系统的 pdflush 线程进行刷盘操作,官方文档描述了 3 点使用 page cache 相对应用层缓存的优点:

      • 多次连续写入能批量汇聚成一次的物理写提高吞吐量
      • 写入重排最小化磁头移动的次数,优化写入性能
      • 自动使用系统的剩余内存
    3. 分区(partition)
      partiton 是 topic 的子概念,一个 topic 可以分成多个 partition,partition 是 kafka 横向扩展和并行化的基础,每个 partition 都可以并行写入与读取,一般会预估数据的量级,选择合适的 partition 数量进行 topic 的创建,某种程度上而言,partition 越多意味着读写的吞吐量越大,当然不是绝对的,分区越多对于磁盘的顺序写影响越大,更容易产生随机写降低性能。关于分区基本上所有分布式(存储、计算)系统都有类似抽象,基本都是依托其作为水平扩展的基础

    4. reactor 网络模型
      Kafka 的网络层使用 reactor 的线程模型,单个 acceptor 线程负责处理所有客户端的连接,建立连接后将 socket 的轮询分发给多个 processor 线程处理读写请求,processor 只负责数据的接收和发送,其后还有多个 handler 线程进行具体的逻辑操作,通过这样的异步线程模型,kafka 能够与成千上万的客户端交互而毫无压力

    相关文章

      网友评论

          本文标题:Kafka 高性能原因分析

          本文链接:https://www.haomeiwen.com/subject/jqlynttx.html