修复Realtek RTL8156B 2.5GbE USB性能(dvaj0033)

cdc_ncm和r8152 drivers ubuntu
本文共计4785字,预计阅读6分 

不久前,我在 Ubuntu 20.04 中评测了一款基于 Realtek RTL8156B 芯片USB 3.0 转 2.5 Gbps 以太网适配器。测评时,我对这款适配器的可靠性和性能并没有多印象的深刻。当时也有很多朋友给了建议,例如更换网线、MTU 尺寸等。

但更换网线并没有什么帮助,我看到评论有人提到可能是 cdc_ncm 驱动程序问题,我还看到另一条评论说更新到 Linux 内核 5.14有应该能正确地安装r8152 驱动程序。所以我就这样做了,如下所示:

sudo apt install linux-oem-20.04d

将 Linux 5.13(Ubuntu 20.04 + HWE 附带)升级到了 Linux 5.14,但不幸的是该系统仍然继续使用了带有半双工链接的 cdc_ncm 驱动程序:

jaufranc@cnx-laptop-4:~$ inxi -n
Network:
  Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet 
  driver: r8169 
  IF: enp2s0f1 state: down mac: 98:28:a6:0f:06:07 
  Device-2: Qualcomm Atheros QCA9377 802.11ac Wireless Network Adapter 
  driver: ath10k_pci 
  IF: wlp3s0 state: up mac: 70:c9:4e:b7:84:77 
  Device-3: Realtek USB 10/100/1G/2.5G LAN type: USB driver: cdc_ncm 
  IF: enx1cbfced40321 state: up speed: 2500 Mbps duplex: half 
  mac: 1c:bf:ce:d4:03:21 
jaufranc@cnx-laptop-4:~$ uname -a
Linux cnx-laptop-4 5.14.0-1022-oem #24-Ubuntu SMP Mon Jan 31 16:00:31 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

后来我想,有可能必须要使用 udev 规则来防止加载 cdc_ncm 驱动程序了。而 r8152 驱动程序中确实有50-usb-realtek-net.rules能够帮助做到这一点。所以我就将文件复制到了/etc/udev/rules.d/文件夹中。由于不想重新启动,所以我卸载了不需要的模块,然后重新启动了 udev 试一试:

sudo rmmod cdc_mbim
sudo rmmod cdc_ncm
service udev restart

我们来看看结果怎么样,如下所示:

sudo inxi -n
Network:
  Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet 
  driver: r8169 
  IF: enp2s0f1 state: down mac: 98:28:a6:0f:06:07 
  Device-2: Qualcomm Atheros QCA9377 802.11ac Wireless Network Adapter 
  driver: ath10k_pci 
  IF: wlp3s0 state: up mac: 70:c9:4e:b7:84:77 
  Device-3: Realtek USB 10/100/1G/2.5G LAN type: USB driver: r8152 
  IF: enx1cbfced40321 state: up speed: 2500 Mbps duplex: full 
  mac: 1c:bf:ce:d4:03:21

很好!它现在可以使用 r8152 驱动程序了,并且我们还有一个全双工连接。

我们再次来对所有测试的结果来进行一下比较。

iperf2

上传:

iperf -t 60 -c 192.168.31.12
------------------------------------------------------------
Client connecting to 192.168.31.12, TCP port 5001
TCP window size: 1.40 MByte (default)
------------------------------------------------------------
[  3] local 192.168.31.166 port 41266 connected with 192.168.31.12 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec  16.4 GBytes  2.35 Gbits/sec

下载:

iperf -t 60 -c 192.168.31.166
------------------------------------------------------------
Client connecting to 192.168.31.166, TCP port 5001
TCP window size:  901 KByte (default)
------------------------------------------------------------
[  3] local 192.168.31.12 port 37188 connected with 192.168.31.166 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec  10.8 GBytes  1.55 Gbits/sec

这样做之后,下载速度有所提高了,之前使用 cdc_ncm 驱动程序时速度是 600 Mbps,但仍然没有接近 2.3 Gbps。

现在我们来体验下全双工:

