网络接口健康¶
当网络症状可能由物理链路、交换机端口、线缆、收发器、双工设置或拥塞的接口引起时,使用此技能。
使用时机¶
- 主机或 VLAN 出现丢包、延迟尖峰或间歇性不可达。
- 交换机或路由器接口显示 CRC、短帧、巨帧、丢弃、重置或抖动。
- 在更换硬件之前需要比较链路两端。
- 在变更窗口中需要接口计数器前后的证据。
- 监控报告
ifInErrors、ifOutErrors或ifOutDiscards增加。
工作原理¶
接口计数器是证据,但趋势比绝对值更重要。先获取基线,等待一个测量间隔,再次获取后比较增量。
show interfaces <interface>
show interfaces <interface> status
show logging | include <interface>|changed state|line protocol
Linux 主机:
计数器参考¶
| 计数器 | 含义 | 常见原因 |
|---|---|---|
| CRC | 接收帧校验和失败 | 不良线缆、脏污光纤、不良光模块、双工不匹配 |
| input errors | 接收侧错误汇总 | 下结论前检查子计数器 |
| runts | 小于最小以太网大小的帧 | 双工不匹配、冲突域、不良 NIC |
| giants | 大于预期 MTU 的帧 | MTU 不匹配或巨型帧边界 |
| input drops | 设备无法接收入站数据包 | 突发流量、超订、CPU 路径、队列拥塞 |
| output drops | 发送队列丢弃了数据包 | 拥塞、QoS 策略、上行链路容量不足 |
| resets | 接口硬件重置 | 抖动、保活、驱动、光模块、电源 |
| collisions | 以太网冲突计数器 | 半双工或协商不匹配 |
诊断流程¶
CRC 或输入错误¶
- 确认计数器正在增加(不只是历史值)。
- 检查链路两端。接收侧错误通常指向到达该侧的信号,而不是报告错误的端口。
- 更换跳线,或清洁/更换光纤和光模块。
- 确认两侧的速度/双工设置一致。
- 检查相同时间戳前后的抖动事件日志。
丢弃¶
- 区分输入丢弃和输出丢弃。
- 将接口速率与容量进行比较。
- 检查 QoS 策略、队列计数器,以及链路是否为超订上行链路。
- 将队列调优作为次要措施。先证明链路是否拥塞。
双工与速度¶
如果两侧都支持,最新以太网链路应优先使用自动协商。如果必须固定一侧,请显式配置两侧并记录原因。绝对不要将一侧设置为 fixed speed/duplex,而将另一侧设置为 auto。
安全解析器示例¶
将每个接口块从一个标题切片到下一个标题。不要使用任意字符窗口。过大的接口块可能导致计数器缺失或被分配到错误端口。
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
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC