调试网卡链路不断上/断的原因

调试网卡链路不断上/断的原因

我在 Ubuntu Intel NUC 上检测到一个问题,以太网链路断开然后又出现。这是一种常规模式,其中 NIC 关闭 4 秒,启动 12 秒,然后在一个周期内再次关闭 4 秒。
可能与物理损坏有关,但我无法更换网卡,因为它是集成的。显然,我想在更换任何昂贵的组件之前确认这一点。

如果我删除内核模块并重新插入它, kern.log 中会出现以下输出,除了最后几行之外,这对我来说是正常的。

kernel: [ 1299.003606] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
kernel: [ 1299.003608] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
kernel: [ 1299.004140] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
kernel: [ 1299.216578] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
kernel: [ 1299.288105] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) 94:c6:91:a7:78:3f
kernel: [ 1299.288112] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
kernel: [ 1299.288256] e1000e 0000:00:1f.6 eth0: MAC: 13, PHY: 12, PBA No: FFFFFF-0FF
kernel: [ 1299.293482] e1000e 0000:00:1f.6 eno1: renamed from eth0
kernel: [ 1304.424541] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
kernel: [ 1304.424696] IPv6: ADDRCONF(NETDEV_CHANGE): eno1: link becomes ready
kernel: [ 1325.609674] e1000e 0000:00:1f.6 eno1: NIC Link is Down
kernel: [ 1330.702483] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx

我尝试过的事情:

  • 更换电缆
  • 更改了所连接集线器上的端口(同一集线器上的另一台机器没有问题)
  • 更新BIOS
  • 回到旧内核
  • 尝试使用调试参数加载模块

如果我查看模块信息,$ modinfo e1000e我可以在输出中看到调试参数

parm:           debug:Debug level (0=none,...,16=all) (int)

但运行 modprobe 或 insmod 例如。$ sudo modprobe e1000e debug=16不会在 kern.log 中产生额外的信息,这正是我所期望的。

不确定下一步该去哪里。如果有人能告诉我为什么我没有从模块中获取调试信息,那将是一个很好的开始,并且非常感谢收到任何其他信息。

答案1

安装了新内核,但好消息是我似乎不必这样做。关于如何获取调试信息存在一些相互冲突的信息,但秘密在于正确配置动态调试。

首先将 e1000e 的每条调试消息转储到内核 debugFS 中

echo "module e1000e +flmpt" > /sys/kernel/debug/dynamic_debug/control

发现你必须在模块加载后执行此操作。你可以cat /sys/kernel/debug/dynamic_debug/control 看看它是如何根据这个命令修改的。看https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html了解更多信息

您也可以通过这种方式启动内核日志记录, echo 8 > /proc/sys/kernel/printk但对我来说,在我修改上面的动态调试控制设置之前,这似乎不起作用。我怀疑此方法还会在模块加载时提供信息,但尚未查看。

这产生了两组调试信息。 kern.log 现在有大量的调试信息,加上cat /proc/kmsg.两者似乎显示相同的信息。

答案2

如果你真的想调试内核代码,

  1. 了解如何在您的发行版上编译内核,或者至少如何在您的发行版上编译特定模块。

  2. 阅读该模块的源代码(其中还应该告诉您调试功能如何工作)。

  3. 如有必要(执行(2)后您就会知道),请在编译时更改内核配置以启用调试。

$ sudo modprobe e1000e debug=16不会在 kern.log 中产生额外的信息,这正是我所期望的。

潜在的陷阱:您在尝试之前确实删除了旧模块吗?它被删除了,即没有自动加载回来?

NIC 循环关闭 4 秒,恢复 12 秒,然后再次关闭 4 秒。

猜测:固件(或硬件)有问题,并且您无法调试其中任何一个,因为固件是闭源的,并且您没有硬件规格。

答案3

您可能想尝试两件事:

  • 通过添加pcie_aspm=off为内核参数来禁用 PCIE

  • 使用 with 禁用 TSO、GSO 和 GRO ethtool -K eth0 gso off gro off tso off(详细信息请参见这个错误报告)。

两者都来自旧线程,但可能仍然有效。

相关内容