Client connecting to 192.168.31.166, TCP port 5001
TCP window size:  799 KByte (default)
------------------------------------------------------------
[  4] local 192.168.31.12 port 5001 connected with 192.168.31.166 port 41290
[  6] local 192.168.31.12 port 37194 connected with 192.168.31.166 port 5001
[  6]  0.0-60.1 sec  8.06 GBytes  1.15 Gbits/sec
[  4]  0.0-60.4 sec  16.3 GBytes  2.32 Gbits/sec

这其实还不算太糟糕了。

iperf3

上传:

iperf3 -t 60 -c 192.168.31.12 -i 5
Connecting to host 192.168.31.12, port 5201
[  5] local 192.168.31.166 port 32848 connected to 192.168.31.12 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-5.00   sec  1.37 GBytes  2.36 Gbits/sec    0    847 KBytes       
[  5]   5.00-10.00  sec  1.37 GBytes  2.35 Gbits/sec    0    889 KBytes       
[  5]  10.00-15.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.14 MBytes       
[  5]  15.00-20.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.14 MBytes       
[  5]  20.00-25.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.14 MBytes       
[  5]  25.00-30.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.14 MBytes       
[  5]  30.00-35.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.73 MBytes       
[  5]  35.00-40.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.73 MBytes       
[  5]  40.00-45.00  sec  1.37 GBytes  2.35 Gbits/sec    0   3.92 MBytes       
[  5]  45.00-50.00  sec  1.37 GBytes  2.35 Gbits/sec    0   3.92 MBytes       
[  5]  50.00-55.00  sec  1.37 GBytes  2.35 Gbits/sec    0   3.92 MBytes       
[  5]  55.00-60.00  sec  1.37 GBytes  2.35 Gbits/sec    0   3.92 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  16.4 GBytes  2.35 Gbits/sec    0             sender
[  5]   0.00-60.05  sec  16.4 GBytes  2.35 Gbits/sec                  receiver
 
iperf Done.

下载:

iperf3 -t 60 -c 192.168.31.166 -i 5
Connecting to host 192.168.31.166, port 5201
[  5] local 192.168.31.12 port 53112 connected to 192.168.31.166 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-5.00   sec   802 MBytes  1.35 Gbits/sec  641    222 KBytes       
[  5]   5.00-10.00  sec   856 MBytes  1.44 Gbits/sec  618   83.4 KBytes       
[  5]  10.00-15.00  sec   852 MBytes  1.43 Gbits/sec  583   87.7 KBytes       
[  5]  15.00-20.00  sec   843 MBytes  1.41 Gbits/sec  592    168 KBytes       
[  5]  20.00-25.00  sec   831 MBytes  1.39 Gbits/sec  642   91.9 KBytes       
[  5]  25.00-30.00  sec   810 MBytes  1.36 Gbits/sec  666   97.6 KBytes       
[  5]  30.00-35.00  sec   831 MBytes  1.39 Gbits/sec  590    123 KBytes       
[  5]  35.00-40.00  sec   827 MBytes  1.39 Gbits/sec  652    298 KBytes       
[  5]  40.00-45.00  sec   843 MBytes  1.41 Gbits/sec  605   93.3 KBytes       
[  5]  45.00-50.00  sec   844 MBytes  1.42 Gbits/sec  635   96.2 KBytes       
[  5]  50.00-55.00  sec   862 MBytes  1.45 Gbits/sec  565   84.8 KBytes       
[  5]  55.00-60.00  sec   858 MBytes  1.44 Gbits/sec  583   82.0 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  9.82 GBytes  1.41 Gbits/sec  7372             sender
[  5]   0.00-60.00  sec  9.82 GBytes  1.41 Gbits/sec                  receiver
 
iperf Done.

和iperf2是差不多的。其实 iperf3 多年来一直都不支持全双工,但它们这次的 3.7 版重新引入了该功能。所以我们来试试看:

