前提・実現したいこと
サーバーから提供されているwebAPIを叩いてデータを定期的に取得するソフトを作っております。
なるべく相手のサーバーへ負荷をかけないように、問い合わせ毎の通信量を測定して取得時間の間隔を調整したく思っております。
データ取得にはurllib.requestのurlopenを使用しております。
response = urlopen(url)
pythonにて通信量(送受信量)を測定する場合はどういった方法を取ればよいでしょうか?
測定に便利なmoduleがある等、ご存知でしたらご教示いただけますでしょうか?
試したこと
reponseのパラメータを見たところ、response.lengthという値がありますが、
通信量が直接この値ではないような気がしています。(httpヘッダの知識があまりないです)
pythonでの通信量測定方法がわからなかったので、
とりあえずwiresharkを用いてパケットキャプチャを試みました。
差し当たり、対象サーバーへの1問い合わせ時の通信量は分かりましたが、
なんだかpythonでもっとスマートにできそうな気がしており、詳しい方にお聞きしたく思います。
補足情報(言語/FW/ツール等のバージョンなど)
Python3
pyCharm
(追記)手法調査中
- requestsに何か良い感じの値がないか
-- 無かった。でも応答時間はあったので、他の用途で使えることがあるかも。 - pysnmpを利用する
- scapyを利用する
- WireSharkの結果を元にContents-lengthから逆算して泥臭く計算する
-- 正確な仕様ではないし、誤差が大きそうです。Not Pythonicです・・・。
#サーバーからの受信量を、contents-lengthから逆算する
url = "http://XXXXX.com/api/?out=json"
response = urlopen(url)
data_len = response.length
#WireSharkでキャプチャした値を参考に逆算して通信量(受信量)を組み立てる
ip_tr_size = (66+60+60) + 60 # SYN ACK,ACK,FIN ACK / + 追加でACKがあることがある
data_segments = math.ceil(data_len / 1414) # segment分割数 / MRUのサイズで分割する / 1414
data_tr_overhead = (54 * data_segments) # segment分割分のoverhead
httpheader_size = 250 # tcp segment len - response.lengs / マージン+20byte程度 / 正確な算出方法分からない
total_comm_size = data_len + ip_tr_size + data_segments + data_tr_overhead + httpheader_size
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
質問者さんが調査した結果と一部かぶりますが、いくつか挙げます。
たとえばサーバの使用するインターネット回線の料金体系に従量部分があるのなら、通信量が多いことは経済的な「負荷」になります。通信量を正確に知ることで、このような意味での負荷を抑えられるかもしれません。
- SNMPエージェント (Net-SNMPのsnmpdなど) を動かしておき、PySNMPでNIC毎のトラフィック積算値を取得する。パケットの種類などのフィルタリングはできません。
- pysharkでパケットをキャプチャしてフィルタし、集計する。pysharkはtshark (wiresharkのCLI版) のPythonラッパですから、wiresharkでとれるような情報 (パケットサイズ等) は何でもとれるでしょう。
- urllib.request等にトラフィック集計機能を追加する。通信を実行するメソッドを適当にオーバライドしてリクエストとレスポンスのデータ量を集計できるようにします。これなら純粋にPythonアプリによるトラフィックだけを集計できます。
この中では、最後のものが一番「Pythonic」ということになるのでしょうかね。urllib.requestはなんだかごちゃごちゃしている感じがするのでRequestsのほうがやりやすいかも (個人の感想です)。
しかし実は、通信量が増えればサーバの負荷も同様に増えるとは限りません。サーバの負荷が増える直接の原因は、外部との通信の量にあるのではなく、サーバ自身のリソースが占有利用される量にあるからです (例えばクライアントの同時接続数、CPU時間の長い処理、大量のデータ保存・読み出しなど)。
このような負荷の影響は、負荷試験を実施してみないとわかりません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.96%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/11/23 00:02
正確な通信量を図りたい場合はpysharkを選択するのが良さそうですね。ありがとうございます。
そしてご指摘通り、当初は一番最後の例が簡単に行えるmoduleがあれば!と思っていました。