zero-copy技术
Linux网络IO数据传输过程图
整个操作过程中,做了四次用户态和内核态的状态切换,数据从网卡copy到内核缓冲区,再从内核缓冲区copy到user-space;写入时从user-space copy到内核缓冲区,再从内核缓冲区copy到硬盘设备。做了太多的无用功。
ZERO-COPY主要分为三个大的优化方面
- api接口方面:通过新的api接口,可以减少状态切换,介绍用户数据的copy
- 硬件支持方面:通过新的硬件支持,让cpu可以从copy数据的逻辑中释放出来, 让新硬件代替cpu做数据copy功能(DMA技术
- 用户态直接操作硬件:比较理想,局限性很多
api层面主要有以下几个linux支持的接口,这些接口也都由golang来对应判断
- IO.Copy() IO.ReadFrom() IO.WriteTo()
- linux -> splice() / sendFile()