Linux 网络接口管理与优化方案

3次阅读

应使用 ip 命令替代 ifconfig 管理网卡:ip link show 可显示 lower/link 标志及绑定状态,ip link set 同步触发 udev 和 netlink 事件,ip -d link show 支持完整 bond/team 详情。

Linux 网络接口管理与优化方案

怎么用 ip 替代老旧的 ifconfig 管理网卡

现在几乎所有主流发行版默认不装 net-toolsifconfig 早就不是“默认可用”了。它不显示真实队列长度、不支持多播组管理、解析不出 xdptc 相关状态——这些在排障时会直接卡住。

  • ip link show接口状态,比 ifconfig 多显示 LOWER_*LINK_* 标志,能一眼看出是否被 systemd-networkdNetworkManager 锁定
  • 启停接口别写 ifconfig eth0 up,改用 ip link set eth0 up;后者会同步触发 udev 规则和 netlink 事件,避免出现“接口起来了但路由没加载”的情况
  • ifconfig 对 bond/team 接口的支持是半残的,ip -d link show bond0 才能看到实际 slave 状态和 mode 参数

ethtool 调整网卡参数时哪些值真有用

很多人一上来就狂调 rx/tx ring size,结果吞吐没涨反而丢包变多——环形缓冲区不是越大越好,得匹配中断聚合策略和 CPU 负载。

  • 先看当前值:ethtool -g eth0,注意 Current hardware settings 行,别只信 Maximum supported
  • 调大前确认驱动是否支持:某些 Realtek 或旧 Intel 卡(如 e1000)设 rx 4096 会触发内核警告 "ring size too large for device"
  • 真正影响延迟的是 ethtool -C eth0 rx-usecs 50 这类中断节制参数,但要配合 irqbalance 关闭或绑核使用,否则 CPU 调度抖动比中断延迟还高

为什么 sysctl 改了 net.ipv4.tcp_tw_reuse 没效果

这个参数只对 *outgoing* 连接生效,且必须满足 net.ipv4.tcp_timestamps = 1,否则内核直接跳过时间戳校验逻辑,tw_reuse 形同虚设。

  • 检查依赖项:sysctl net.ipv4.tcp_timestamps 必须为 1,很多安全加固脚本会把它设成 0
  • 它不解决 TIME_WAIT 占满端口的问题,只是允许复用“已关闭但时间戳更新”的连接;真要释放端口,得靠 net.ipv4.ip_local_port_range 扩大临时端口池
  • 云环境慎开:某些负载均衡器(如 AWS NLB)对 timestamp 敏感,开启后可能被误判为连接重放

排查网卡软中断不均导致的单核打满

top 里看到 si 高但 CPU 各核负载悬殊,基本就是 RPS(Receive Packet Steering)没配或者网卡 RSS 不生效。

  • 查 RSS 是否启用:ethtool -x eth0,输出里有 RSS hash keyindirection table 才算真开了
  • 手动绑定 IRQ 到多核:echo "f" > /proc/irq/$(grep eth0 /proc/interrupts | awk '{print $1}' | cut -d: -f1)/smp_affinity_list(把 f 换成对应掩码)
  • 如果用的是 VM,确认 virtio-net 启用了 vq 多队列:ethtool -l eth0Combined 值大于 1,否则再怎么调 RPS 都白搭

最常被忽略的是网卡固件版本——老版本 ixgbe 固件在开启 RPS 后反而降低吞吐,得先升级固件再调内核参数。

text=ZqhQzanResources