2

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

因此,在我的脚本开始时,我使用 python 包speedtest-cli来测试我的网速。然而,任何速度测试的内在都是使用我的一些带宽。

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

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

使用 ping 可能是一个合理的解决方案。另一个问题提供了一个用于 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)
4

2 回答 2

1

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

我的建议是让您改用 iperf 并模拟我们所做的事情,例如 50 pps VoIP 呼叫,以便您可以测量数据包丢失。您可以使用我上面提到的输入(87 kbps,UDP 上的 218 字节有效负载。)这样您就可以对线路质量进行基准测试,但您可以以一种低影响的方式来实现这一点,而不必在 TCP 带宽中“淹没线路”测试。而且由于带宽如此之低,您可以根据需要随时进行操作。即使在 5/5 电路上,上述参数也将使用不到 1% 的容量。

例如,您可以每 2 分钟在每个方向上运行 30 秒,从而以比 TCP 方法少得多的数据提供更多的可见性。

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

从 MA 到 VA 的平均 ping 和 UDP RTT

于 2017-02-25T12:59:00.967 回答
0

我是Firebind的联合创始人。

Firebind 存在的全部原因是执行连续的、低影响的测试,以便您可以确定您的 Internet 质量。您可以在 2 到 3 分钟内配置和部署我们的代理之一。然后,代理每 5 分钟对我们的固定测试点以及您配置的目的地执行一系列 11 次测试,每天为您提供 3,168 次测量。

当我们构建 Firebind 时,我们意识到带宽测试等高影响力测试的破坏性太大,这促使我们开发了我们的旗舰模拟 VoIP 测试。我们每 5 分钟发送和接收模拟 VoIP 流量 25 秒。该流量为 50 pps、87 Kbps 和 218 字节有效负载,每个方向每天产生 360,000 个数据包。我们的可见性远优于 ping,不仅因为我们每秒的数据包数是 50 倍,而且我们使用 UDP 就像真正的 VoIP 呼叫一样。如果 ping 是放大镜,我们就是显微镜。其他测试包括 UDP 延迟、UDP 抖动、ping 响应时间、DNS 响应时间和 HTTP 响应时间。

您可以设置警报阈值,例如,如果您的丢包率超过 1.5%,或者您的 DNS 查找时间超过 50 毫秒,则会发送电子邮件警报。

这里的第一个价值是,通过建立连接基线,您可以看到网络质量下降的时期,然后根据该时间和严重程度,您可以更轻松地隔离源(不幸的是,这通常是超额订阅的 ISP 连接。)

如果您想查看 Firebind,可以免费试用 2 周。

(下图是我们的数据包丢失图表,显示了马萨诸塞州康卡斯特连接上的严重上传丢失。)

Comcast, MA 上传数据包丢失

于 2017-02-23T21:27:18.453 回答