【问题标题】:udp rate limits in python?python中的udp速率限制?
【发布时间】:2012-09-25 05:52:45
【问题描述】:

更新原始帖子:一位同事指出我做错了什么。 我将在帖子底部给出解释,因为它可能会有所帮助 为他人。


我正在尝试对网络性能的限制有一个基本的了解 python 程序并遇到异常。代码片段

while 1:
    sock.sendto("a",target)

将 UDP 数据包发送到目标机器,与主机发送的速度一样快。 我测量的发送速率为每秒超过 4000 个数据包,即 250 us 每个数据包。这似乎很慢,即使对于像 python 这样的解释语言也是如此 (该程序在 2 GHz AMD opteron、Linux、python 版本 2.6.6 上运行)。 我在 python 中看到了更好的 TCP 性能,所以我觉得这有点奇怪。

如果我在后台运行它并运行顶部,我发现 python 正在使用 只有25%的cpu,提示python可能是人为延迟 UDP数据包的传输。

有没有其他人经历过类似的事情?有谁知道python 确实限制了数据包传输的速率,如果有办法转 这个关了?

顺便说一句,类似的 C++ 程序每秒可以发送超过 200,000 个数据包, 所以这不是平台或操作系统的内在限制。


所以,事实证明我犯了一个愚蠢的新手错误。我忽略了调用 gethostbyname 明确地。因此,sendto 命令中的目标地址包含 一个象征性的名字。每次发送数据包时都会触发名称解析 发送。修复此问题后,我测量的最大发送速率约为 120,000 p/s。 好多了。

【问题讨论】:

  • 仍然令人惊讶,我原以为名称解析会被缓存。您应该继续提供您的解决方案作为答案。

标签: python udp


【解决方案1】:

您可能希望发布更完整的代码示例,以便其他人可以重复您的基准测试。每次循环迭代 250μs 太慢了。根据优化 Python 的日常经验,我预计 Python 的解释器开销在现代机器上远低于 1μs。换句话说,如果 C++ 程序每秒发送 200k 个数据包,我希望 Python 的速度也能达到相同的数量级。

(鉴于上述情况,通常的优化建议,例如将 sock.sendto 的属性查找移出循环,此处不适用,因为速度慢来自其他来源。)

使用strace 检查 Python 实际在做什么是一个很好的第一步。是单线程程序还是多线程应用程序可能会浪费时间等待 GIL? sock 是普通的 Python 套接字还是更复杂的 API 的一部分?直接在socket的fileno上调用os.write会不会出现同样的情况?

【讨论】:

    【解决方案2】:

    您是否尝试过先使用connect(),然后使用send() 而不是sendto()? (UDP connect() 只是建立目标地址,它实际上并没有建立“连接”。)我对此很生疏,但我相信 Python 对地址参数的解释比 C 套接字更多,这可能会增加开销.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多