前陣子和朋友在淘寶淘了幾張 MCX342a 網卡,已經被 N 皇併購的 Mellanox 生產的經典 10G 網卡晶片之一,連接口走的是 OCP 2.0 規範,然後靠著開源轉接板轉成 PCIe 3.0 x4 連接ㄧ般家用主機板。

測試環境

Rack 上是 3950X 裝 PVE 當工作站
Desktop 是 3600X 和 i7-7700
NAS 是 c3758
3 張 MCX342a (Connect-X 3),1 張 Connext-X 2 En
測試軟體是經典的 iperf3

然而在測試時,卻發現神奇的事情,三張網卡,兩台電腦跟工作站之間可以跑滿 10G,然而任何一台跟 NAS 之間卻跑不滿,原本以為是模塊壞了,檢查之後卻越來越不對勁: NAS 機在 Ubuntu 20.04 可以跑滿 10G,難道是 TrueNAS Scale壞了? 由於 TrueNAS Scale 是 Debian 系的系統,所以朋友試著把 Ubuntu 的 iperf3 裝在 TrueNAS Scale 上,結果就能跑滿 10G 了???

但在檢查後案情似乎並不單純,因為兩個 iperf3 版本是一樣的,同樣的 binary,所以問題肯定出在其他地方。細心的朋友發現在跑 iperf3 接收時 CPU 吃滿了

最後發現設定的問題出在於網卡的參數設定上,由於網卡的 Rx/Tx ring buffer 預設的比較小 (512),導致 CPU 要一直對網卡存取資料,透過這行指令調整成 1024 就解決了問題,速度從 7G 回到 10G,提升了 33%

ethtool -G eno2 rx 1024 tx 1024

或許是為了增加對老硬體的支援,預設的 ring buffer 設的比較小來避免延遲,然而現代處理器處理速度強悍下兩者速度應該都差不多,調高一點反而避免了 CPU 要一直存取而被網卡 DOS 的情況。

總之,不用把網卡寄回封城中的賣家那邊真是太好了