質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

10750閲覧

Pythonで通信量を測定するにはどうすればいいでしょうか?

uni8inu

総合スコア127

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2016/11/19 11:54

編集2016/11/21 08:00

###前提・実現したいこと
サーバーから提供されているwebAPIを叩いてデータを定期的に取得するソフトを作っております。
なるべく相手のサーバーへ負荷をかけないように、問い合わせ毎の通信量を測定して取得時間の間隔を調整したく思っております。
データ取得にはurllib.requestのurlopenを使用しております。

Python

1response = urlopen(url)

pythonにて通信量(送受信量)を測定する場合はどういった方法を取ればよいでしょうか?
測定に便利なmoduleがある等、ご存知でしたらご教示いただけますでしょうか?

###試したこと
reponseのパラメータを見たところ、response.lengthという値がありますが、
通信量が直接この値ではないような気がしています。(httpヘッダの知識があまりないです)

pythonでの通信量測定方法がわからなかったので、
とりあえずwiresharkを用いてパケットキャプチャを試みました。
差し当たり、対象サーバーへの1問い合わせ時の通信量は分かりましたが、
なんだかpythonでもっとスマートにできそうな気がしており、詳しい方にお聞きしたく思います。

###補足情報(言語/FW/ツール等のバージョンなど)
Python3
pyCharm

###(追記)手法調査中

  • requestsに何か良い感じの値がないか

-- 無かった。でも応答時間はあったので、他の用途で使えることがあるかも。

  • pysnmpを利用する
  • scapyを利用する
  • WireSharkの結果を元にContents-lengthから逆算して泥臭く計算する

-- 正確な仕様ではないし、誤差が大きそうです。Not Pythonicです・・・。

python

1#サーバーからの受信量を、contents-lengthから逆算する 2url = "http://XXXXX.com/api/?out=json" 3response = urlopen(url) 4data_len = response.length 5 6#WireSharkでキャプチャした値を参考に逆算して通信量(受信量)を組み立てる 7ip_tr_size = (66+60+60) + 60 # SYN ACK,ACK,FIN ACK / + 追加でACKがあることがある 8data_segments = math.ceil(data_len / 1414) # segment分割数 / MRUのサイズで分割する / 1414 9data_tr_overhead = (54 * data_segments) # segment分割分のoverhead 10httpheader_size = 250 # tcp segment len - response.lengs / マージン+20byte程度 / 正確な算出方法分からない 11 12total_comm_size = data_len + ip_tr_size + data_segments + data_tr_overhead + httpheader_size

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問者さんが調査した結果と一部かぶりますが、いくつか挙げます。

たとえばサーバの使用するインターネット回線の料金体系に従量部分があるのなら、通信量が多いことは経済的な「負荷」になります。通信量を正確に知ることで、このような意味での負荷を抑えられるかもしれません。

  • SNMPエージェント (Net-SNMPのsnmpdなど) を動かしておき、PySNMPでNIC毎のトラフィック積算値を取得する。パケットの種類などのフィルタリングはできません。
  • pysharkでパケットをキャプチャしてフィルタし、集計する。pysharkはtshark (wiresharkのCLI版) のPythonラッパですから、wiresharkでとれるような情報 (パケットサイズ等) は何でもとれるでしょう。
  • urllib.request等にトラフィック集計機能を追加する。通信を実行するメソッドを適当にオーバライドしてリクエストとレスポンスのデータ量を集計できるようにします。これなら純粋にPythonアプリによるトラフィックだけを集計できます。

この中では、最後のものが一番「Pythonic」ということになるのでしょうかね。urllib.requestはなんだかごちゃごちゃしている感じがするのでRequestsのほうがやりやすいかも (個人の感想です)。


しかし実は、通信量が増えればサーバの負荷も同様に増えるとは限りません。サーバの負荷が増える直接の原因は、外部との通信の量にあるのではなく、サーバ自身のリソースが占有利用される量にあるからです (例えばクライアントの同時接続数、CPU時間の長い処理、大量のデータ保存・読み出しなど)。

このような負荷の影響は、負荷試験を実施してみないとわかりません。

投稿2016/11/22 12:01

ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uni8inu

2016/11/22 15:02

ご回答ありがとうございます。pysharkは存じませんでした。 正確な通信量を図りたい場合はpysharkを選択するのが良さそうですね。ありがとうございます。 そしてご指摘通り、当初は一番最後の例が簡単に行えるmoduleがあれば!と思っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問