2017-02-09 48 views
1

我有一個python腳本,我每10分鐘在我的mac上作爲後臺進程運行。基本上,它從服務器上下載最新的圖像,並根據我的網速,下載一個高分辨率(5Mb/s連接或更好的20MB)或低分辨率(6MB,5至1Mb/s連接)版本的圖片。什麼是低影響的方式來檢查互聯網是否真的很慢的蟒蛇?

因此,在我的腳本開始時,我使用python包speedtest-cli來測試我的網速。然而,在任何速度測試中固有的是使用我的一些帶寬。

如果可能的話,在進行速度測試之前,我想要做的是一些簡單而非常低的帶寬測試,以便在我進行速度測試之前查看我的網絡連接是否處於某個基準水平。該基線級別可以通過下載速度,ping時間或任何有用的指標來衡量,這些指標可以告知我連接的基本質量。因此,如果我的網絡速度太慢,我會在使用速度測試中的有限帶寬之前退出。

準確性在這裏並不重要。我並不關心慢速和真正慢的互聯網之間的差異。速度測試運行後,如果下載速度不是至少1 Mb/s,則會退出。因此,這個基線測試可以是任何簡單的測試,其中基線低於1 Mb/s的下載速度。

使用ping可能是一個合理的解決方案。另一個question提供了一個在這個gist中提供的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) 
+0

@TessellatingHeckler我想我不明白你的問題。有各種各樣的原因,我的互聯網可能會很慢。這是一臺筆記本電腦,所以也許我在上午下午與祖母的地方連接超級慢速連接,或者我正在關閉手機。問題是,如果我的網絡不好,我只想讓腳本在使用很多帶寬之前快速退出。 –

+0

Speedtest下載大文件,從而測量下載速度。如果你想盡量減少文件的大小,儘量減少文件大小。可能會使用speedtest選項,或作爲最後的手段 - 在腳本中手動下載。 –

+0

@EugeneLisitsky'speedtest-cli'軟件包沒有任何文件大小選項。如果你能指向另一個可以提供幫助的軟件包,那肯定會受到讚賞。 –

回答

1

我的Firebind創始人之一。

Firebind存在的全部原因是執行連續的低影響測試,因此您可以將您的Internet質量作爲基準。您可以在2到3分鐘內配置和部署我們的代理商之一。然後代理每5分鐘執行一系列11次測試,將其組合到我們的固定測試點以及您配置的目的地,爲您提供每天3,168次測量。

當我們構建Firebind時,我們意識到像帶寬測試這樣的高衝擊測試過於具有破壞性,這導致我們開發了我們的旗艦模擬VoIP測試。每5分鐘我們發送和接收25秒的模擬VoIP流量。該流量爲50 pps,87 Kbps,有效載荷爲218字節,每個方向產生360,000個數據包/天。我們的可見度遠遠優於ping,這不僅因爲我們是每秒50倍的數據包,而且我們正在使用UDP,就像真正的VoIP呼叫一樣。如果ping是放大鏡,我們就是顯微鏡。其他測試包括UDP延遲,UDP抖動,ping響應時間,DNS響應時間和HTTP響應時間。

例如,如果數據包丟失超過1.5%,或者您的DNS查找時間超過50毫秒,您可以設置發送電子郵件警報的警報閾值。

這裏的頭號值是通過對連接進行基準化,您可以看到網絡質量下降的時期,然後根據該時間和嚴重程度,您可以更容易地隔離源(不幸的是,這通常是超額訂購的ISP連接。 )

如果您想要查看,Firebind可免費試用2周。

一切順利,

戴夫

(以下PIC是我們展示在馬薩諸塞州的康卡斯特連接上嚴重的上傳損失丟包圖表)

Comcast, MA Upload Packet Loss

+0

一個60美元/月的產品是一個相當高的價格來支付一個非常粗糙的python互聯網測試的解決方案。但更重要的是,無論如何,我可以使用Python腳本中的「Firebind」測試的結果,以便我可以選擇要下載哪些圖像?如果不是,那麼這個答案就是垃圾郵件,而不僅僅是無益的。 –

1

你提到「低影響「的測試,並期待做一個基線是引起了我的注意。我通過Firebind瞭解到,TCP帶寬測試不是測量線路質量的唯一方法,而執行它們會導致誤導結果。任何不受應用程序或網絡速度限制的上載或下載操作都會嘗試「最大化」電路。選擇一個較小的文件仍然可以使電路最大化,但只需要較短的時間。當然,害怕使用過多的帶寬或刺激電路會導致嘗試限制頻率,從而限制了您的知名度。

我的建議是讓你使用iperf來代替,並模擬像我們這樣的事情,例如50pps的VoIP呼叫,這樣你就可以測量數據包丟失。您可以使用上面提到的輸入(87 kbps,通過UDP傳輸218字節的有效負載)。通過這種方式,您可以將線路質量作爲基準,但您可以以低影響的方式進行,而不必在TCP帶寬中「淹沒線路」測試。而且由於帶寬非常低,您可以隨時按照自己的喜好進行操作。即使在5/5電路上,上述參數的容量也不會超過1%。

例如,您可以每2分鐘向每個方向運行30秒,與TCP方法相比,您可以獲得更多的可見性,而且數據量少得多。

在嘗試評估線路質量時,我一定會遠離ping。以下鏈接中的圖片顯示了馬薩諸塞州的一家康卡斯特公司的家庭在向AWS Virginia(黃線)和我們模擬ping時使用20個ICMP ping,但使用UDP負載(藍線)。這些時間均爲20個ping的平均值。在非擁塞電路上,通常您會看到黃線非常平坦(容差爲1 ms),並且在藍線下方會有一個數值。原因是我們的弗吉尼亞州的軟件必須處理UDP,而ping應答沒有這些額外的步驟。然而,在這裏平均pings在28ms和55ms之間反彈,而UDP相對平坦,大多在26ms和30ms之間。這是一個堵塞的跡象,如果你只有ping數據,你可能認爲它比它更糟,因爲ping是如此瘋狂。確實存在擁塞,但UDP(用戶)流量仍然相對確定。

祝你好運!

戴夫

Average ping and UDP RTT from MA to VA

相關問題