Netty-零拷贝

本文最后更新于:2 年前

零拷⻉技术是指计算机执⾏操作时,CPU 不需要先将数 据从某处内存复制到另⼀个特定区域。这种技术通常⽤于通过⽹络传输⽂件时节省 CPU 周期和内存带宽。

在 OS 层⾯上的 Zero-copy 通常指避免在用户态和内核态之间来回 拷⻉数据。

⽽在 Netty 层⾯ ,零拷⻉主要体现在对于数据操作的优化。

  1. 使⽤ Netty 提供的 CompositeByteBuf 类, 可以将多个 ByteBuf 合并为⼀个逻辑上的 ByteBuf , 避免了各个 ByteBuf 之间的拷⻉。
  2. ByteBuf ⽀持 slice 操作, 因此可以将 ByteBuf 分解为多个共享同⼀个存储区域的 ByteBuf , 避免了内存的拷⻉。
  3. 通过 FileRegion 包装的 FileChannel.tranferTo 实现⽂件传输(底层是 sendfile 方法), 可以直接将⽂件缓冲区的数据发送到⽬标 Channel , 避免了传统通过循环 write ⽅式导致的内存拷⻉问题 。
  4. duplicate。逻辑上的复制。

slice(si lai si)

对原始 ByteBuf 进行切片成多个 ByteBuf,切片后的 ByteBuf 并没有发生内存复制,还是使用原始 ByteBuf 的内存,切片后的 ByteBuf 维护独立的 read,write 指针

image-20210804201821413

duplicate

就好比截取了原始 ByteBuf 所有内容,并且没有 max capacity 的限制,也是与原始 ByteBuf 使用同一块底层内存,只是读写指针是独立的。

image-20210804201834603

CompositeByteBuf(composite)

可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf,避免拷贝。