8. Performance
使用WinDivert将网络流量重定向到/从用户应用程序返回会导致性能开销,例如复制数据包数据和用户/内核模式上下文切换。在高负载(1Gbps)下,这些开销可能非常大。以下技术可用于减少开销(按重要性排序):
选择性筛选:仅选择用户应用程序感兴趣的网络流量子集。不匹配的流量将继续使用默认路径,而不会产生额外的开销。
批处理模式:WinDivertRecvEx()和WinDivertSendEx()函数支持批处理,允许一次接收/发送多个数据包。这可以显著减少与用户/内核模式上下文切换相关的开销。
多线程:可以将包处理分散到多个线程上,确保用户应用程序不会成为瓶颈。也就是说,有时生成过多的线程会降低性能。
小缓冲区:与小缓冲区相比,大缓冲区通常会产生更多的开销。一般来说,缓冲区大小应该尽可能准确地反映预期的使用情况。
简单过滤器:目前WinDivert不优化过滤器编译,所以它是由用户应用程序来确保过滤器是简单的/优化的。
重叠I/O:这允许用户应用程序在进行接收/发送操作的同时执行其他任务,这可能会提高某些应用程序的性能。单个线程也可以同时启动多个接收/发送操作。然而,使用重叠的I/O可能会很棘手,重要的是,传递给WinDivertRecvEx()或WinDivertSendEx()的所有缓冲区(包括overlapped结构)在操作完成之前不会被用户应用程序修改。
队列长度/大小/时间:如果这些值太小,则可能会在高负载下丢弃一些数据包。这些值可以使用WinDivertSetParam()函数来控制。
exe示例程序可用于试验不同的批处理大小和线程数。

753

被折叠的 条评论
为什么被折叠?



