在python中,什么是检查internet是否真的很慢的一种低影响的方法?

2024-05-29 06:52:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

Tags: importjsondatacliosresmbsocket
2条回答

我是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连接的严重上传丢失。)

Comcast, MA Upload Packet Loss

你提到的“低影响”测试和寻找一个基线是什么吸引了我的注意。我从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

相关问题 更多 >

    热门问题