用python检查互联网是否真的很慢的一种低影响方法是什么?

用python检查互联网是否真的很慢的一种低影响方法是什么?,python,performance,internet-connection,speed-test,Python,Performance,Internet Connection,Speed Test,我有一个python脚本,每10分钟在mac上作为后台进程运行一次。基本上,它从服务器下载最新的映像,并根据我的互联网速度,下载高分辨率(5Mb/s连接上为20mb或更高)或低分辨率(5到1Mb/s连接上为6mb)版本的映像 因此,在我的脚本开始时,我使用python包speedtest cli来测试我的互联网速度。然而,在任何速度测试中固有的是使用我的一些带宽 如果可能的话,我想在速度测试之前做一些简单且非常低带宽的测试,看看我的互联网连接是否处于某个基线水平,然后再进行速度测试。基线水平可以

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

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

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

准确在这里并不重要。我不关心网速慢和网速慢之间的区别。运行速度测试后,如果下载速度不超过1 Mb/s,则退出。因此,这个基线测试可以是任何简单的测试,其中基线的下载速度低于1MB/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)
我是公司的联合创始人

Firebind存在的全部原因是执行连续的、低影响的测试,这样您就可以基线检查您的互联网质量。您可以在2到3分钟内配置和部署我们的一个代理。然后,代理每5分钟对我们的固定测试点组合以及您配置的目的地执行一系列11次测试,每天为您提供3168次测量

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

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

这里的首要价值是,通过基线化连接,您可以看到网络质量下降的周期,然后根据该时间和严重性,您可以更容易地隔离源(不幸的是,这通常是一个超额订阅的ISP连接)

如果您想查看Firebind,它将免费试用两周

祝你一切顺利

戴夫

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

你提到的“低影响”测试和寻找基线是引起我注意的原因。我通过Firebind了解到,TCP带宽测试不是衡量线路质量的唯一方法,执行这些测试可能会导致误导性结果。任何不受应用程序或网络速率限制的上传或下载操作都会尝试“最大化”电路。选择一个较小的文件仍然可以使电路最大化,但时间更短。当然,害怕使用太多的带宽或电路尖峰是导致试图限制频率的原因,这反过来又限制了你的可视性

我的建议是,您可以使用iperf,并模拟我们所做的事情,例如50 pps的VoIP呼叫,以便您可以测量数据包丢失。您可以使用我上面提到的输入(87 kbps,通过UDP的218字节有效负载)。通过这种方式,您可以基线化线路质量,但您可以以低影响的方式来完成,而不必在TCP带宽测试中“淹没线路”。因为带宽很低,你可以随心所欲地频繁使用。即使在5/5电路上,上述参数使用的容量也不到1%

例如,您可以每2分钟在每个方向上运行30秒,与TCP方法相比,使用更少的数据提供了更高的可视性

我肯定会远离ping,尝试评估线路质量。下面链接中的图片显示了马萨诸塞州的Comcast home对AWS Virginia进行20次ICMP ping(黄线)以及美国模拟ping,但使用UDP有效负载(蓝线)。时间都是这20次ping的平均值。在非拥挤的电路上,您通常会看到黄线非常平坦(公差为1 ms),并且黄线的值比蓝线低几ms。原因是我们在弗吉尼亚的软件必须处理UDP,而ping回复没有这些额外的步骤。然而,这里的平均ping在28ms和55ms之间反弹,而UDP相对平坦,主要在26ms和30ms之间。这是一个带有一些拥塞的链接的迹象,如果你只有ping数据,你可能会认为它比现在更糟糕,因为ping摆动得太厉害了。确实存在拥塞,但UDP(用户)通信仍然相对正常

祝你好运

戴夫


@TessellingHeckler我想我不明白你的问题。我的网速慢有各种各样的原因。这是一台笔记本电脑,所以我可能下午在我祖母家连接了一个超慢速连接,或者我被拴在了o