發表文章

[筆記] 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 > /s