阅读:2030回复:7
换个话题――高速网络下用NDIS是不是太慢了???
同志们,大家把眼光放远一点,NDIS好则好矣,但效率是不是不太足够啊?
我们今天面对的是千兆甚至万兆网,这么多的处理流程显然不太适应,同志们怎么看?有没有别的好方向,指点一下? |
|
|
沙发#
发布于:2005-04-08 18:20
没人理。这个版面日益萧条啊
|
|
|
板凳#
发布于:2005-04-09 18:57
传统的处理网络数据包的方式由于网卡驱动程序运行在内核空间,当网卡收到包以后,包会存放在内核空间内,由于上层应用运行在用户空间,无法直接访问内核空间,因此要通过系统调用往上层应用系统送,这时候会发生一次复制过程。同时这个过程常常还伴随着一次从抓包库到检测引擎的复制过程。如果对于一般应用来说,很少的操作来处理网络通信,这样的系统开销还可以忍受,但是对于入侵检测系统这样大量读取网络数据包的应用来说,这样的开销就很难忍受了。
“零拷贝”技术是指网卡驱动程序共享一段内存区域,当网卡抓到数据包以后直接写到共享内存,这样的一个处理过程减少了至少一次复制。同时减少了一次网卡驱动程序向用户空间复制网络数据包的系统调用。而一次系统调用的开销其实是相当大的,对于入侵检测系统来说由于要频繁地跟内核空间的网卡驱动程序打交道,因此按传统方法会造成大量的系统调用,从而导致系统的性能下降。但是采用了“零拷贝”技术后有效的避免了这一点。 关于这段论述,如果用NDIS的话,在技术上应该如何实现呢?只要求讲讲思路 |
|
|
地板#
发布于:2005-04-14 14:13
你上面的话已经说的很清楚了,两者共享,实现零拷贝
|
|
|
地下室#
发布于:2005-04-14 15:11
好像不是一个意思。因为在NDIS本身的处理流程中,当网络数据包来到时就会触发一次系统调用,发出中断同时把数据包存到内核缓冲区中。这种体制本身是不是就影响了效率? |
|
|
5楼#
发布于:2005-04-19 16:11
在发送方向的零拷贝是很简单的,在NDIS50以上的版本中NDIS提供ScatterGatherList支持,它实际上直接把Data(Socket) Buffer、Udp/TCP_IP Header和MACHeader所组成的各个Buffer的物理地址直接给Driver,Driver再把这些地址通过某种方式传递给硬件,由硬件的DMA控制器直接去指定的地址抓包,这样整个组包的过程没有任何的数据拷贝。而在接收方向则反之,不过数据可能至少会被拷贝一次,以拷贝到Socket的Buffer中。
在NDIS50以上的NDIS版本还提供TaskOffload支持,NDIS可以将传统上由软件来计算的TCP/IP包的Checksum的计算(发送和接收方向)以及TCP自动分段(发送方向,LargeSend)都交由底层的硬件来完成,这样可以大大降低CPU的负载,目前的千兆网卡多都支持该功能,目前PCIE的千兆网卡使用NETIQ测试,可以达到900多M的速率,性能很好。 |
|
6楼#
发布于:2005-04-19 16:39
谢谢bingjie指点,已放分。
还想再问问: 我们自己编写NDIS IM驱动时,应该注意哪些方面以保证高速?以DDK中带的Pathru为基础肯定是不行了吧? 能不能具体地说说在哪些方面做哪些设计?如果太麻烦就算了,呵呵 |
|
|
7楼#
发布于:2005-04-19 20:47
对不起,除了passthru,我不知道是否还有比它更高效的代码,没有做过这方面的比较^_^。
|
|