ネットワークインターフェースヘルス は何をしますか?
ネットワーク症状が物理リンク、スイッチポート、ケーブル、トランシーバー、デュプレックス設定、または輻輳したインターフェースに起因する可能性がある場合にこのスキルを使用します。
使用するタイミング
- ホストまたはVLANでパケットロス、レイテンシスパイク、または断続的な到達不能が発生している。
- スイッチまたはルーターのインターフェースにCRC、ラント、ジャイアント、ドロップ、リセット、またはフラップが表示されている。
- ハードウェア交換前にリンクの両端を比較する必要がある。
- 変更ウィンドウでインターフェースカウンターの前後の証拠が必要である。
- 監視で
ifInErrors、ifOutErrors、またはifOutDiscardsの上昇が報告されている。
仕組み
インターフェースカウンターは証拠ですが、絶対値よりも傾向が重要です。ベースラインを取得し、測定間隔を待ち、再度取得してから増分を比較します。
show interfaces <interface>
show interfaces <interface> status
show logging | include <interface>|changed state|line protocol
Linuxホストの場合:
ip -s link show <interface>
ethtool <interface>
ethtool -S <interface>
カウンターリファレンス
| カウンター | 意味 | 一般的な原因 |
|---|---|---|
| CRC | 受信フレームのチェックサム失敗 | 不良ケーブル、汚れたファイバー、不良オプティック、デュプレックスミスマッチ |
| input errors | 受信側エラーの集計 | 結論を出す前にサブカウンターを確認 |
| runts | 最小イーサネットサイズ未満のフレーム | デュプレックスミスマッチ、コリジョンドメイン、障害NIC |
| giants | 想定MTUより大きいフレーム | MTUミスマッチまたはジャンボフレーム境界 |
| input drops | デバイスが着信パケットを受け入れられなかった | バースト、オーバーサブスクリプション、CPUパス、キュー圧力 |
| output drops | 出力キューがパケットを破棄した | 輻輳、QoSポリシー、小容量アップリンク |
| resets | インターフェースハードウェアリセット | フラッピング、キープアライブ、ドライバ、オプティック、電源 |
| collisions | イーサネットコリジョンカウンター | 半二重またはネゴシエーションミスマッチ |
診断フロー
CRCまたは入力エラー
- カウンターが増加していることを確認(単なる履歴ではない)。
- リンクの両端を確認。受信側のエラーは通常、エラーを報告しているポートではなく、その側に到着する信号の問題を示す。
- パッチケーブルを交換するか、ファイバーとオプティックを清掃/交換する。
- 両側の速度/デュプレックス設定が一致していることを確認。
- 同じタイムスタンプ周辺のフラップイベントについてログを確認。
ドロップ
- 入力ドロップと出力ドロップを区別する。
- インターフェースレートを容量と比較する。
- QoSポリシー、キューカウンター、およびリンクが過剰サブスクライブされたアップリンクかどうかを確認。
- キューチューニングは二次的なものとして扱う。まずリンクが輻輳しているかどうかを証明する。
デュプレックスと速度
両側がサポートする場合は、最新のイーサネットリンクではオートネゴシエーションを推奨します。一方の側を固定する必要がある場合は、両側を明示的に設定し、理由を文書化します。一方の側で固定速度/デュプレックスと他方でオートを混在させないでください。
show interfaces <interface> | include duplex|speed
安全なパーサー例
各インターフェースブロックを1つのヘッダーから次のヘッダーまでスライスします。任意の文字ウィンドウを使用しないでください。大きなインターフェースブロックでは、カウンターが見逃されたり、間違ったポートに割り当てられたりする可能性があります。
import re
from typing import Any
HEADER_RE = re.compile(
r"^(?P<name>\S+) is (?P<status>(?:administratively )?down|up), "
r"line protocol is (?P<protocol>up|down)",
re.I | re.M,
)
ERROR_RE = re.compile(r"(?P<input>\d+) input errors, (?P<crc>\d+) CRC", re.I)
DROP_RE = re.compile(r"(?P<output>\d+) output errors", re.I)
DUPLEX_RE = re.compile(r"(?P<duplex>Full|Half|Auto)-duplex,\s+(?P<speed>[^,]+)", re.I)
def parse_show_interfaces(raw: str) -> list[dict[str, Any]]:
headers = list(HEADER_RE.finditer(raw))
interfaces = []
for index, header in enumerate(headers):
end = headers[index + 1].start() if index + 1 < len(headers) else len(raw)
block = raw[header.start():end]
errors = ERROR_RE.search(block)
drops = DROP_RE.search(block)
duplex = DUPLEX_RE.search(block)
interfaces.append({
"name": header.group("name"),
"status": header.group("status"),
"protocol": header.group("protocol"),
"duplex": duplex.group("duplex") if duplex else "unknown",
"speed": duplex.group("speed").strip() if duplex else "unknown",
"input_errors": int(errors.group("input")) if errors else 0,
"crc_errors": int(errors.group("crc")) if errors else 0,
"output_errors": int(drops.group("output")) if drops else 0,
})
return interfaces
例
1つのスイッチポートでのCRC
- ローカルポートのカウンターを取得。
- 接続されたリモートポートのカウンターを取得。
- ルーティングやファイアウォールルールを変更する前にケーブルまたはオプティックを交換。
- ベースラインを記録した後にのみカウンターをクリア。
- 一定間隔後に再確認。
インターネットが遅いがLANは正常
- WANインターフェースのドロップ/エラーを確認。
- LANアップリンクの使用率と出力ドロップを確認。
- WANリンクがクリーンでもスループットが低い場合はゲートウェイCPUを確認。
- 上流のサービスを非難する前に、有線と無線のテスト結果を比較。
アンチパターン
- ベースラインを保存する前にカウンターをクリアする。
- リンクの片側だけを見る。
- 時間枠なしで、すべての履歴CRCがアクティブな問題であると想定する。
- 一方の側でオートネゴシエーション、他方で固定速度/デュプレックスを混在させる。
- 出力ドロップを輻輳チェック前にケーブル問題として扱う。
関連情報
- エージェント:
network-troubleshooter - スキル:
network-config-validation - スキル:
homelab-network-setup