问题描述
- 传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能?
-
如题,传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能?内核TCP/IP协议在中断处理阶段将网卡中数据拷贝到内核缓冲区,协议处理完后再将其拷贝到用户态,第一次拷贝很快,第二次拷贝很慢,大约占了整个处理流程的一半时间以上;
现在的零拷贝技术不再进行内核到用户的拷贝,而是直接进行一次内存映射,以此来提升网络性能。那么,我想问的是:内核协议栈是否可以使用零拷贝技术?若不能,主要原因是什么?
在此,我的一个想法是:是不是因为用户处理的是纯data,即不包括协议头,如果映射,用户无法识别数据区。但是不是很确定,请各位大神指点。
解决方案
协议除了考虑性能还要考虑扩展性。而且是否优化,优化到什么程度要看什么协议。
解决方案二:
这个就好比tcpdump和netsniff-ng实现上的区别,内核空间是所有进程共享的区域,传统的方式,将数据放在这个区,方便所有的应用去使用。
但是如果有的应用,强调性能,那么就会使用零拷贝技术,将数据直接从网卡拷贝到用户空间。
这也就是netsniff-ng不丢帧,而tcpdump在流量稍大的情况下有丢帧的原因。
解决方案三:
零拷贝是内存映射还是拷贝到用户?
传统内核如果直接映射,数据如何解析?
解决方案四:
零拷贝是内存映射还是拷贝到用户?
传统内核如果直接映射,数据如何解析?
解决方案五:
更多的细节,我推荐你看篇文章。
http://blog.chinaunix.net/uid-20279362-id-3763236.html
时间: 2024-12-02 15:12:02