|NO.Z.00066|——————————|BigDataEnd|——|Hadoop&kafka.V51|——|kafka.v51|磁盘存储|零拷贝/页缓存/顺序写入.v01|
一、磁盘存储:零拷贝
### --- [kafka高级特性解析]
~~~ [磁盘存储:零拷贝]
~~~ [磁盘存储:页缓存]
~~~ [磁盘存储:顺序写入]
### --- 零拷贝
~~~ kafka高性能,是多方面协同的结果,包括宏观架构、分布式partition存储、ISR数据同步、
~~~ 以及“无所不用其极”的高效利用磁盘/操作系统特性。
~~~ 零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数。通常是说在IO读写过程中。
~~~ nginx的高性能也有零拷贝的身影。
### --- 传统IO
~~~ 比如:读取文件,socket发送
~~~ 传统方式实现:先读取、再发送,实际经过1~4四次copy。
buffer = File.read
Socket.send(buffer)
~~~ 第一次:将磁盘文件,读取到操作系统内核缓冲区;
~~~ 第二次:将内核缓冲区的数据,copy到application应用程序的buffer;
~~~ 第三步:将application应用程序buffer中的数据copy到socket网络发送缓冲区(属于操作系统内核的缓冲区);
~~~ 第四次:将socket buffer的数据,copy到网络协议栈,由网卡进行网络传输。

~~~ 实际IO读写,需要进行IO中断,需要CPU响应中断(内核态到用户态转换),
~~~ 尽管引入DMA(DirectMemory Access,直接存储器访问)来接管CPU的中断请求,
~~~ 但四次copy是存在“不必要的拷贝”的。
~~~ 实际上并不需要第二个和第三个数据副本。数据可以直接从读缓冲区传输到套接字缓冲区。
### --- kafka的两个过程:
~~~ 网络数据持久化到磁盘 (Producer 到 Broker)
~~~ 磁盘文件通过网络发送(Broker 到 Consumer)
~~~ 数据落盘通常都是非实时的,Kafka的数据并不是实时的写入硬盘,
~~~ 它充分利用了现代操作系统分页存储来利用内存提高I/O效率。
### --- 磁盘文件通过网络发送(Broker 到 Consumer)
~~~ 磁盘数据通过DMA(Direct Memory Access,
~~~ 直接存储器访问)拷贝到内核态 Buffer直接通过 DMA 拷贝到 NIC Buffer(socket buffer),无需 CPU 拷贝。
~~~ 除了减少数据拷贝外,整个读文件 ==> 网络发送由一个 sendfile 调用完成,
~~~ 整个过程只有两次上下文切换,因此大大提高了性能。
~~~ # Java NIO对sendfile的支持就是FileChannel.transferTo()/transferFrom()。
~~~ # fileChannel.transferTo( position, count, socketChannel);
~~~ 把磁盘文件读取OS内核缓冲区后的fileChannel,直接转给socketChannel发送;底层就是sendfile。
~~~ 消费者从broker读取数据,就是由此实现。
~~~ 具体来看,Kafka 的数据传输通过 TransportLayer 来完成,
~~~ 其子类 PlaintextTransportLayer 通过Java NIO 的 FileChannel 的 transferTo 和 transferFrom
~~~ 方法实现零拷贝。
### --- 方法:PlaintextTransportLayer
@Override
public boolean hasBytesBuffered() { return false; }
@Override
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {
return fileChannel.transferTo(position, count, socketChannel);
}
}
### --- transferTo 和 transferFrom 并不保证一定能使用零拷贝,需要操作系统支持。
~~~ Linux 2.4+ 内核通过 sendfile 系统调用,提供了零拷贝。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv013-kafka
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通