python - python中的udp速率限制?

标签 python udp

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


我正在尝试对网络性能的限制有一个基本的了解 的 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/

相关文章:

php - 如何在 python 或 ruby​​ 中执行此操作(PHP)?

C - 为 UDP/多播套接字选择接口(interface)

java - 如何在UDP Java中检查客户端是否连接到服务器

c - 端口更改后 UDP 客户端服务器无法交换消息

python - BS4 : Getting text in tag

python - matplotlib 图 vs 子图 vs 轴?

python - 导入错误 : No module named gdal

sockets - 流读取阻止UDP GNAT

我可以从套接字中准确读取一个 UDP 数据包吗?

python - 二维列表转 csv - 按列