kafka 高吞吐设计分析

说明

  1. 本文基于 kafka 2.7 编写。
  2. @author blog.jellyfishmix.com / JellyfishMIX - github
  3. LICENSE GPL-2.0

概括

支撑 kafka 高吞吐的设计主要有以下几个方面:

  1. 网络 nio 主从 reactor 设计模式

  2. 顺序写。

  3. 零拷贝。

producer

  1. producer 开启压缩后是批量压缩,broker 不解压没有解压消耗,consumer 批量拉取并解压,实现端到端压缩。

broker

网络 nio 主从 reactor 设计模式

  1. nio 主从 reactor 模式和 tomcat, netty 类似。nio 主从 reactor 模式请见文章: https://blog.csdn.net/weixin_43735348/article/details/128445926
  2. 采用主从 reactor 的原因: acceptor 线程专门负责建立连接, selector 线程。acceptor 和 selector 线程资源隔离,且两个资源各自可以根据压力扩展线程数。

顺序读写

  1. kafka 写日志文件的时候用的是追加消息的形式,只在文件尾部顺序写消息。读时在文件头部顺序读取消息。不涉及修改消息,所以不需要随机写。
  2. 这样的设计即使用的是传统机械硬盘,访问速度也快。操作系统和硬件对顺序写和顺序读有优化,具体采用的是后写和预读(读时连带读出附近的页)。另外机械硬盘磁针寻址也对顺序读写更友好,对于机械硬盘大概顺序写比随机写快 3 个数量级。

零拷贝

  1. 非零拷贝发送数据过程: 用户执行系统调用读磁盘,用户态切换成内核态。硬盘上的数据通过 DMA 读入内核空间后,cpu 拷贝至用户空间,切换回用户态。执行网络 IO 系统调用,用户态切换成内核态,cpu 拷贝数据至内核空间(socket 缓存),通过 DMA 写入网卡。
    1. 存在两次 cpu 拷贝和两次内核态用户态切换浪费。

非零拷贝.png

  1. 零拷贝基于操作系统提供的系统调用 – sendfile()。用户执行系统调用切换至内核态,DMA 从硬盘拷贝数据至内核空间,socket 缓存写入内核空间中数据的地址等描述信息。由 DMA 把数据从内核空间传递至网卡。这样可节约两次 cpu 的拷贝开销。

零拷贝.png

相关推荐

  1. Kafka吞吐量的原因

    2024-04-06 06:12:05       37 阅读
  2. kafka设置分区

    2024-04-06 06:12:05       24 阅读
  3. kafka topic分区设定

    2024-04-06 06:12:05       61 阅读
  4. kafka 消息防丢失/消息防重复设计分析

    2024-04-06 06:12:05       41 阅读
  5. Kafka可用机制

    2024-04-06 06:12:05       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 06:12:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 06:12:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 06:12:05       87 阅读
  4. Python语言-面向对象

    2024-04-06 06:12:05       96 阅读

热门阅读

  1. golang defer实现

    2024-04-06 06:12:05       35 阅读
  2. 006 CSS常见选择器 CSS伪类 CSS伪元素

    2024-04-06 06:12:05       36 阅读
  3. 《观察者模式(极简c++)》

    2024-04-06 06:12:05       32 阅读
  4. 逻辑回归(Logistic Regression)详解

    2024-04-06 06:12:05       34 阅读
  5. 课时86:流程控制_函数基础_函数退出

    2024-04-06 06:12:05       40 阅读
  6. 提升写作效率:ChatGPT助力学术论文撰写

    2024-04-06 06:12:05       36 阅读
  7. 详解Qt中的容器

    2024-04-06 06:12:05       35 阅读
  8. Qt基本控件

    2024-04-06 06:12:05       30 阅读