ネットワークインターフェースヘルス は何をしますか?
このスキルは、ネットワークの症状が物理リンク、スイッチポート、ケーブル、トランシーバー、デュプレックス設定、または輻輳したインターフェースに起因する可能性がある場合に使用します。
使用するタイミング
- ホストまたは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
安全なパーサーの例
各インターフェースブロックを、あるヘッダーから次のヘッダーまでスライスします。任意の文字ウィンドウを使用しないでください。大きなインターフェースブロックは、カウンターが見逃されたり、間違ったポートに割り当てられたりする原因となる可能性があります。
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