iperf3 -t 60 -c 192.168.31.12 --bidir -i 5
Connecting to host 192.168.31.12, port 5201
[  5] local 192.168.31.166 port 32858 connected to 192.168.31.12 port 5201
[  7] local 192.168.31.166 port 32860 connected to 192.168.31.12 port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-5.00   sec  1.36 GBytes  2.34 Gbits/sec    0   1.41 MBytes       
[  7][RX-C]   0.00-5.00   sec   643 MBytes  1.08 Gbits/sec                  
[  5][TX-C]   5.00-10.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.48 MBytes       
[  7][RX-C]   5.00-10.00  sec   673 MBytes  1.13 Gbits/sec                  
[  5][TX-C]  10.00-15.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.78 MBytes       
[  7][RX-C]  10.00-15.00  sec   690 MBytes  1.16 Gbits/sec                  
[  5][TX-C]  15.00-20.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.78 MBytes       
[  7][RX-C]  15.00-20.00  sec   695 MBytes  1.17 Gbits/sec                  
[  5][TX-C]  20.00-25.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.78 MBytes       
[  7][RX-C]  20.00-25.00  sec   703 MBytes  1.18 Gbits/sec                  
[  5][TX-C]  25.00-30.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.78 MBytes       
[  7][RX-C]  25.00-30.00  sec   704 MBytes  1.18 Gbits/sec                  
[  5][TX-C]  30.00-35.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.78 MBytes       
[  7][RX-C]  30.00-35.00  sec   711 MBytes  1.19 Gbits/sec                  
[  5][TX-C]  35.00-40.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.78 MBytes       
[  7][RX-C]  35.00-40.00  sec   697 MBytes  1.17 Gbits/sec                  
[  5][TX-C]  40.00-45.00  sec  28.8 MBytes  48.2 Mbits/sec    4   1.41 KBytes       
[  7][RX-C]  40.00-45.00  sec  15.0 MBytes  25.2 Mbits/sec                  
[  5][TX-C]  45.00-50.00  sec  0.00 Bytes  0.00 bits/sec    1   1.41 KBytes       
[  7][RX-C]  45.00-50.00  sec  0.00 Bytes  0.00 bits/sec                  
[  5][TX-C]  50.00-55.00  sec  0.00 Bytes  0.00 bits/sec    1   1.41 KBytes       
[  7][RX-C]  50.00-55.00  sec  0.00 Bytes  0.00 bits/sec                  
iperf3: error - control socket has closed unexpectedly

哎呀!发生了什么呢?内核日志中似乎也有一些错误消息。

[18424.279351] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18424.287497] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18424.295735] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18424.303858] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18430.885965] net_ratelimit: 107 callbacks suppressed
[18430.885975] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18431.251643] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18431.909792] r8152 2-1:1.0 enx1cbfced40321: Tx status -71
[18437.797786] r8152 2-1:1.0 enx1cbfced40321: Tx status -71

我其实不是唯一遇到这个问题的人了,所以我只能说这是 r8156 驱动程序 Github repo中一个未解决问题。以下是开发者的回答,仅供参考:

我怀疑以太网适配器方面存在问题,因为有很多报告称它与 DS918+ 一起工作。比如:如电源线设计、过热等等。你们可以点击下面链接查看详情:
https://github.com/bb-qq/r8152/wiki/Compatibility

或者你们也可以试试其他供应商的以太网适配器使用带有外部电源的 USB 集线器有可能可以改善这种情况。

此时,以太网根本不工作,所以我不得不拔下并重新插入 USB 适配器。这次终于成功“工作”了。

iperf3 -t 60 -c 192.168.31.12 --bidir -i 5
Connecting to host 192.168.31.12, port 5201
[  5] local 192.168.31.166 port 32872 connected to 192.168.31.12 port 5201
[  7] local 192.168.31.166 port 32874 connected to 192.168.31.12 port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-5.00   sec  1.36 GBytes  2.34 Gbits/sec    0   1.59 MBytes       
[  7][RX-C]   0.00-5.00   sec   515 MBytes   864 Mbits/sec                  
[  5][TX-C]   5.00-10.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.75 MBytes       
[  7][RX-C]   5.00-10.00  sec   489 MBytes   820 Mbits/sec                  
[  5][TX-C]  10.00-15.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.75 MBytes       
[  7][RX-C]  10.00-15.00  sec   530 MBytes   889 Mbits/sec                  
[  5][TX-C]  15.00-20.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.75 MBytes       
[  7][RX-C]  15.00-20.00  sec   564 MBytes   947 Mbits/sec                  
[  5][TX-C]  20.00-25.00  sec  1.36 GBytes  2.34 Gbits/sec    0   1.75 MBytes       
[  7][RX-C]  20.00-25.00  sec   560 MBytes   940 Mbits/sec                  
[  5][TX-C]  25.00-30.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  25.00-30.00  sec   578 MBytes   970 Mbits/sec                  
[  5][TX-C]  30.00-35.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  30.00-35.00  sec   561 MBytes   942 Mbits/sec                  
[  5][TX-C]  35.00-40.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  35.00-40.00  sec   572 MBytes   960 Mbits/sec                  
[  5][TX-C]  40.00-45.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  40.00-45.00  sec   570 MBytes   956 Mbits/sec                  
[  5][TX-C]  45.00-50.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  45.00-50.00  sec   572 MBytes   960 Mbits/sec                  
[  5][TX-C]  50.00-55.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  50.00-55.00  sec   570 MBytes   957 Mbits/sec                  
[  5][TX-C]  55.00-60.00  sec  1.36 GBytes  2.34 Gbits/sec    0   2.63 MBytes       
[  7][RX-C]  55.00-60.00  sec   571 MBytes   958 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID][Role] Interval           Transfer     Bitrate         Retr
[  5][TX-C]   0.00-60.00  sec  16.3 GBytes  2.34 Gbits/sec    0             sender
[  5][TX-C]   0.00-60.05  sec  16.3 GBytes  2.34 Gbits/sec                  receiver
[  7][RX-C]   0.00-60.00  sec  6.50 GBytes   931 Mbits/sec   58             sender
[  7][RX-C]   0.00-60.05  sec  6.50 GBytes   929 Mbits/sec                  receiver
 
iperf Done.

Rx 侧仍然有重传,这其实也帮助解释了为什么速度会如此低。

SAMBA

我将一台带有 RTL8156B 适配器和 SATA SSD 的笔记本电脑连接到了一个带有 2.5GbE 的端口上,并配备了480GB SSD和MINIX USB-C 扩展坞的UP Xtreme i11迷你 PC 。

SAMBA r8152驱动程序笔记本电脑传输到到迷你电脑的速度
SAMBA r8152驱动程序笔记本电脑传输到到迷你电脑的速度

r8152 驱动程序的传输速度大约是 930 Mbps,而 cdc_ncm 驱动程序的传速度大约是 750 Mbps。

现在我从迷你 PC 传输数据到笔记本电脑这个传输也可以称其为“下载”。

SAMBA r8152驱动程序迷你电脑传输数据到笔记本电脑
SAMBA r8152驱动程序迷你电脑传输数据到笔记本电脑

不出意料,此时的速度比较慢,只有837 Mbps,但仍然比我使用 cdc_ncm 驱动程序时的速度要好,使用 cdc_ncm 时只有不到500 Mbps。

scp

笔记本电脑到迷你电脑:

time scp Libero_SoC_v2021.2_lin.bin devkit@192.168.31.12:/home/devkit/NEO_Storage
devkit@192.168.31.12's password: 
Libero_SoC_v2021.2_lin.bin                                                           100%   10GB 115.0MB/s   01:32    
 
real	1m34.981s
user	0m55.750s
sys	0m42.668s

迷你电脑到笔记本电脑:

time scp devkit@192.168.31.12:/home/devkit/NEO_Storage/Libero_SoC_v2021.2_lin.bin .
devkit@192.168.31.12's password: 
Libero_SoC_v2021.2_lin.bin                                                           100%   10GB 111.7MB/s   01:35    
 
real	1m36.896s
user	0m56.926s
sys	0m55.330s

使用 scp 下载和上传的速度几乎是相同的,这一点很奇怪。这里的遇到的瓶颈似乎是因为我的 SATA SSD:

iozone -e -I -a -s 1000M -r 16384k -i 0 -i 1
	Iozone: Performance Test of File I/O
	        Version $Revision: 3.489 $
		Compiled for 64 bit mode.
		Build: linux-AMD64 
                                                              random    random     bkwd    record    stride                                    
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
         1024000   16384   141794   139550   149591   145020

可以看到其读取速度限制在 145 MB/s 左右,写入速度则限制在了 140 MB/s 左右。

对比来看,MINIX NEO Storage Plus USB-C 扩展坞中使用的SSD 速度更快了。我上次测试时,其顺序读取速度是 379MB/s,顺序写入速度为 240+ MB/s。

现在我们将数据放到 /dev/null上,看看现在的速度是怎么样的。

下载到笔记本电脑:

time scp -c aes128-ctr devkit@192.168.31.12:/home/devkit/NEO_Storage/Libero_SoC_v2021.2_lin.bin /dev/null
devkit@192.168.31.12's password: 
Libero_SoC_v2021.2_lin.bin                                                           100%   10GB 133.0MB/s   01:20    
 
real	1m21.880s
user	0m18.931s
sys	0m33.838s

从笔记本电脑上传:

time scp -c aes128-ctr Libero_SoC_v2021.2_lin.bin devkit@192.168.31.12:/dev/null
devkit@192.168.31.12's password: 
Libero_SoC_v2021.2_lin.bin                                                           100%   10GB 239.9MB/s   00:44    
 
real	0m46.094s
user	0m17.174s
sys	0m36.793s

由上可以看到,至少对于上传而言,速度已经基本可以了。我觉得下载速度还是有一些问题,但是使用 r8152 驱动后其性能确实是有了很大的提升。

使用NanoPi R4S进行测试

虽然上面的测试结果比之前的测试结果要好多了,但仍然不是最佳的。因为我有一个带2个 USB 3.0 端口的 NanoPi R4S 路由器,所以我首先使用最新的 OpenWrt (FriendlyWrt) 21.02 镜像和 Linux 5.15来尝试一下,如下所示:

root@FriendlyWrt:~# iperf3 -t 60 -c 192.168.2.207 --bidir -i 5
Connecting to host 192.168.2.207, port 5201
[  5] local 192.168.2.161 port 21836 connected to 192.168.2.207 port 5201
[  7] local 192.168.2.161 port 21838 connected to 192.168.2.207 port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-5.00   sec   348 MBytes   583 Mbits/sec    4    413 KBytes       
[  7][RX-C]   0.00-5.00   sec   220 MBytes   369 Mbits/sec                  
[  5][TX-C]   5.00-10.00  sec   480 MBytes   805 Mbits/sec    5    684 KBytes       
[  7][RX-C]   5.00-10.00  sec   218 MBytes   366 Mbits/sec                  
[  5][TX-C]  10.00-15.00  sec   574 MBytes   963 Mbits/sec   47    557 KBytes       
[  7][RX-C]  10.00-15.00  sec   183 MBytes   307 Mbits/sec                  
[  5][TX-C]  15.00-20.00  sec   481 MBytes   807 Mbits/sec    3    699 KBytes       
[  7][RX-C]  15.00-20.00  sec   179 MBytes   301 Mbits/sec                  
[  5][TX-C]  20.00-25.00  sec   464 MBytes   779 Mbits/sec   18    701 KBytes       
[  7][RX-C]  20.00-25.00  sec   214 MBytes   359 Mbits/sec                  
[  5][TX-C]  25.00-30.00  sec   549 MBytes   920 Mbits/sec   26    580 KBytes       
[  7][RX-C]  25.00-30.00  sec   178 MBytes   298 Mbits/sec                  
[  5][TX-C]  30.00-35.00  sec   472 MBytes   792 Mbits/sec    3    526 KBytes       
[  7][RX-C]  30.00-35.00  sec   207 MBytes   347 Mbits/sec                  
[  5][TX-C]  35.00-40.00  sec   465 MBytes   781 Mbits/sec   15    410 KBytes       
[  7][RX-C]  35.00-40.00  sec   195 MBytes   326 Mbits/sec                  
[  5][TX-C]  40.00-45.00  sec   385 MBytes   645 Mbits/sec    0    376 KBytes       
[  7][RX-C]  40.00-45.00  sec   217 MBytes   364 Mbits/sec                  
[  5][TX-C]  45.00-50.00  sec   497 MBytes   833 Mbits/sec    9    478 KBytes       
[  7][RX-C]  45.00-50.00  sec   201 MBytes   338 Mbits/sec                  
[  5][TX-C]  50.00-55.00  sec   434 MBytes   728 Mbits/sec    0    543 KBytes       
[  7][RX-C]  50.00-55.00  sec   208 MBytes   349 Mbits/sec                  
[  5][TX-C]  55.00-60.00  sec   451 MBytes   756 Mbits/sec    6    823 KBytes       
[  7][RX-C]  55.00-60.00  sec   220 MBytes   370 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID][Role] Interval           Transfer     Bitrate         Retr
[  5][TX-C]   0.00-60.00  sec  5.47 GBytes   783 Mbits/sec  136             sender
[  5][TX-C]   0.00-60.01  sec  5.47 GBytes   783 Mbits/sec                  receiver
[  7][RX-C]   0.00-60.00  sec  2.39 GBytes   342 Mbits/sec   94             sender
[  7][RX-C]   0.00-60.01  sec  2.38 GBytes   341 Mbits/sec                  receiver
 
