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

时间:2017-02-09 07:19:01

标签: python performance internet-connection speed-test

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

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

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

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

使用ping可能是一个合理的解决方案。另一个question提供了ping gist中提供的解决方案,但这个解决方案相当精细,需要root才能运行,如果可能的话我宁愿避免使用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)

2 个答案:

答案 0 :(得分:1)

你的提及"影响不大"测试和寻找基线引起了我的注意。我通过Firebind学到的是TCP带宽测试不是测量线路质量的唯一方法,执行它们会导致误导结果。任何上传或下载操作都不会受到应用程序或网络的某种速率限制,总是会尝试最大限度地提高"电路。选择较小的文件仍然可以最大化电路,但只需更短的时间。当然,担心使用太多带宽或尖峰电路会导致试图限制频率,从而限制了你的可见度。

我的建议是让你使用iperf来模拟我们这样的事情,例如50 pps的VoIP呼叫,这样你就可以测量数据包丢失。您可以使用我上面提到的输入(87 kbps,UDP上的218字节有效负载。)这样您就可以确定线路质量,但是您可以以低影响的方式实现这一点,而不必使用#34;泛滥线路#34 ;在TCP带宽测试中。而且由于带宽太低,您可以像往常一样经常这样做。即使在5/5电路上,上述参数的使用容量也不到1%。

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

在尝试评估线路质量时,我肯定会远离ping。下面链接中的图片显示了位于马萨诸塞州的康卡斯特家庭向AWS Virginia(黄线)执行20次ICMP ping操作以及我们模拟ping但使用UDP有效负载(蓝线)。时间均为这20次ping的平均值。在非拥挤电路上,您通常会看到黄线非常平坦(公差为1 ms),并且它的值会比蓝线低几毫秒。原因是我们在弗吉尼亚州的软件必须处理UDP,而ping回复没有那些额外的步骤。然而,这里平均ping在28ms和55ms之间反弹,而UDP相对平坦,大多在26ms和30ms之间。这是一个带有一些拥塞的链接的标志,如果你只有ping数据,你可能会认为它比它更糟,因为ping是如此疯狂地摆动。确实存在拥塞,但UDP(用户)流量仍然相对较好。

祝你好运!

戴夫

Average ping and UDP RTT from MA to VA

答案 1 :(得分:0)

我是Firebind的联合创始人。

Firebind存在的全部原因是执行连续,低影响的测试,以便您可以确定互联网质量的基准。您可以在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连接的严重上传丢失。)

Comcast, MA Upload Packet Loss