我有一个python脚本,作为后台进程在mac上每10分钟运行一次。基本上,它从服务器上下载最新的图像,并根据我的网速,下载高分辨率(5Mb/s或更高)或低分辨率(6mb/s连接6mb)版本的图像。在
因此,在脚本的开头,我使用python包speedtest-cli
来测试我的网速。然而,在任何速度测试中,固有的是使用我的一些带宽。在
如果可能的话,我想在速度测试之前做一些简单的,非常低带宽的测试,在我做速度测试之前,看看我的互联网连接是否处于某个基线水平。这个基线水平可以用下载速度、ping时间或任何有用的指标来衡量,这些指标可以告诉我连接的基本质量。因此,如果我的网速太慢,我会在速度测试用完任何有限带宽之前退出。在
准确性在这里并不重要。我不关心网速慢和网速慢的区别。运行速度测试后,如果下载速度不至少为1 Mb/s,则会退出。因此,这个基线测试可以是任何一个基线低于1MB/s下载速度的简单测试。在
使用ping可能是一个合理的解决方案。另一个question提供了一个ping的解决方案,在这个gist中提供了,但是这相当复杂,并且需要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的联合创始人。在
Firebind存在的全部原因是要进行连续的、低影响的测试,这样你就可以为你的互联网质量建立基准。您可以在2到3分钟内配置和部署我们的代理之一。然后,代理每隔5分钟对我们的固定测试点的组合以及您配置的目标执行一系列11个测试,每天为您提供3168个测量值。在
当我们建立Firebind时,我们意识到带宽测试等高影响测试的破坏性太强,这导致我们开发了我们的旗舰模拟VoIP测试。每5分钟我们发送和接收25秒的模拟VoIP流量。该流量为50pps,87kbps,218字节的有效负载,每个方向每天产生360000个数据包。我们的可视性远优于ping,不仅因为我们每秒的数据包是ping的50倍,而且我们使用UDP就像真正的VoIP通话一样。如果平是放大镜,我们就是显微镜。其他测试包括UDP延迟、UDP抖动、ping响应时间、DNS响应时间和HTTP响应时间。在
您可以设置警报阈值,以便在数据包丢失超过1.5%或DNS查找时间超过50毫秒时发出电子邮件警报
这里的第一个价值是,通过建立连接的基线,您可以看到网络质量下降的时期,然后根据时间和严重程度,您可以更容易地隔离源(不幸的是,这通常是超额订阅的ISP连接)
Firebind有一个免费的2周试用期,如果你想看看。在
祝你一切顺利
戴夫
(下图是我们的数据包丢失图表,显示了马萨诸塞州Comcast连接的严重上传丢失。)
你提到的“低影响”测试和寻找一个基线是什么吸引了我的注意。我从Firebind中学到的是,TCP带宽测试并不是测量线路质量的唯一方法,执行这些测试可能会导致错误的结果。任何不受应用程序或网络速率限制的上传或下载操作都会试图“最大限度地”利用电路。选择一个较小的文件仍然可以最大限度地延长电路,但只需较短的时间。当然,害怕使用太多的带宽或电路尖峰是导致试图限制频率的原因,而这反过来又限制了你的可见性。在
我建议您使用iperf代替,并模拟一些类似我们所做的事情,比如50 pps的VoIP呼叫,这样您就可以测量数据包丢失。你可以使用我上面提到的输入(87kbps,UDP上218字节的有效负载),这样你可以基线化线路质量,但是你可以用一种低影响的方式来做,而不是在TCP带宽测试中“淹没线路”。而且因为带宽太低了,你可以随心所欲地经常这样做。即使是在5/5的电路中,上述参数也将使用小于1%的容量。在
例如,您可以每2分钟在每个方向上运行30秒,这样就可以使用比TCP方法更少的数据获得更多的可见性。在
我肯定会远离ping来评估线路质量。下面链接中的图片显示了马萨诸塞州的一家康卡斯特家庭同时对AWS Virginia进行了20次ICMP ping(黄线)以及美国模拟ping,但使用的是UDP负载(蓝线)。时间都是这20次ping的平均值。在非拥塞的电路中,您通常会看到黄线非常平坦(公差为1ms),它的值比蓝线低几毫秒。原因是我们在弗吉尼亚州的软件必须处理UDP,而ping回复没有这些额外的步骤。然而,这里的平均ping在28毫秒到55毫秒之间反弹,而UDP则相对平坦,大多在26毫秒到30毫秒之间。这是一个链路有一些拥塞的迹象,如果你只有ping数据,你可能会认为情况比实际情况更糟,因为ping的摆动太大了。确实存在拥塞,但UDP(用户)流量仍然相对正常。在
祝你好运!在
戴夫
Average ping and UDP RTT from MA to VA
相关问题 更多 >
编程相关推荐