|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

 

 

posted on   yanqi_vip  阅读(24)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示