python - 在Python中检查互联网是否真的很慢的低影响方法是什么?

标签 python performance internet-connection speed-test

我有一个 python 脚本,每 10 分钟在我的 mac 上作为后台进程运行一次。基本上,它从服务器下载最新的图像,并根据我的互联网速度,下载高分辨率(5Mb/s 连接上 20mb 或更好)或低分辨率(5 到 1 Mb/s 连接上 6mb)版本图片。

因此,在脚本的开头,我使用 python 包 speedtest-cli 来测试我的互联网速度。然而,任何速度测试都固有地会使用我的一些带宽。

如果可能的话,我想在速度测试之前做一些简单且非常低的带宽测试,只是为了在进行速度测试之前查看我的互联网连接是否处于某个基线水平。该基线水平可以通过下载速度、ping 时间或任何可以告诉我连接基本质量的有用指标来衡量。因此,如果我的互联网太慢,我会在速度测试用完任何有限带宽之前退出。

准确性在这里并不那么重要。我不关心慢速和真正慢速互联网之间的区别。运行速度测试后,如果下载速度不低于 1 Mb/s,则退出。因此,此基线测试可以是任何简单的测试,其中基线下载速度低于 1 Mb/s。

使用 ping 可能是一个合理的解决方案。另question提供了此 gist 中提供的 ping 解决方案。但这相当复杂,并且需要 root 才能运行,如果可能的话我宁愿避免这样做。

下面是我正在使用的脚本的简单版本:

import requests
import sys
import os
import logging
import socket
import json

# python himawari.py
# stolen from https://gist.github.com/celoyd/39c53f824daef7d363db
# requires speedtest-cli ('pip install speedtest-cli')

# check if we have internet
def internet(host="8.8.8.8", port=53, timeout=3):
    try:
        socket.setdefaulttimeout(timeout)
        socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
        return True
    except Exception as ex:
        return False

print("Checking internet speed:")

if internet():
    print "Internet connection exists..."
    os.system("rm -f /Users/scott/git-projects/live-earth-desktop/speedtest.json")
    os.system("speedtest-cli --json >> /Users/scott/git-projects/live-earth-desktop/speedtest.json")
else:
    print "No internet connection. Quitting..."
    os._exit(1)

with open('/Users/scott/git-projects/live-earth-desktop/speedtest.json') as data_file:    
    try:
        data = json.load(data_file)
    except ValueError:
        print("data was not valid JSON")
        os._exit(1)


speed = data["download"]

print_speed = str(round(speed//1000000))
print("Download speed: ~" + print_speed + " Mb/s")

if (speed > 5000000): # 5 Mb/s
    print("Internet speed is good. Downloading hi-res image.")
    # Download hi-res image here
elif (speed > 1000000): # 1 Mb/s
    print("Internet speed is ok. Downloading low-res image.")
    # Download low-res image here
else:
    print("Internet speed is poor. Quitting.")
    os._exit(1)

最佳答案

您提到的“低影响”测试并希望进行基线引起了我的注意。我通过 Firebind 了解到,TCP 带宽测试并不是测量线路质量的唯一方法,执行这些测试可能会导致误导性的结果。任何不受应用程序或网络速率限制的上传或下载操作将始终尝试“最大化”电路。选择较小的文件仍然可以使电路最大化,但只是时间较短。当然,由于担心使用太多带宽或使电路尖峰,导致尝试限制频率,这反过来又限制了您的可见性。

我的建议是您使用 iperf 并模拟我们所做的事情,例如 50 pps VoIP 调用,以便您可以测量数据包丢失。您可以使用我上面提到的输入(87 kbps,通过 UDP 的 218 字节有效负载。)这样您就可以确定线路质量的基线,但您可以以低影响的方式做到这一点,而不是必须在 TCP 带宽中“淹没线路”测试。而且由于带宽非常低,您可以按照自己的意愿频繁地进行操作。即使在 5/5 电路上,上述参数也将使用不到 1% 的容量。

例如,您可以每 2 分钟在每个方向运行 30 秒,与 TCP 方法相比,可以用更少的数据获得更多可见性。

在尝试评估线路质量时我肯定会远离 ping。下面链接中的图片显示了马萨诸塞州的 Comcast 家庭对 AWS 弗吉尼亚州(黄线)执行了 20 个 ICMP ping,以及我们模拟 ping 但使用 UDP 负载(蓝线)。时间都是这 20 个 ping 的平均值。在非拥塞的电路上,您通常会看到黄线非常平坦(容差为 1 毫秒),并且它的值会比蓝线低几毫秒。原因是我们在弗吉尼亚州的软件必须处理 UDP,而 ping 回复则没有这些额外的步骤。然而,这里平均 ping 在 28 毫秒到 55 毫秒之间波动,而 UDP 相对平坦,大部分在 26 毫秒到 30 毫秒之间。这是链路出现拥塞的迹象,如果您只有 ping 数据,您可能会认为情况比实际情况更糟糕,因为 ping 波动如此之大。确实存在拥塞,但 UDP(用户)流量仍然相对正常。

Average ping and UDP RTT from MA to VA

关于python - 在Python中检查互联网是否真的很慢的低影响方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130493/

相关文章:

python - 将 Minibatch 标准偏差应用于 Keras GAN 层的正确方法

python - 使用 Dataflow + Beam + Python 从 Google Cloud Storage 读取 Shapefile

javascript - 我该如何处理这个 800kb 的 JavaScript 文件?

swift - 为什么 Swift 在 for-in 循环中使用下标语法比直接访问元素更快?

android - 检查 android 中的互联网连接(不是网络连接)

Python "NoneType is not callable"错误

python - 将 pandas 数据帧保存为 32 位 float

python - 如何避免循环指定 Pandas Dataframe 过滤的限制?

c - 笔记本电池状态?

visual-studio - Visual Studio 互联网连接失败