V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
gamexg
V2EX  ›  Python

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

  •  
  •   gamexg · 2015-08-11 15:46:04 +08:00 · 3014 次点击
    这是一个创建于 3396 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近都在说网络不好,就是用 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

    3 条回复    2015-08-13 13:25:37 +08:00
    invite
        1
    invite  
       2015-08-12 12:54:57 +08:00   ❤️ 1
    1、打不开链接。

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

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

    1、CPU限制的结论是怎么得出来的?UDP只管发送数据,对方收不收,跟你发包速度没关系。随便造一个不存在的地址发也一样。
    2、一下子发那么多小包,还是累计一小段时间发一个大包好。你后续TCP不可能每次只发几个字节吧?而且,这些小包,UDP包头的开销都你数据要大很多了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:36 · PVG 18:36 · LAX 02:36 · JFK 05:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.