파이톤으로 와이파이의 속도를 측정하다

11918 단어 speedtestPython
이 글은 JSL(일본 시스템 기술 연구) Advent Calendar 2019 13일째 되는 글이다.
최근에는 사내 와이파이가 느려질 시기가 있다고 생각했는데, 그렇게 말하지만 얼마나 늦은지 정량적으로 알 수 없어 주기적으로 속도 테스트를 수행하는 스크립트를 썼다.

선결


  • Speedtest CLI - Internet connection measurement for developers 파이톤으로 사내 와이파이의 속도 측정 프로그램을 썼다
  • CUI에서 속도 테스트를 수행할 수 있는 경우 편리함
  • CUI를 통한 속도 테스트


    우선 크론 등에서 정기적으로 진행하고 싶어 CUI에서 속도 테스트를 고려
    내 인상에서 속도 테스트를 하면 다음과 같은 검색→실행...처럼 측정하는 것이다.

    리눅스에서 네트워크 회선 속도를 측정하는 수단을 정리했다.IO 기사 등을 보면서 조사한 곳speedtest.net은 CLI를 제공하는 것 같아요.
  • Speedtest CLI - Internet connection measurement for developers
  • 또한 Speedtest CLI는 Pythn package를 제공합니다.
  • pip install binary 사용 가능
  • brew 관리를 통과하지 않아도 가상 환경에서speedtest 명령을 사용할 수 있음
  • 파이톤에서 import
  • 도 가능
    알겠습니다.

    speedtest 실행 환경 구축


    pipenv를 사용하여 환경 구축
    $ mkdir wifi_speedtest
    $ cd $_  
    # pipenv 未インストールの場合
    # brew install pipenv
    
    # 仮想環境作成
    $ pipenv --python 3.7
    
    # パッケージのインストール
    $ pipenv install speedtest-cli
    
    # 仮想環境の有効化
    $ pipenv shell
    
    # speedtestコマンドのテスト
    (.venv) $ speedtest --version
    speedtest-cli 2.1.2
    Python 3.7.4 (default, Oct 12 2019, 18:55:28) [Clang 11.0.0 (clang-1100.0.33.8)]
    

    CUI에서 Speedtest 실행

    speedtest --list에서 지원자가 제공한 연결 서버 일람표를 얻을 수 있기 때문에 그 중 하나로 번호를 제어할 수 있다.
    (.venv) $ speedtest --list | grep Tokyo
    15047) OPEN Project (via 20G SINET) (Tokyo, Japan) [6.34 km]
    24333) Rakuten Mobile , Inc (Tokyo, Japan) [6.34 km]
    28910) fdcservers.net (Tokyo, Japan) [6.34 km]
    18516) GIAM PING VIETPN.COM (Tokyo, Japan) [6.34 km]
    22247) Tokyonet (Castro, Brazil) [18486.74 km]
    
    아래와 같이 항상 지정된 서버에서 속도 테스트를 합니다.예를 들어 Rakuten Mobile , Inc의 서버를 제공하면 번호는 24333입니다.
    # スピードテストを実行
    (.venv) $ speedtest --server 24333
    Retrieving speedtest.net configuration...
    Testing from XXX (xx.xx.xx.xx)...
    Retrieving speedtest.net server list...
    Retrieving information for the selected server...
    Hosted by Rakuten Mobile , Inc (Tokyo) [6.34 km]: 200.123 ms
    Testing download speed................................................................................
    Download: 16.08 Mbit/s
    Testing upload speed......................................................................................................
    Upload: 31.96 Mbit/s
    
    측정 성공(고객 정보 일부가 숨겨짐)
  • Download: 16.08 Mbit/s
  • Upload: 31.96 Mbit/s
  • 다만, 이렇게 되면 프로그램에서 처리하기 어려우니 json 형식으로 결과를 얻읍시다
    (.venv) $ speedtest --server 24333 --json
    
    결실
    {"download": 20208058.464686207, "upload": 54426180.687909536, "ping": 48.215, "server": {"url": "http://ookla.mbspeed.net:8080/speedtest/upload.php", "lat": "35.6833", "lon": "139.6833", "name": "Tokyo", "country": "Japan", "cc": "JP", "sponsor": "Rakuten Mobile , Inc", "id": "24333", "host": "ookla.mbspeed.net:8080", "d": 6.336536019993832, "latency": 48.215}, "timestamp": "2019-12-23T07:23:16.316637Z", "bytes_sent": 68534272, "bytes_received": 25353712, "share": null, "client": {"ip": "xx.xx.xx.xx", "lat": "xx.xxxx", "lon": "xxx.xxxx", "isp": "XXX", "isprating": "3.7", "rating": "0", "ispdlavg": "0", "ispulavg": "0", "loggedin": "0", "country": "JP"}}
    
    파이톤에서 이거 처리하고 싶어요.

    Python으로 Speedtest 실행


    Python Package를 어렵게 제공했고 Python에서 빠른 테스트를 진행하는 것도 고려했지만 이번에는 CUI의 실행 결과--json를 직접 처리하는 것을 고려해서speedtest 명령을 실행하기로 결정했습니다.
    subprocess--- 하위 프로세스 관리 - Python 3.8.1 문서
    wifi_speedtest.py
    def get_speedtest_result():
        process = subprocess.run(['speedtest', '--server', '24333', '--json'], capture_output=True)
        return json.loads(process.stdout)
    
    
    def bit_to_mbit(bit):
        """
        誤差とかは気にしない感じの作り
        """
        return bit / 1024 / 1024
    
    
    result = get_speedtest_result()
    print(bit_to_mbit(result["download"]), bit_to_mbit(result["upload"]))
    
    결실
    13.46394215 50.48002296
    
    subprocessモジュール에서 명령을 집행하는 방법이 많은데 이번에 공식 사용례에 기재된 subprocess+run()에서 표준 출력을 얻었다.
    이번에 우리는 SpreadSheet의 API를 찍어서 기록하였다.
  • Python으로 Google 스프레드시트 편집 - Qita
  • 나는 공을 슬랙에 치거나 좋아하는 방법으로 기록하면 된다고 생각한다.
    이외의 말로는 Pipenv의scripts를 활용하면cron에서부터 실행되는 가상 환경의 유효성 등이 필요하지 않아 편리하다(pipenvrun을 통해 실행되는 과정과 가상 환경화의 실행은 같은 처리이다)
    Pipfile
    [scripts]
    dev = 'python wifi_speedtest.py'
    

    좋은 웹페이지 즐겨찾기