DataNode重要的数据功能之一是读取数据块
常规的读数据操作
- Datanode会首先将数据块从磁盘存储(也可能是SSD、内存等异构存储)读入操作系统的内核缓冲区。
- 再将数据跨内核推到用户缓冲区
- 然后会再次跨内核将数据推回内核中的套接字缓冲区
- 最后将数据写入网卡缓冲区
与此同时还会造成四次上下文切换。
步骤1和4的操作发生在外设和内存之间,由DMA(Directory Memory Access,直接内存读取)引擎执行,而步骤2和3的拷贝发生在内存中,由CPU执行。
java NIO thransferTo
javaNIO提供了零拷贝模式来消除多余的拷贝操作,并且减少内核态与用户态之间的上下文切换。使用零拷贝的应用程序可以要求内核直接将数据从磁盘文件拷贝到网卡缓冲区,从而大大提高了程序的性能。数据拷贝次数从4次降低到了2次,上下文切换次数也从4次降低到了2次。
public abstract long transferTo(long position, long count,
WritableByteChannel target)
throws IOException;
transferToFully
HDFS SocketOutputStream的方法transferToFully 封装了thransferTo
这样直接使用了DMA 引擎将文件内容从内核缓冲区传输到网卡缓冲区。