画面の向こう側の真実を暴け:Tsharkで紐解くパケットの「沈黙」
夜中の3時、アラートが鳴り響く。監視画面には「APIのレスポンスタイムが急上昇」の文字。負荷試験では完璧だったはずのAPIが、本番環境の荒波に揉まれて悲鳴を上げている。
多くのエンジニアはここでダッシュボードのグラフを眺め、頭を抱える。だが、現場を生き抜いてきた我々にとって、本当の答えはグラフの中にはない。答えは、NICを通り抜けていく「パケット」そのものにある。
GUIのWiresharkは便利だが、本番環境のサーバーにGUIを持ち込むのはナンセンスだ。そこで必要になるのが、CLIの魔術師 tshark である。今日は、教科書には載っていない、現場で「戦うための」Tshark活用術を伝授しよう。
—
1. なぜ「今」、Tsharkが必要なのか
Web APIが遅延する原因は多岐にわたる。DBのロックか、アプリケーションのGCか、あるいはネットワークの輻輳か。 ping や curl -v だけでは、パケットレベルの「微細な揺らぎ」は見抜けない。
tshark を使えば、カーネル空間から上がってくる生データを、統計学的に、そして時系列に沿って「可視化」できる。特に、本番環境での突発的な通信異常を切り分ける際、その真価は発揮される。
—
2. 現場で重宝する統計コマンド:-z オプションの極意
パケットをキャプチャしてファイルに保存し、後からGUIで開く……そんな悠長なことをしている時間はない。リアルタイムで「今、何が起きているか」を把握するためのコマンドがこれだ。
通信の偏りを一瞬で見抜く io,phs
どのプロトコルが帯域を食いつぶしているか、あるいは予期せぬ通信が発生していないか。これを特定するのが io,phs(Protocol Hierarchy Statistics)だ。
# インターフェース eth0 を監視し、5秒ごとにプロトコル統計を表示
tshark -i eth0 -q -z io,phs
このコマンドを打った瞬間、パケットの階層構造が画面に流れる。もし HTTP や TCP が異常な割合を占めていれば、その瞬間にボトルネックの正体が見えてくる。
特定のHTTPメソッドを追跡する
APIサーバーなら、どのメソッドが叩かれているかを定量化したい。そんな時は http,tree を使う。
# GETリクエストの分布をリアルタイム集計
tshark -i eth0 -q -z http,tree,method
—
3. 自動化スクリプトへの組み込み:泥臭い監視の自動化
単発の調査で終わらせてはいけない。障害は繰り返し訪れる。私はいつも、怪しいサーバーに以下のPythonスクリプトを仕込んでおき、異常時に自動でパケット統計をログへ吐き出させるようにしている。
import subprocess
import time
# 監視するインターフェース
interface = "eth0"
# 10秒間キャプチャして統計を取る
cmd = f"tshark -i {interface} -a duration:10 -q -z io,phs"
def run_diagnostic():
try:
# パケット統計を実行し、標準出力を取得
result = subprocess.check_output(cmd, shell=True)
with open("network_diag.log", "a") as f:
f.write(f"\n--- {time.ctime()} ---\n")
f.write(result.decode('utf-8'))
except Exception as e:
print(f"診断中にエラーが発生: {e}")
if __name__ == "__main__":
run_diagnostic()
このように、tshark の結果をログに溜めておけば、後から「あの時、何が起きていたか」をデータとして事後検証できる。これは、障害の再発防止における最強の武器となる。
—
4. プロのTips:現場で「差」が出る微調整
最後に、実務で絶対に覚えておくべきTipsを3つ共有する。
1. フィルターを徹底する(BPFの活用):
すべてをキャプチャしてはCPUが死ぬ。必ず host 192.168.1.10 や port 443 といったフィルターをコマンドの末尾に付け、必要なパケットだけを抽出すること。
2. 出力形式をCSVにする:
tshark -T fields -e frame.time -e http.request.uri ... とすれば、CSV出力が可能だ。これをExcelやGoogle Sheetsに放り込めば、上司やクライアントへの報告資料が一瞬で出来上がる。
3. スナップショット長を絞る:
tshark -s 64 とすれば、パケットのヘッダー情報(TCP/IPヘッダー)だけを取得できる。ペイロードまで全部拾う必要がないケースでは、これでパフォーマンス負荷を劇的に下げられる。
—
最後に:ネットワークを「視る」力を養え
ネットワークエンジニアの仕事は、見えないものを「見ること」から始まる。tshark は単なるコマンドではない。ネットワークという巨大な迷宮の中を歩くための、信頼できる「松明」だ。
マニュアルを暗記するよりも、まずは自分のサーバーで tshark を叩いてみてほしい。最初は意味不明な数列の羅列に見えるかもしれない。だが、ある日突然、その数列が「通信の息遣い」として聞こえるようになる。その時こそ、君が真のエンジニアとして覚醒した瞬間だ。
さあ、コマンドラインを開こう。画面の向こう側の真実が、君を待っている。
コメント