網路介面健康檢查 是做什麼的?
當網路症狀可能由實體鏈路、交換機端口、線纜、光收發器、雙工設定或擁塞介面引起時,使用此技能。
使用時機
- 主機或 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 | 小於最小乙太網幀大小的幀 | 雙工不匹配、碰撞域、網卡故障 |
| 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
範例
一個交換機端口上的 CRC
- 捕獲本地端口的計數器。
- 捕獲連接的遠端端口的計數器。
- 在更改路由或防火牆規則前更換線纜或光學元件。
- 僅在記錄基準線後才清除計數器。
- 在固定間隔後重新檢查。
網際網路慢但區域網路正常
- 檢查 WAN 介面的丟棄/錯誤。
- 檢查 LAN 上行鏈路的利用率和輸出丟棄。
- 如果 WAN 鏈路乾淨但吞吐量仍然很低,檢查閘道 CPU。
- 在指責上游服務之前,比較有線和無線測試結果。
反模式
- 在保存基準線之前清除計數器。
- 只檢查鏈路的一端。
- 沒有時間窗口假設所有歷史 CRC 都是活躍問題。
- 在一端混用自動協商,另一端使用固定速度/雙工。
- 在檢查擁塞之前將輸出丟棄視為線纜問題。
相關內容
- 代理:
network-troubleshooter - 技能:
network-config-validation - 技能:
homelab-network-setup