iperf Done.

这真的很惨,两边都有很多是重传的。

[  276.268986] usb 8-1: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.00
[  276.269798] usb 8-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[  276.270471] usb 8-1: Product: USB 10/100/1G/2.5G LAN
[  276.272112] usb 8-1: Manufacturer: Realtek
[  276.272519] usb 8-1: SerialNumber: 0013000000
[  276.359625] cdc_ncm 8-1:2.0: MAC-Address: 1c:bf:ce:d4:03:21
[  276.360178] cdc_ncm 8-1:2.0: setting rx_max = 16384
[  276.360758] cdc_ncm 8-1:2.0: setting tx_max = 16384
[  276.362948] cdc_ncm 8-1:2.0 eth2: register 'cdc_ncm' at usb-xhci-hcd.1.auto-1, CDC NCM, 1c:bf:ce:d4:03:21
[  459.919597] IPv6: ADDRCONF(NETDEV_CHANGE): eth2: link becomes ready

查看内核日志,我们的 RTL8156B USB 适配器再次使用该 CDC NCM 驱动程序,就像在 Ubuntu 中一样……也有一个 r8152 驱动程序,但无论我在 /etc/modules.d 中删除什么模块,要么加载 CDC NCM,要么加载 eth2界面根本不显示。所以我切换到基于 Ubuntu 20.04 的 FriendlyCore 操作系统,它也是Linux 5.15,这将更接近我笔记本电脑上的设置。

正如人们所预料的那样,RTL8156B 适配器在 Ubuntu 中默认使用的是 CDC NCM 驱动程序。

[ 682.701529] usb 8-1: new SuperSpeed USB device number 3 using xhci-hcd
[ 682.727125] usb 8-1: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.00
[ 682.727163] usb 8-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[ 682.727179] usb 8-1: Product: USB 10/100/1G/2.5G LAN
[ 682.727191] usb 8-1: Manufacturer: Realtek
[ 682.727203] usb 8-1: SerialNumber: 0013000000
[ 682.806350] cdc_ncm 8-1:2.0: MAC-Address: 1c:bf:ce:d4:03:21
[ 682.806387] cdc_ncm 8-1:2.0: setting rx_max = 16384
[ 682.806561] cdc_ncm 8-1:2.0: setting tx_max = 16384
[ 682.807963] cdc_ncm 8-1:2.0 eth1: register 'cdc_ncm' at usb-xhci-hcd.1.auto-1, CDC NCM, 1c:bf:ce:d4:03:21
[ 682.834550] cdc_ncm 8-1:2.0 enx1cbfced40321: renamed from eth1

eth1 没有出现在 ifconfig 中,所以为了使用 r8152 驱动程序我还是继续更改 udev 规则。

