2017-02-09 6 views
1

私は私のMacで10分ごとにバックグラウンドプロセスとして実行するpythonスクリプトを持っています。基本的に、サーバから最新のイメージをダウンロードし、インターネット速度に応じて、高解像度(5Mb/s接続以上で20MB)または低解像度(5Mb/s接続で6MB)のバージョンをダウンロードします。画像。インターネットがPythonで本当に遅いかどうかをチェックするインパクトの低い方法は何ですか?

このように私のスクリプトの先頭に、私は私のインターネットの速度をテストするためのpythonパッケージspeedtest-cliを使用しています。しかし、スピードテストには、私の帯域幅の一部が使用されています。

可能であれば、私は速度テストの前にやりたいことは、私は私のスピードテストを行う前に、私のインターネット接続は、いくつかのベースラインレベルであれば、単に確認するためにいくつかの簡単な、非常に低い帯域幅のテストです。そのベースラインレベルは、ダウンロード速度、ping時間、または接続の基本的な品質を私に知らせる有用なメトリックで測定できます。したがって、私のインターネットが遅すぎると、スピードテストで制限された帯域幅を使い切る前に終了します。

精度はそれほど重要ではありません。私は遅いインターネットと本当に遅いインターネットとの違いには関心がありません。スピードテストが実行された後、ダウンロード速度が少なくとも1Mb/sでなければ終了します。したがって、このベースラインテストは、ベースラインが1Mb /秒のダウンロード速度以下のどこかの簡単なテストになります。

pingの使用は妥当な解決策になります。別のquestionは、gistで提供されているpingの解決方法を提供しますが、それはむしろ精巧であり、実行するにはルートを必要とします。

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は大きなファイルをダウンロードし、ダウンロード速度を測定します。インパクトを最小限に抑えたい場合は、ファイルのサイズを最小限に抑えてください。スピードテストオプションを使用しているか、最後の手段として使用している可能性があります。スクリプトで手動でダウンロードしてください。 –

+0

@EugeneLisitsky 'speedtest-cli'パッケージにはファイルサイズオプションがありません。あなたが助けてくれる別のパッケージに私を向けることができれば、それは確かに評価されるでしょう。 –

答えて

1

私はFirebindの共同創設者だ:

以下は、私が使用しているスクリプトの簡易版です。存在の

Firebindの全体の理由は、あなたがあなたのインターネットの品質のベースラインをすることができますので、連続、低衝撃試験を実行することです。エージェントの1人を2〜3分で構成し、展開することができます。エージェントは、5分ごとに一連の11回のテストを、固定テストポイントと構成した宛先の組み合わせに実行し、1日あたり3,168回の測定を行います。我々はFirebindを建てたとき

は、我々は我々の主力シミュレートされたVoIPテストを開発するために私たちを率いており、帯域幅テストのような高衝撃試験があまりにも破壊的だったことに気づきました。 5分ごとに、シミュレートされたVoIPトラフィックを25秒間送受信します。そのトラフィックは50 pps、218 Kバイトのペイロードで87 Kbpsとなり、各方向で360,000パケット/日となります。私たちの可視性は、1秒あたりのパケット数が50倍であるだけでなく、実際のVoIPコールのようにUDPを使用しているため、pingに比べると優れています。 pingが拡大鏡である場合、我々は顕微鏡です。その他のテストには、UDPレイテンシ、UDPジッタ、ping応答時間、DNS応答時間、およびHTTP応答時間が含まれます。

次の例のように、あなたのパケットロスが1.5%を超える、またはあなたのDNSルックアップは、50msのより長くかかる、場合電子メールアラートを送信しますアラームしきい値を設定することができます。

接続のベースライン化によって、ネットワーク品質の劣化の期間を確認し、そのタイミングと重大度に基づいてソースをより簡単に分離できます(残念なことに、頻繁にオーバーサブスクライブされるISP接続です)。あなたはそれをチェックアウトしたい場合)

Firebindは、無料の2週間の試験を持っています。

すべてのベスト、

デイブ

(以下PICはマサチューセッツ州のComcastの接続に厳しいアップロード損失を示す私たちのパケット損失チャートである。)

Comcast, MA Upload Packet Loss

+0

$ 60 /月の製品は、非常に粗いpythonインターネットテストの解決策を支払うのにかなり高額です。しかし、もっと重要なことに、とにかくPythonスクリプトの 'Firebind'テストの結果を使って、ダウンロードする画像を選択することができますか?そうでない場合、この答えは役に立たないだけでなく、スパムです。 –

1

あなたの言及」 「インパクトの低い」テストとベースラインを目指すことが私の注意を引いたものです。私がFirebindを通して学んだことは、TCP帯域幅テストだけでは回線品質を測定する唯一の方法ではなく、それらを実行すると誤った結果につながる可能性があるということです。何らかの形でアプリケーションやネットワークによってレート制限されていないアップロードやダウンロード操作は、常に回線を「最大限に」使用しようとします。より小さいファイルを選ぶことは、回路を最大限に引き出すことができますが、短期間だけです。もちろん、帯域幅を過度に使用したり、回路をスパイクする恐れがあるため、周波数を制限しようとすると、視界が制限されます。

代わりにiperfを使用し、50 pps VoIPコールなどのようにシミュレーションして、パケット損失を測定することをお勧めします。上記の入力(87 kbps、UDP上の218バイトのペイロード)を使用することができます。この方法で、回線品質をベースラインにすることはできますが、TCP帯域幅で回線を「フラッド」させる必要はありませんテスト。また、帯域幅が非常に小さいので、できるだけ頻繁に行う必要があります。 5/5回路でも、上記のパラメータは1%未満の容量を使用します。

たとえば、2分おきに各方向に30秒間実行すると、TCPアプローチよりもはるかに少ないデータでより多くの可視性が得られます。

私は間違いなく、回線の品質を評価しようとしてpingから離れています。下のリンクの画像は、マサチューセッツ州のComcastの家でAWS Virginia(黄色の線)に20回のICMP pingを行い、pingをシミュレートしていますが、UDPのペイロード(青い線)を使用しています。混雑していない回線では、黄色の回線が非常にフラット(1msの許容値)で、通常は青線より数ミリ秒低い値になります。その理由は、バージニア州のソフトウェアはUDPを処理しなければならず、ping応答には余分な手順がないからです。ここでは、平均pingは28msから55msの間にバウンスしていますが、UDPは比較的平坦で、ほとんど26msから30msです。これはいくつかの混雑とのリンクの兆候であり、pingデータだけがあった場合、pingが非常に乱暴に振れるため、それが悪いと思うかもしれません。本当に輻輳がありますが、UDP(ユーザー)のトラフィックはまだ比較的OKです。

最高の運勢!私はあなたの質問を理解していないと思い

デイブ

Average ping and UDP RTT from MA to VA

関連する問題