【问题标题】:Handle high data-rates of UDP segments处理 UDP 段的高数据速率
【发布时间】:2012-06-01 10:17:19
【问题描述】:

我正在尝试构建系统的接收端,它通过千兆以太网链路发送 UDP 段。到目前为止,我已经尝试过 Matlab 和 Python,但两种解决方案似乎都没有效率。我总是遇到巨大的丢包率,这不能用 UDP 不可靠的事实来解释。我想我没有足够快地读取传入的缓冲区,所以新的帧被丢弃了。

我的问题是,C/C++ 实现会比 Matlab 和 Python 更快吗?

那么线程呢?这会改善情况吗?我正在考虑一个生产者/消费者计划。一个线程用于处理 UDP 套接字,另一个用于处理传入的段。不过,我对此仍有一些疑问。例如,如果我使用互斥锁,这意味着生产者无法写入队列,而消费者从那里读取。这意味着生产者仍然会因消费者的操作而停滞不前。我错了吗?

【问题讨论】:

    标签: multithreading udp


    【解决方案1】:

    如果您使用线程,则需要一个队列来放入消息。这绝对应该受到互斥锁的保护。但是消费者线程不需要在处理消息的整个过程中锁定队列,只是在从队列中删除消息时。但是,您应该小心检查队列是否变大,您可能需要多个消费者线程。

    【讨论】:

    • 我在回答中提到了您并详细说明了一点。我的主要观点是他应该弄清楚为什么它很慢,而不是复制你的部分:)
    【解决方案2】:

    正如@JoachimPileborg 所提到的,队列是要走的路。您可以让多个工作线程退出队列。此队列有多种可用选项:

    • 一个简单的队列,为读/写操作提供简单的互斥保护
    • 无锁队列,通常使用原子操作来保持一致性
    • 2 队列系统,其中一个队列用于写入,另一个用于读取。当读取队列为空时,切换队列。

    这些是标准的生产者/消费者解决方案。

    比这更重要的是确定为什么解决方案很慢。 Python 应该足够快,c++ 也是(我个人认为它可能会更快,但可以争论),不过我对 matlab 一无所知。

    你应该做的是使用一个好的分析器(python 和 c++ 都有很多选项)。这是一个相关的answer。重复那个答案:找到瓶颈并专注于那些。

    另外,有什么要求?请记住:“尽可能快”不是有效要求。如果您符合吞吐量要求,则可以接受一些丢包。我在一个电信系统上工作,我们通过提高吞吐量直到它开始丢弃数据包来测试吞吐量要求,并测量我们的位置。关键是,如果您在限制范围内,可以放弃:)

    【讨论】:

      【解决方案3】:

      如果您只是将 UDP 数据包转储到网络上,那么绝大多数都会被丢弃,因为您将它们推入套接字的速度比网络发送它们的速度要快。

      请记住,UDP 没有任何流量控制或错误恢复功能。您的应用程序必须确定合适的传输速率,根据需要调整该速率,检测丢失的数据报,安排重新发送丢失的数据报,并将所有接收到的数据报组合成一个一致的文件。

      这并不容易: See this answer to a similar question.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多