跳转至

网络接口健康

当网络症状可能由物理链路、交换机端口、线缆、收发器、双工设置或拥塞的接口引起时,使用此技能。

使用时机

  • 主机或 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 或输入错误

  1. 确认计数器正在增加(不只是历史值)。
  2. 检查链路两端。接收侧错误通常指向到达该侧的信号,而不是报告错误的端口。
  3. 更换跳线,或清洁/更换光纤和光模块。
  4. 确认两侧的速度/双工设置一致。
  5. 检查相同时间戳前后的抖动事件日志。

丢弃

  1. 区分输入丢弃和输出丢弃。
  2. 将接口速率与容量进行比较。
  3. 检查 QoS 策略、队列计数器,以及链路是否为超订上行链路。
  4. 将队列调优作为次要措施。先证明链路是否拥塞。

双工与速度

如果两侧都支持,最新以太网链路应优先使用自动协商。如果必须固定一侧,请显式配置两侧并记录原因。绝对不要将一侧设置为 fixed speed/duplex,而将另一侧设置为 auto。

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

  1. 获取本地端口计数器。
  2. 获取所连接远程端口的计数器。
  3. 在更改路由或防火墙规则之前,更换线缆或光模块。
  4. 仅在记录基线后清除计数器。
  5. 经过一定间隔后再次确认。

互联网慢但局域网正常

  1. 检查 WAN 接口的丢弃/错误。
  2. 检查 LAN 上行链路的利用率和输出丢弃。
  3. 即使 WAN 链路干净,如果吞吐量低,也检查网关 CPU。
  4. 在归咎于上游服务之前,比较有线和无线测试。

反模式

  • 在保存基线之前清除计数器。
  • 只检查链路的一侧。
  • 在没有时间窗口的情况下,假设所有历史 CRC 都是当前问题。
  • 一侧使用自动协商,另一侧使用固定速度/双工。
  • 在确认拥塞之前,将输出丢弃当作线缆问题。
  • 代理: network-troubleshooter
  • 技能: network-config-validation
  • 技能: homelab-network-setup

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC