【问题标题】:How to increase processor utilize for a specific action如何增加特定操作的处理器利用率
【发布时间】:2014-06-02 21:05:22
【问题描述】:

我有使用PcapDotNet DLL 并发送数据包的应用程序。 在某些具有高速速率(~50 Mbit/Sec 或~9000 数据包每秒)的Pcap 文件中,与原始Pcap 长度\持续时间相比,播放需要很长时间,我可以看到~25% 的 CPU(我有 4 个核心)被利用。 我在项目页面中问过这个问题,开发人员建议我并行我的程序,以便更好地利用我的资源,因为这是单线程程序。

这是我发送数据包的函数示例,它完成的工作最多,该函数还包括几个events,例如报告发送了多少数据包等...(不包括在 mt 示例中)

所以我的问题是,假设函数是工作最多的函数,我怎样才能以更好的方式分配我的 CPU 资源?

using (PacketSendBuffer sendBuffer = new PacketSendBuffer((uint)capLength))
{
    while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok) // Read the packets from the file
    {
        if (packet != null)
        {
            try
            {
                _outputCommunicator.SendPacket(packet); // Send the Packets
                _sentPackets++;
            }
            catch (Exception ex)
            { 
                // Throw exception
            }
        }
    }
}

【问题讨论】:

  • Pcap 只是昂贵,内核模式切换是不平凡的。并行化几乎不可能改善任何事情,线程可能只会轮流。 Pcap 有太多的活动部件,唯一确定的方法就是尝试一下。不要以为你会到达任何地方。如果不使用 Pcap,您会领先很多,目前尚不清楚您为什么需要它。套接字实现流,如果需要测试,也可以是文件流。

标签: c# .net multithreading pcap.net


【解决方案1】:

你确定你不是在旋转吗? inputCommunicator 的读取超时时间是多少?使用回调而不是无限循环来读取数据包可能是一个更好的主意:

http://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Opening%20an%20adapter%20and%20capturing%20the%20packets

或者您可以改用异步 I/O,因为您实际上并没有做任何真正的 CPU 工作。

无论如何,请尝试分析应用程序。找出它花时间的地方。查找任何并发问题。那样你就会有一个更清晰的画面。

【讨论】:

  • 因为我想报告发送了多少个数据包我旋转并单独发送每个数据包但我也使用 PcapDotNet 示例中的示例并使用发送缓冲区发送这个高速 Pcap 文件需要时间
  • 你能告诉我一个如何使用回调而不是无限循环的例子吗?
  • @user3328870 我发布的链接中有一个示例。
猜你喜欢
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多