python udp 单 socket while True: sendto 跑到 30Mbps ,正常吗?

2015-08-11 15:46:04 +08:00
 gamexg

最近都在说网络不好,就是用 udp ping DO 的VPS 试试。昨天测试丢包还很少,今天测试出现了短暂的连续丢包。

但是单线程死循环发包到路由器查看速度只有 30Mbps/8 = 3.75MB/s 左右,高的时候35Mbps,低的时候25Mbps,python 线程单核近乎占满了,正常吗?

停掉了接收,完全只发送,速度能听达到50Mbps,看样瓶颈是cpu。

python 这个性能正常吗?

附:我这里是山东电信,单线程下载 DO ,刚开始速度100KB-200KB左右,有时能慢慢提升到2M。

def send_loop(sock,count):
    for i in range(count):
        try:
            t = int(time.time()*1000)
            data_t = struct.pack('!qq',t,i)
            data = data_t + '0'*(SIZE - len(data_t))
            s.sendto(data, address)
        except:
            logging.exception('send_loop')

udp ping 代码
https://gist.github.com/GameXG/77d9035c35b72856271c

暴力 ping 的结果
https://gist.github.com/GameXG/bcd419f4d4e9fb3fec6c

3024 次点击
所在节点    Python
3 条回复
invite
2015-08-12 12:54:57 +08:00
1、打不开链接。

2、 “停掉了接收,完全只发送,速度能听达到50Mbps,看样瓶颈是cpu。” 这句话很突兀,你自己发自己收?那关路由器什么事情?

3、压力测试,直接发送1G数据好了,代码逻辑那么复杂干嘛,必须得知道几点几分丢包么?没必要吧。只要看到数据丢了多少百分比就好了吧。
gamexg
2015-08-13 10:18:49 +08:00
@invite
1. 放在 github 了,可能需要翻墙。
2. 目标地址是境外的VPS,直接通过查本地路由器获得的流量数据。一发一收时路由器显示接收发送的数据都是30Mbps,本地cpu单核近乎跑满。当单发送时路由器流量显示50Mbps,同样cpu单核跑满。看情况是cpu性能限制了。
3.意图通过udp承载tcp来自己做一个激进拥塞策略,目的是尝试解决出国流量的不稳定问题。所以需要比较详细的丢包数据,看看策略怎么做比较合适。
invite
2015-08-13 13:25:36 +08:00
@gamexg

1、CPU限制的结论是怎么得出来的?UDP只管发送数据,对方收不收,跟你发包速度没关系。随便造一个不存在的地址发也一样。
2、一下子发那么多小包,还是累计一小段时间发一个大包好。你后续TCP不可能每次只发几个字节吧?而且,这些小包,UDP包头的开销都你数据要大很多了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/212408

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX