修复Ubuntu中Realtek RTL8156B 2.5GbE USB适配器的性能问题

原文链接:Fixing performance issues with Realtek RTL8156B 2.5GbE USB dongle in Ubuntu 由Jean-Luc Aufranc撰写。
本文共计4785字,预计阅读6分 

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

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


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


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


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


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

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

iperf2

上传:


下载:


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

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


这其实还不算太糟糕了。

iperf3

上传:


下载:


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


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


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

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

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

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


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

笔记本电脑到迷你电脑:


迷你电脑到笔记本电脑:


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


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

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

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

下载到笔记本电脑:


从笔记本电脑上传:


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

cdc_ncm和r8152 drivers ubuntu
cdc_ncm和r8152 drivers ubuntu

使用NanoPi R4S进行测试

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


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


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

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


 

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


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


虽然我遵循了所有的步骤,但因为 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。现在终于可以成功工作了,如下所示:


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

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

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


我们试试iperf3上传:


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


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

分享这篇文章
订阅评论
提醒
0 评论
内联反馈
查看所有评论