更新到原帖:一位同事指出我做错了什么。 我会在帖子的底部给出解释,因为它可能会有所帮助 对于其他人。
我试图对网络性能的限制有一个基本的了解 python程序并遇到了异常现象。代码片段
while 1:
sock.sendto("a",target)
将UDP数据包发送到目标计算机,速度与主机发送的速度一样快。 我测量的发送速率仅为每秒4000个数据包,或250 us 每包。这似乎很慢,即使是像python这样的解释语言 (该程序运行在2 GHz AMD opteron,Linux,python版本2.6.6)。 我在python for TCP中看到了更好的性能,所以我觉得这有点奇怪。
如果我在后台运行并运行top,我发现python正在使用 只有25%的cpu,这表明python可能会被人为拖延 UDP数据包的传输。
有没有其他人经历过类似的事情?有谁知道如果python 确实限制了数据包传输的速度,以及是否有办法转向 这个关闭?
BTW,类似的C ++程序每秒可以发送超过200,000个数据包, 所以它不是平台或操作系统的固有限制。所以,事实证明我犯了一个愚蠢的新手错误。我忽略了调用gethostbyname 明确。因此,包含sendto命令中的目标地址 一个象征性的名字。每次数据包都会触发名称解析 发送。解决此问题后,我测量的最大发送速率约为120,000 p / s。 好多了。
答案 0 :(得分:1)
您是否先尝试connect()
,然后使用send()
代替sendto()
? (UDP connect()
只是建立目标地址,它实际上并没有建立“连接”。)我对此很生疏,但我相信Python对地址参数的解释比C套接字更多,可能是增加开销。
答案 1 :(得分:0)
您可能希望发布更完整的代码示例,以便其他人可以重复您的基准测试。每循环迭代250μs 太慢。基于日常优化Python的经验,我认为Python的解释器开销在现代机器上远低于1μs。换句话说,如果C ++程序每秒发送200k数据包,我希望Python处于相同数量级的速度。
(鉴于上述情况,通常的优化建议,例如将sock.sendto的属性查找移出循环不适用于此处,因为缓慢来自其他来源。)
使用strace
检查Python实际执行的操作是一个很好的第一步。它是单线程程序还是多线程应用程序可能会浪费时间等待GIL? sock
是普通的Python套接字还是更复杂的API的一部分?当您直接在套接字os.write
上调用fileno
时会发生同样的情况吗?