[  882.081445] usb 7-1: new high-speed USB device number 3 using xhci-hcd
[  882.209358] usb 7-1: Device not responding to setup address.
[  882.417542] usb 7-1: Device not responding to setup address.
[  882.625432] usb 7-1: device not accepting address 3, error -71
[  886.597570] usb 8-1: new SuperSpeed USB device number 4 using xhci-hcd
[  886.619484] usb 8-1: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.00
[  886.619534] usb 8-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[  886.619556] usb 8-1: Product: USB 10/100/1G/2.5G LAN
[  886.619574] usb 8-1: Manufacturer: Realtek
[  886.619591] usb 8-1: SerialNumber: 0013000000
[  886.911033] usb 8-1: reset SuperSpeed USB device number 4 using xhci-hcd
[  886.960598] r8152 8-1:1.0: Direct firmware load for rtl_nic/rtl8156b-2.fw failed with error -2
[  886.960631] r8152 8-1:1.0: Falling back to sysfs fallback for: rtl_nic/rtl8156b-2.fw
[  947.165730] r8152 8-1:1.0: unable to load firmware patch rtl_nic/rtl8156b-2.fw (-110)
[  947.210940] r8152 8-1:1.0 (unnamed net_device) (uninitialized): netif_napi_add() called with weight 256
[  947.237480] r8152 8-1:1.0 eth1: v1.12.11
[  947.254755] usbcore: registered new interface driver cdc_ncm
[  947.257112] usbcore: registered new interface driver cdc_mbim
[  947.290865] r8152 8-1:1.0 enx1cbfced40321: renamed from eth1

这个测试越来越令人沮丧了,我们先来更新一下系统看看。

sudo apt update
sudo apt install python3-pip
sudo pip3 install apt-mirror-updater
apt-mirror-updater -c http://ftp.tu-chemnitz.de/pub/linux/ubuntu-ports
sudo apt dist-upgrade

虽然我遵循了所有的步骤,但因为 FriendlyCore 镜像依赖的是中国的服务器,这与我的服务器相比就非常慢(只是运行 apt update 就可能需要 15 分钟)。因此虽然理论上更新其实是很快的,但它仍然还是需要几个小时!具体你们可以参考“从命令行更改 Ubuntu Apt 镜像”。

更新系统对固件的问题其实没有什么帮助。因此,我搜索了rtl_nic/rtl8156b-2.fw文件。它应该是位于 firmware--realtek Debian 软件包和linux-firmware Ubuntu Impish 软件包中。

我下载了后者,并提取了 rtl8156b-2.fw ,然后将其复制到 /etc/firmware/rtl_nic。现在终于可以成功工作了,如下所示:

[ 2172.098871] usb 8-1: new SuperSpeed USB device number 4 using xhci-hcd
[ 2172.120681] usb 8-1: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.00
[ 2172.120731] usb 8-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[ 2172.120754] usb 8-1: Product: USB 10/100/1G/2.5G LAN
[ 2172.120771] usb 8-1: Manufacturer: Realtek
[ 2172.120788] usb 8-1: SerialNumber: 0013000000
[ 2172.183460] cdc_ncm 8-1:2.0: MAC-Address: 1c:bf:ce:d4:03:21
[ 2172.183494] cdc_ncm 8-1:2.0: setting rx_max = 16384
[ 2172.183620] cdc_ncm 8-1:2.0: setting tx_max = 16384
[ 2172.184904] cdc_ncm 8-1:2.0 eth1: register 'cdc_ncm' at usb-xhci-hcd.1.auto-1, CDC NCM, 1c:bf:ce:d4:03:21
[ 2172.189439] cdc_ncm 8-1:2.0 eth1: unregister 'cdc_ncm' usb-xhci-hcd.1.auto-1, CDC NCM
[ 2172.451015] usb 8-1: reset SuperSpeed USB device number 4 using xhci-hcd
[ 2172.535166] r8152 8-1:1.0: load rtl8156b-2 v1 04/15/21 successfully
[ 2172.598459] r8152 8-1:1.0 eth1: v1.12.11

不知道什么原因,其接口仍然未启动,我只好手动将其添加到了 /etc/network/interfaces.d,但似乎不起什么作用。

回到带有rtl8156b-2.fw固件的Ubuntu笔记本电脑

因为没什么作用,所以我又回到了笔记本电脑上,并将固件文件复制到了/lib/firmware/rtl_nic目录下。结果与 NanoPi R4S 中的结果是一样的,如下所示:

