[筆記] RTL8156B + Raspberry Pi 4B + Ubuntu 22.04/24.04 (PPPOE) throughput 透過 RPS/RFS 改善

由於家中原先裝在 Pi 4 當路由器 WAN 孔的 RTL8153 USB Gigabit 網卡 (Polywell) 長期發熱,上機約半年後燒毀 (kernel log 顯示 overcurrent,剛好最近天氣變熱);剛好在公司有用 RTL8156B 方案的網卡 (Uptech 包裝)、滿載也低溫穩定,但因缺貨故改購買 Kamera 包裝的版本。

到貨並裝上後發現:

1. 線路方案是種花 500M 對稱,Cloudflare speed test 與 speedtest.net (Chunghwa Mobile) 只能測到 280M/400M,throughput 比 RTL8153 方案的預設設定低
2. lsusb -t 有正常跑在 5Gbps
3. Pi 4 的 CPU0 滿載,其他核心只圍觀
4. Ubuntu 22.04 驅動程式在網卡插上就已正確使用 r8152,與網路上搜尋到掉速問題常見的 cdc_ncm 驅動不符,升級到 kernel 6.8 系列的 Ubuntu 24.04 Beta 情況沒有改善
5. ethtool -k usb_if  顯示能開的 offloading 都有開啟

在 OpenWRT 中有 Packet Steering 的選項、先前在其他地方用其他 1G/600M 的線路測試 OpenWRT+Pi 4B+RTL8156B 可跑滿方案頻寬。然而在 Ubuntu 中預設沒有打開相關的功能,系統只會用一個核心處理封包,不但樹梅派發熱嚴重、不超頻處理器連 500M 都跑不到。

測試幾組參數後,最後在開機完成 PPPoE 撥號後的 script (/etc/ppp/ip-up.d/,也可以寫成 systemd service 依賴設定在網路啟動後) 加入:

echo e > /sys/class/net/eth1/queues/rx-*/rps_cpus
echo e > /sys/class/net/eth0/queues/rx-*/rps_cpus
echo 16384 > /proc/sys/net/core/rps_sock_flow_entries
echo 512 > /sys/class/net/eth0/queues/rx-*/rps_flow_cnt
echo 512 > /sys/class/net/eth1/queues/rx-*/rps_flow_cnt

註: rps_cpus mask 設定 e (二進位 1110) 即為使用 CPU 1、2、3 。

經測試打開 RPS(Receive Packet Steering) 與 RFS(Receive Flow Steering) 即可跑到申請的滿速 (>500/495),且 CPU 使用率明顯較為平均、Pi 4 被動散熱的 SoC 溫度也相對降低超過 5 度;打開 SQM piece_of_cake.qos 設定在 500000kbps 、overhead 34 可以輕鬆的控制在 488 Mbps 附近,測速時不精確觀察 CPU使用率最高的核心僅約用 50%。

附上 speedtest 測試結果:
(SQM關閉)

(SQM啟用)

留言

這個網誌中的熱門文章

卡巴拉島ViX_nriviewer簡易教學

[無用筆記] 單硬碟安裝 VMWare ESXi + Ubuntu 雙系統

[筆記] ASUS X570-PRO lm-sensors 設定