網路介面健康檢查 是做什麼的?
當網路症狀可能由實體鏈路、交換機連接埠、電纜、收發器、雙工設定或擁塞介面引起時,請使用此技能。
使用時機
- 主機或 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 或輸入錯誤
- 確認計數器正在遞增,而不僅僅是歷史數據。
- 檢查鏈路的兩端。接收端錯誤通常指向到達該端的信號,不一定是報告錯誤的連接埠。
- 更換跳線或清潔/更換光纖和光纖收發器。
- 確認兩端的 speed/duplex 設定一致。
- 檢查日誌中相同時間戳附近的抖動事件。
丟棄
- 區分輸入丟棄和輸出丟棄。
- 將介面速率與容量進行比較。
- 檢查 QoS 策略、佇列計數器以及鏈路是否為超額訂閱的上行鏈路。
- 將佇列調整視為次要任務。首先證明鏈路是否擁塞。
雙工和速度
在現代乙太網路鏈路中,當雙方都支援時,優先使用自動協商。如果必須固定一側,則應明確配置兩側並記錄原因。切勿在一側混合固定 speed/duplex 而在另一側使用自動協商。
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
範例
某交換機連接埠上的 CRC
- 捕獲本地連接埠的計數器。
- 捕獲對端遠端連接埠的計數器。
- 在更改路由或防火牆規則之前更換電纜或光纖收發器。
- 僅在記錄基線後才清除計數器。
- 在固定時間間隔後重新檢查。
網際網路慢但區域網路正常
- 檢查 WAN 介面的丟棄/錯誤。
- 檢查 LAN 上行鏈路的利用率和輸出丟棄。
- 如果 WAN 鏈路乾淨但吞吐量仍然低,檢查閘道 CPU。
- 在指責上游服務之前,比較有線和無線測試結果。
反模式
- 在保存基線之前清除計數器。
- 僅查看鏈路的一端。
- 在沒有時間窗口的情況下,假設所有歷史 CRC 都是活動問題。
- 在一側混合自動協商,在另一側混合固定 speed/duplex。
- 在檢查擁塞之前,將輸出丟棄視為電纜問題。
另請參閱
- 代理:
network-troubleshooter - 技能:
network-config-validation - 技能:
homelab-network-setup