为什么kafka性能非常高

博客探讨了Kafka如何通过零拷贝技术和顺序写提升性能。生产者将消息压缩后批量投递到缓冲区,由独立线程定时发送,减少服务器带宽使用。Kafka服务器采用日志分段和稀疏索引设计,利用硬盘的顺序写优势。零拷贝通过mmap和sendfile避免多次CPU拷贝,降低上下文切换,提高CPU效率。
摘要由CSDN通过智能技术生成
  1. 使用到零拷贝技术 属于linux操作系统内核自带;

  2. 顺序读写

  3. 分区模型架构

  4. 生产者投递消息 批量投递模型

  5. 消息压缩
    详细谈到解读:
    生产者

  6. 生产者先将消息投递给缓冲区 (Map集合 key=topic名称 value list集合(
    N条本地缓存消息))

  7. (在投递消息之前会将该消息实现压缩,压缩在发送给kafka服务器端)----目的是可以
    减少服务器带宽的资源

  8. 单独写一个send线程 定时或者实时批量形式获取缓冲区消息发送给kafka服务器端。

  9. 批量的形式发送消息 好处:减少客户端与服务器的通讯次数。


服务器:

Mq需要将该消息持久化到硬盘
kafka 属于日志存储系统实际将消息直接追加在segment 后面,将一个大的日志文件
拆分成n多个小不同segment 文件,在访问的时候就可以提高效率
设计原理:segment 分段设计+稀疏索引算法(查找)
不会对每个msg建立索引。

-----1.mq kafka 需要访问到硬盘 如何提高效率 顺序写
Mq kafka 存放消息 msg,直接追加在log
硬盘:顺序写和随机写
顺序写 300MB-600MB/s左右、6G mb/s 主要应用于在对大文件实现访问、
随机写的 100kb/s 杀毒

-----2. kafka 需要将该消息发送给消费者 零拷贝 减少用户态与内核态切换次数和需要cpu拷贝数据,直接零拷贝。
设计到零拷贝和顺序写原理

零拷贝 传统io读写性能非常差

在linux内核中 开辟两块空间
用户空间—用户态
内核空间–内核态

用户态到内核态切换
内核态到用户态切换
Cpu拷贝 和dma拷贝

零拷贝:

  1. 技术方案能够实现减少cpu拷贝次数或者不需要我们cpu拷贝
    A. 使用dma技术拷贝硬盘数据到内核空间,可以减少一次cpu拷贝次数。

  2. 如何减少用户态到内核态切换过程

1.消费者根据offset 获取kafka中的消息
Kafka 服务器 根据offset值读取本地文件消息

底层原理:
用户态(kafka线程)需要切换到内核态,
使用dma技术将本地消息拷贝内核缓冲区中,
使用cpu将内核缓存区数据拷贝到用户态(kafka线程)
2次上下文切换、1 cpu拷贝 1次dma拷贝

2.kafka就需要将该消息发送给网卡,网卡在将该数据发送消费者客户端。

1.用户空间需要切换到内核空间
2.使用cpu将用户空间的消息拷贝到内核空间
3.在使用dma技术拷贝网卡
4.内核空间切换到用户空间

上下文切换 4次。 cpu拷贝两次,dma两次。

1.使用到mmap内存映射 用户与内核空间实现共享虚拟内存,不需要在使用cpu将
内核空间的数据拷贝到用户空间。
2.使用sendfile 2.4 版本linux 内核 使用dma技术将硬盘的数据拷贝到内核态,在使用dma技术将内核态数据拷贝到网卡。
3. 最终只需要做两次上下文切换 两次dma数据拷贝(直接内存) 不需要cpu拷贝数据
从而减少上下文切换提高cpu的利用率。
Linux内核中已经实现好了。

mmap内存映射 +sendfile 实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值