gpt4 book ai didi

python - python中的udp速率限制?

转载 作者:太空狗 更新时间:2023-10-29 21:58:53 25 4
gpt4 key购买 nike

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


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

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

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

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

有没有人遇到过类似的事情?有谁知道python确实限制了包传输的速率,如果有办法转这个关闭?

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


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

最佳答案

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

(鉴于上述情况,通常的优化建议(例如将 sock.sendto 的属性查找移出循环)在这里不适用,因为缓慢来自另一个来源。)

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

关于python - python中的udp速率限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12252400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com