本文描述通过一种叫做Zore Copy的技术来提升运行在Linux和UNIX上的Java程序的IO性能。
Zero copy避免冗余的数据拷贝并减少用户态和内核态之间的上下文切换。
很多WEB应用都服务大量的静态文件,这些静态文件大多从磁盘读取并返回到socket中。这些操作需要相对较少的CPU,但是比较低效:kernel读取磁盘数据并通过用户态返回给应用,之后应用通过用户态把数据写到socket。事实上,应用作为一个低消的中间介质将数据从磁盘读取并返回给socket。
每一次通过用户态的数据传输,数据都必须要被复制,并且消耗CPU核内存带宽。幸运的是可以通过zore copy来减少拷贝次数。使用zore copy要求内核直接从磁盘复制数据并写入socket,而不通过应用程序。Zero copy减少用户态和内核态的上下文切换,减少拷贝次数来提升性能。
Java类库通过Linux和UNIX系统的tranferTo()来支持zore copy。可以通过transferTo()方法直接从一个channel写到目标channel,并不需要数据通过应用程序。本文首先说明用传统方法传输简单文件的过高开销,然后展示如何通过zore copy的transferTo()方法来获得更好的性能。
Data transfer: Thre traditional approach
考虑读取一个文件并通过网络传输到另一个程序,其核心的操作如list 1中所示。
File.read(fileDesc, buf, len);
Socket.send(socket, buf, len);
主要就是读取文件内容到buffer中,之后将buffer数据发送到socket。
下图展示整个过程中数据的拷贝:
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26
学习是年轻人改变自己的最好方式