零拷贝技术
一、应用场景
- 内核优化:快速上传/下载文件(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、真零拷贝 |
本文来自博客园,作者:SArtOnline,转载请注明原文链接:https://www.cnblogs.com/sartonline/p/16195548.html