零拷贝技术

一、应用场景

  • 内核优化:快速上传/下载文件(fileChannel至socketChannel)
  • 内核优化:快速拷贝文件(fileChannel至fileChannel)

二、产生原因

  • 上传/下载文件:传统网络传输文件时,数据需要经过4次数据拷贝,分别为网卡到内核缓存、内核到用户缓存、用户到内核缓存、内核到磁盘,频繁切换用户态和内核态;
  • 拷贝文件:传统传输文件时,数据需要经过4次数据拷贝,分别为磁盘到内核缓存、内核到用户缓存、用户到内核缓存、内核到磁盘,频繁切换用户态和内核态;

三、解决方案

  • 零拷贝技术(初级版):解决内核和用户态间缓存数据拷贝和用户态切换

    // 解决内核和用户态间缓存数据拷贝和用户态切换
    import java.nio.channels.FileChannel;
    import java.nio.channels.SocketChannel;
    // 省略代码
    File file = new File("");
    FileChannel fileChannel = new FileInputStream(file).getChannel();
    SocketChannel socketChannel = socket.getChannel();
    // 数据经过3次数据拷贝、0用户态切换
    // 网卡到内核缓存、文件内核缓存到socket内核缓存、socket内核缓存到磁盘
    fileChannel.transferTo(0L, file.length(), socketChannel);
    
    
  • 零拷贝技术(升级版):scatter/gather解决初级班基础上,内核缓存间拷贝和内核发起的系统中断问题

    // 解决初级版基础上,内核缓存间拷贝问题
    ByteBuffer header = ByteBuffer.allocate(128);
    ByteBuffer body = ByteBuffer.allocate(1024);
    ByteBuffer[] byteBuffer = {header, body};
    // scatter分散数据
    fileChannel.read(byteBuffer);
    // gather重新聚集写入数据
    socketChannel.write(byteBuffer);
    
  • Kafka使用零拷贝技术(初级版)

    // 文件零拷贝
    // 数据经过3次数据拷贝、0用户态切换
    // 网卡到内核缓存、文件内核缓存到socket内核缓存、socket内核缓存到磁盘
    fileChannel.transferTo(0L, file.length(), socketChannel);
    

四、参数

参数 作用和优点 缺点
InputStream/OutputStream 数据流:磁盘、内核、用户、内核、磁盘
优点:实现简单
1、4次拷贝、4次内核切换
2、阻塞
fileChannel.transferFrom/transferTo 数据流:磁盘、内核、内核、磁盘
优点:减少拷贝、内核切换次数
1、3次拷贝、0次内核切换
2、伪零拷贝(内核到内核)
scatter/gather 数据流:磁盘、内核、磁盘
优点:减少拷贝、内核切换次数
1、2次拷贝、0次内核切换
2、传输时不能更改数据
3、真零拷贝
posted @ 2022-04-26 17:03  SArtOnline  阅读(47)  评论(0编辑  收藏  举报