[23050.245495] usb 2-1: new SuperSpeed USB device number 3 using xhci_hcd
[23050.266025] usb 2-1: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=31.00
[23050.266038] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[23050.266043] usb 2-1: Product: USB 10/100/1G/2.5G LAN
[23050.266047] usb 2-1: Manufacturer: Realtek
[23050.266050] usb 2-1: SerialNumber: 0013000000
[23050.325714] cdc_ncm 2-1:2.0: MAC-Address: 1c:bf:ce:d4:03:21
[23050.325720] cdc_ncm 2-1:2.0: setting rx_max = 16384
[23050.325762] cdc_ncm 2-1:2.0: setting tx_max = 16384
[23050.326199] cdc_ncm 2-1:2.0 eth0: register 'cdc_ncm' at usb-0000:04:00.3-1, CDC NCM, 1c:bf:ce:d4:03:21
[23050.334723] cdc_ncm 2-1:2.0 eth0: unregister 'cdc_ncm' usb-0000:04:00.3-1, CDC NCM
[23050.559779] usb 2-1: reset SuperSpeed USB device number 3 using xhci_hcd
[23050.617459] r8152 2-1:1.0: load rtl8156b-2 v1 04/15/21 successfully
[23050.654344] r8152 2-1:1.0 eth0: v1.12.11

我们试试iperf3上传:

iperf3 -t 30 -c 192.168.31.12 -i 5
Connecting to host 192.168.31.12, port 5201
[  5] local 192.168.31.166 port 50222 connected to 192.168.31.12 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-5.00   sec  1.37 GBytes  2.36 Gbits/sec    0    609 KBytes       
[  5]   5.00-10.00  sec  1.37 GBytes  2.35 Gbits/sec    0    691 KBytes       
[  5]  10.00-15.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.35 MBytes       
[  5]  15.00-20.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.35 MBytes       
[  5]  20.00-25.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.35 MBytes       
[  5]  25.00-30.00  sec  1.37 GBytes  2.35 Gbits/sec    0   1.35 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec  8.22 GBytes  2.35 Gbits/sec    0             sender
[  5]   0.00-30.04  sec  8.22 GBytes  2.35 Gbits/sec                  receiver
 
iperf Done.

和以前一样,还是没有回到之前的状态。现在我使用iperf3测试下载:

iperf3 -t 30 -c 192.168.31.12 -i 5 -R
Connecting to host 192.168.31.12, port 5201
Reverse mode, remote host 192.168.31.12 is sending
[  5] local 192.168.31.166 port 50226 connected to 192.168.31.12 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-5.00   sec   969 MBytes  1.63 Gbits/sec                  
[  5]   5.00-10.00  sec   990 MBytes  1.66 Gbits/sec                  
[  5]  10.00-15.00  sec   982 MBytes  1.65 Gbits/sec                  
[  5]  15.00-20.00  sec   984 MBytes  1.65 Gbits/sec                  
[  5]  20.00-25.00  sec  1012 MBytes  1.70 Gbits/sec                  
[  5]  25.00-30.00  sec  1007 MBytes  1.69 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.02  sec  5.81 GBytes  1.66 Gbits/sec  3181             sender
[  5]   0.00-30.00  sec  5.80 GBytes  1.66 Gbits/sec                  receiver
 
iperf Done.

情况好转了一点,但还是没有达到最理想的结果,而且重发数量真的好多!我现在真的好累,如果你们有什么其他想法好方法,请留言告诉我。

来源

本文《修复Realtek RTL8156B 2.5GbE USB性能(dvaj0033)》由网赚联盟( wangzhuan.org.cn )整理或原创,感谢您的阅读。

随机文章

SEO教程
站长导航
友情链接交换
关键词排名优化
GEO培训
SEO教程
友情链接交换
搜素引擎算法

百度搜索“网赚联盟”即可找到本站,微信搜索“小小课堂网”关注小小课堂网公众号。网赚联盟( wangzhuan.org.cn )欢迎用户投稿,发布者:用户投稿,文章版权归作者所有,投稿文章不代表网赚联盟立场,中二少年发布为网赚联盟原创文章,转载请注明出处:https://wangzhuan.org.cn/223122.html