【実務・中級編】 vnStatによる長期的なネットワークトラフィック統計の収集 – トラブルシューティング&ネットワーク運用監視実践ガイド

ネットワークの「健康診断」を自動化せよ:vnStatによる長期トラフィック可視化のすゝめ

大規模データセンターで深夜の緊急呼び出しに怯える日々を過ごしていると、嫌でも「可視化」の重要性に気づかされます。ネットワークが遅い、断続的に切れる……そんな時に「いつから?」「どれくらいのトラフィックが?」という正確な定量的データがないままパケットキャプチャに飛び込むのは、夜の森をヘッドライトなしで走るようなものです。

今回紹介する vnStat は、多くの現場で愛用されている、極めて軽量かつ堅牢なトラフィック統計ツールです。派手なダッシュボードを売りにしたツールも多いですが、サーバーの貴重なリソースを食いつぶさず、カーネルレベルで淡々と統計を積み上げてくれる vnStat こそが、運用の現場で生き残る真の相棒です。

なぜ vnStat なのか?

vnStat の最大の強みは、「デーモンとしてカーネルの統計を直接吸い上げている」という点にあります。libpcap を使ってパケットをスニッフィングするタイプとは異なり、CPU負荷が極めて低いため、監視対象のサーバーに同居させてもパフォーマンスへの影響がほぼ無視できるレベルです。

また、再起動してもデータが消えない「永続性」も魅力です。運用現場では、監視サーバーが落ちていた間のデータが欠落するのは致命的ですが、vnStat はデータベースファイルをローカルに保持するため、長期的な傾向分析において非常に信頼性が高いのです。

基本的なセットアップと確認コマンド

まずはインストール後の確認から入りましょう。vnstat コマンドを叩くと、現在のインターフェースごとの統計が見えます。

# 現在のトラフィック状況をサクッと確認
# -l はライブモード。リアルタイムの転送量が見える
vnstat -l -i eth0

# 日別の統計を表示。障害の予兆検知にはここを見るのが鉄則
vnstat -d

この出力が教科書的でないのは、そこに「運用者の意図」が隠されているからです。例えば、rx(受信)と tx(送信)のバランスが急激に崩れた日がないか。深夜帯のバックアップ処理が帯域を圧迫していないか。これらを vnstat -d で確認するだけで、多くのトラブルは未然に防げます。

運用で使える設定ファイルTips

/etc/vnstat.conf を編集する際、以下の設定だけは意識しておくと良いでしょう。

# /etc/vnstat.conf の主要設定例

# 統計を保存するインターフェースを明示的に指定
Interface "eth0"

# データベースの更新間隔(秒)。デフォルトでOKだが、高負荷時は調整
UpdateInterval 30

# 帯域幅の制限設定。これが正確だと、出力時に「使用率(%)」を表示してくれる
# これを埋めておくと、あとで「帯域の何%を使っているか」が一目でわかる
MaxBandwidth 1000

MaxBandwidth を設定しておくことは、実は非常に重要です。単に「何GB流れたか」だけでは、それが回線の限界に近いのか、余裕があるのか判断できません。運用者としては、常に「余力」を意識する癖をつけるべきです。

API的なアプローチ:データを外部へ引き出す

最近のインフラ運用では、vnStat のデータをそのまま見るのではなく、API経由で取得して、自作の監視システムやGrafanaに流し込むことも多いでしょう。vnStat には --json オプションが用意されており、これが非常に優秀です。

以下は、Pythonでデータを取得し、構造化して扱うサンプルです。

import subprocess
import json

def get_traffic_data(interface="eth0"):
    # vnstatコマンドをJSONモードで実行
    cmd = ["vnstat", "-i", interface, "--json"]
    result = subprocess.run(cmd, capture_output=True, text=True)
    
    if result.returncode != 0:
        return None
    
    # JSONをパースして統計データを取り出す
    data = json.loads(result.stdout)
    return data

# 実行例
stats = get_traffic_data("eth0")
if stats:
    # 直近の月間統計などを出力してログに送る等
    print(f"受信合計: {stats['interfaces'][0]['traffic']['month'][0]['rx']} KiB")

このように、CLIツールをプログラムから叩けるようにしておくことで、特定の閾値を超えたらSlackに通知を飛ばすといった「泥臭いけれど確実な監視」が自動化できます。

シニアエンジニアからの教訓

最後に、長年この世界で食ってきた経験から一つだけアドバイスさせてください。

「監視ツールは、壊れた時にこそ真価を発揮する」

ネットワークが完全に遮断された時、あるいはサーバーが高負荷で応答しない時、高度なモニタリングシステムは往々にして沈黙します。しかし、vnStat のようなローカルで完結するツールが記録したログは、復旧後の「死因究明(Post-Mortem)」において、圧倒的な説得力を持つ証拠となります。

まずは今日、皆さんのサーバーで vnstat を動かしてみてください。ネットワークの呼吸を感じることで、障害に対する恐怖心は少しずつ「コントロール可能な対象」へと変わっていくはずです。何かあれば、またいつでも聞いてください。現場からは以上です。

コメント

タイトルとURLをコピーしました