英特尔 I219 遭遇巨大封装损失

英特尔 I219 遭遇巨大封装损失

有一些讨论,似乎这个问题已经解决了。但是,文献很少。所以我写了这篇文章,希望它能对其他人有所帮助。

症状

Intel 以太网连接 I219 系列(包括 I219-V 和 I219-LM)无法在 Linux 上运行,speedtest.net 上的速度约为 1 Mb/s,LAN 内 ping 丢失率为 30-50%。这是内核问题,因此 Ubuntu 和 Fedora 都会遇到同样的问题。4.19 到 5.11 的用户都报告了这个问题。使用 apt 更新无济于事。

细节

  • 从另一台机器 ping
$ ping -i 0.2 -W 0.2 -c 100 -s 1000 192.168.1.2
100 packets transmitted, 56 received, 44% packet loss, time 20195ms
  • 设备信息
# lspci -vvvnn -s 00:1f.6
00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection (14) I219-V [8086:15fa] (rev 11)
    Subsystem: CLEVO/KAPOK Computer Ethernet Connection (14) I219-V [1558:50e1]
    Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0
    Interrupt: pin A routed to IRQ 129
    Region 0: Memory at 82380000 (32-bit, non-prefetchable) [size=128K]
    Capabilities: [c8] Power Management version 3
        Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
        Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=1 PME-
    Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Address: 00000000fee00338  Data: 0000
    Kernel driver in use: e1000e
    Kernel modules: e1000e
# ethtool -i enp0s31f6
driver: e1000e
version: 5.11.0-40-generic
firmware-version: 0.4-4
expansion-rom-version: 
bus-info: 0000:00:1f.6
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

答案1

原因

电源管理关闭网络适配器的缓存/内存(有关更多信息,请参阅[7])。

解决方法

  • 因此我需要禁用电源管理。英特尔设备的工作状态称为 C 状态。C 状态范围从 C0 到 Cn。C0 表示活动状态(请参阅英特尔用户指南/C-State)。第一个解决方法是将最大 C 状态设置得不太高 [3,4]。

    vi /etc/default/grub
    # add intel_idle.max_cstate=1 to GRUB_CMDLINE_LINUX_DEFAULT after 
    "quite splash"
    # so that line looks like
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_idle.max_cstate=1"
    # then save and execute
    update-grub
    # then reboot, you can confirm this is applied by
    cat /proc/cmdline|grep intel
    cat /sys/module/intel_idle/parameters/max_cstate
    

    你甚至可以设置max_cstate为0;某人做这个。

  • 更改有关网络适配器电源控制的标志[5]。

    # on my machine the default value is "auto"
    cat /sys/bus/pci/devices/0000\:00\:16.0/power/control
    echo on > /sys/bus/pci/devices/0000\:00\:16.0/power/control
    # check it is "on" now
    cat /sys/bus/pci/devices/0000\:00\:16.0/power/control
    

文献

  1. https://bugzilla.redhat.com/show_bug.cgi?id=1652865这是 2019 年 1 月的报告。他使用的是 4.29 内核。没有提供解决方案。

  2. https://bugzilla.kernel.org/show_bug.cgi?id=213651提议

    • 卸载我* (对我来说不起作用
    • BIOS 设置 -> 系统管理 -> Intel AMT 功能,将其从“限制 MEBx 访问”切换为“已禁用”(对我来说不起作用--我的BIOS没有这个选择)
  3. https://bugzilla.kernel.org/show_bug.cgi?id=213377是关于完全相同的问题。他们提出

    • 使用“intel_idle.max_cstate=1”启动相同的内核(有关说明,请参阅如何设置 intel_idle.max_cstate=1)(几乎有效-- 下载速度和数据包丢失已修复但上传为零)
  4. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1927925

    • 他们声称[3]中的解决方案有效
    • 评论#93 解释了为什么会发生此错误,但是太专业了;我无法完全理解。
  5. https://bugs.launchpad.net/ubuntu/+source/linux-oem-5.10/+bug/1930754

    • The trick is to set the boot kernel parameter "pcie_aspm=off" in '/etc/default/grub'
      Like this:
      GRUB_CMDLINE_LINUX_DEFAULT="splash pcie_aspm=off"
      After that run;
      update-grub
      
      对我来说不起作用
    • 他们证实[2]中的解决方案不起作用。
    • echo on | sudo tee /sys/bus/pci/devices/0000\:00\:16.0/power/control几乎有效-- 下载速度和数据包丢失已修复但上传为零)
  6. 有线网络非常慢

    • 提问者做了很多工作,包括报告自己编译驱动程序是不可能的
    • 这些答案对我都不起作用。

相关内容