阅读:2293回复:19
中间层抓包性能问题
我在中间层prreceivepacket中把包中的数据放到一个UChar的buffer中然后用Event通知应用程序,应用程序将buffer内容拷贝到应用程序,但通过和其他产品比较发现丢包率很高,有20%,哪位大侠能说说是什么原因怎么改进
|
|
沙发#
发布于:2004-04-16 07:28
[quote][quote]事件机制需要应用层和操作系统核心及驱动之间的交互,这是个费时的过程,核心在处理事件对象时,是通过系统队列来完成的,不知我的理解对不对? 你说的EVENT是通过队列来完成的?????如果是队列的话。。。也不应该会掉包~~~~而是相应的慢一点到达而已。。。。不知道我的说法对不对~~~呵呵。。。 事件机制需要应用层和操作系统核心及驱动之间的交互,这是个费时的过程??为什么这个过程会费时呢???是不是因为你说的队列的关系呢??? [/quote] buffer是在驱动中的等EVENT事件到达时buffer的内容已经被重写所以会丢 [/quote] 不是吧。。。。。好象根本就是EVENT根本就响应不过来。。。。我曾经测试过。。。不进行BUF COPY。。。而是直接采用EVENT来通知一下。。。。根本EVENT就响应不过来。。。。 |
|
板凳#
发布于:2004-04-15 13:48
[quote]事件机制需要应用层和操作系统核心及驱动之间的交互,这是个费时的过程,核心在处理事件对象时,是通过系统队列来完成的,不知我的理解对不对? 你说的EVENT是通过队列来完成的?????如果是队列的话。。。也不应该会掉包~~~~而是相应的慢一点到达而已。。。。不知道我的说法对不对~~~呵呵。。。 事件机制需要应用层和操作系统核心及驱动之间的交互,这是个费时的过程??为什么这个过程会费时呢???是不是因为你说的队列的关系呢??? [/quote] buffer是在驱动中的等EVENT事件到达时buffer的内容已经被重写所以会丢 |
|
地板#
发布于:2004-04-15 00:27
事件机制需要应用层和操作系统核心及驱动之间的交互,这是个费时的过程,核心在处理事件对象时,是通过系统队列来完成的,不知我的理解对不对? 你说的EVENT是通过队列来完成的?????如果是队列的话。。。也不应该会掉包~~~~而是相应的慢一点到达而已。。。。不知道我的说法对不对~~~呵呵。。。 事件机制需要应用层和操作系统核心及驱动之间的交互,这是个费时的过程??为什么这个过程会费时呢???是不是因为你说的队列的关系呢??? |
|
地下室#
发布于:2004-04-14 19:52
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2004-04-14 19:23
有没有分呀???
|
|
6楼#
发布于:2004-04-14 19:22
慢也不会掉包。 首先要声明。。。并不是掉包。。。而是EVENT响应不及时。。。。具体为什么会这样。。我也不是太清楚。。。请有关的高手做出相应的解答。。。。。 |
|
7楼#
发布于:2004-04-14 16:26
老大确实是因为Event响应不及而造成丢包的,我改为每收到8个才通知一次然后一次读出就基本上解决了这个问题
|
|
8楼#
发布于:2004-04-14 16:18
慢也不会掉包。
|
|
9楼#
发布于:2004-04-14 15:16
SORRY我说错了。 我并不清楚你到底采用的是什么EVENT的方法。。我做过测试。。在内核处数据采集一切正常。。。但是。。EVENT相对的速度还是慢很多。。所以我才会采用APC的工作模式。。。。 |
|
10楼#
发布于:2004-04-14 15:07
但是我丢的包多数是那种响应快而且短的包如在直联访问FTP时的控制连接报文经常丢,还有问一下如果底层是用NdisMIndicateReceivePacket那PtReceivePacket是不是可以接收所有的包
|
|
11楼#
发布于:2004-04-14 12:53
SORRY我说错了。
我个人认为,网卡的传输速度和内存的速度根本不是一个数量级。EVENT作为一个内核对象被锁定在非分页内存中,再慢也不至于满足不了网卡的传输,否则WINDOWS造就崩溃了。一般说他慢是相对于CRITICAL_SECTION来说的。 我也用EVENT的方法取过包,发到应用层,经过处理,并写入文件,如此多的操作,也不见掉包。 可以说网卡的吞吐量比硬盘还差很远。 我说这些并不是排斥队列的方法,当让用队列可能更好,我只是想说明,如果取包的时候就出了问题,用什么方法都掉包。 |
|
12楼#
发布于:2004-04-14 11:53
asmsys说的可能是有点着急,说的不很清楚,他的意思应该是说,一串buffer,实际上还是一个包,在系统中,一个包是可能不止一个buffer组成的.你看看ndisgetnextbuffer,可以遍历到组成一个包的所有buffer,然后你才得到一个完整的包,和里面的内容.
|
|
|
13楼#
发布于:2004-04-14 11:29
PtReceivePacket一般收到的是一串包,如果你只COPY了一个,掉包是自然的了。 PtReceivePacket中什么地方反映是一串包的,如果是又怎么一个个取出来 |
|
14楼#
发布于:2004-04-13 18:53
采用EVENT事件来通知COPY数据到APP中效率及其低下。。。建议采用APC工作模式。。。。。。具体的方法。。参见PCAUSE。。。。这样的话掉包率就会比较低了。。。
[编辑 - 4/13/04 by cyf_rich] |
|
15楼#
发布于:2004-04-13 13:46
使用事件对象和应用程序同步读取IM获得的数据包,效率是查觉低的,你就使用其它机制,比如你可以将收到的数据包进入一等待队列中,应用程序从队列中读取,这样效率会高很多,我就是这么处理的! 能不能给个例子看看 |
|
16楼#
发布于:2004-04-13 13:44
PtReceivePacket一般收到的是一串包,如果你只COPY了一个,掉包是自然的了。 是这样的吗,老大?PtReceivePacket的参数不是只有一个packet吗,怎么会是一串packet,那如果如你所说又怎么把它一个个的取出来 |
|
17楼#
发布于:2004-04-13 13:22
使用事件对象和应用程序同步读取IM获得的数据包,效率是查觉低的,你就使用其它机制,比如你可以将收到的数据包进入一等待队列中,应用程序从队列中读取,这样效率会高很多,我就是这么处理的! 能不能给一个例子借鉴一下!谢谢! |
|
|
18楼#
发布于:2004-04-13 13:08
用户被禁言,该主题自动屏蔽! |
|
19楼#
发布于:2004-04-13 13:01
PtReceivePacket一般收到的是一串包,如果你只COPY了一个,掉包是自然的了。
|
|