-
使用到零拷贝技术 属于linux操作系统内核自带;
-
顺序读写
-
分区模型架构
-
生产者投递消息 批量投递模型
-
消息压缩
详细谈到解读:
生产者 -
生产者先将消息投递给缓冲区 (Map集合 key=topic名称 value list集合(
N条本地缓存消息)) -
(在投递消息之前会将该消息实现压缩,压缩在发送给kafka服务器端)----目的是可以
减少服务器带宽的资源 -
单独写一个send线程 定时或者实时批量形式获取缓冲区消息发送给kafka服务器端。
-
批量的形式发送消息 好处:减少客户端与服务器的通讯次数。
服务器:
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拷贝
零拷贝:
-
技术方案能够实现减少cpu拷贝次数或者不需要我们cpu拷贝
A. 使用dma技术拷贝硬盘数据到内核空间,可以减少一次cpu拷贝次数。 -
如何减少用户态到内核态切换过程
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 实现