[心得] RSS+RPS+RFS優化NIC到播放軟體的資料路徑
繼前一篇 #1cWInSDW 分享第三層交換器優先權設定之後,這篇來分享一旦資料進入
網卡後,如何再優化 Linux 作業系統內部的資料流;這裡一樣是只探討優化手法,
不討論音質的改變(YMMV...)
關於 Receive Side Scaling, RSS 相關說明文件在此:
https://tinyurl.com/5d9zuace
RSS 也算是一個古老的存在了,許多高負載伺服器也都會運用這個功能去分攤/處理
所接收的資料流。其運作原理是根據來源地址、來源埠、目的位址及目的埠,送入
一個叫 Toeplitz(預設)的矩陣去換算出 hash 值,再用這個 hash 去對應的接受
儲列。例如,我的 HQPlayer Embedded 主機接收 NFS 的資料,根據相關地址和埠,
會交給儲列 8 來處理:
https://imgur.com/pr9YHN4.jpg
資料,來減少資料延遲。
在音訊網路裡面,能想到的大概是 Roon -> RoonBridge 或是 Roon -> HQPlayer
-> NAA 這樣的傳遞接收路徑;RSS 的設定方式大同小異,這裡就用我的 NAA <->
Ravenna bridge 做個例子,好處是內核設定的改動,都能反映在 Ravenna 器材上
的接收狀態。
我的 NAA 是 Intel Atom x7425e 四核心的單板電腦,跑 Ubuntu 實時核心,有特別
隔離一顆 CPU 核心做其他的事情。開完機之後我們可以看到由於 CPU 為四核心,
RxTx 儲列會有四個(RxTx-0~RxTx-3),但因為我把第四個 CPU 核心獨立出來不受
干擾,因此儲列的 IRQ 會自動轉分佈在前三個 CPU 核心。
https://imgur.com/WIDo1Xp.jpg
但 RSS indirection table 的數值仍是指向四個 Rx 儲列,這表示仍有一個 CPU
核心要處理兩個 Rx 儲列:
https://imgur.com/x3pAL70.jpg
如果不去變動 RSS 等設定的話,NAA 交給 Ravenna 的資料,Ravenna 接收端會呈現
一些鋸齒狀:
https://imgur.com/MMe9OOY.jpg
這些鋸齒狀都還是在容許範圍內,因此不會造成音訊中斷/爆音/破音/雜音等問題,
只是看起來不舒服。
不知為何 x7425e 並未支援 hash key,手上工具算不出來資料流會走哪個儲列,
因此策略上我個人是採取「機會均等」,讓 enp1s0 這個負責 NAA 的網口所接收的
資料平均分給三個 Rx 儲列,指令:
ethtool -X enp1s0 equal 3
(enp1s0 是我的網口名稱,請自行代入自己機器抓出的網口名稱。)
這樣就能把 RSS indirection table 強制平均分配到三個 Rx 儲列:
https://imgur.com/cjcLxHo.jpg
接下來再用 Receive Packet Steering, RPS 技巧,將 Rx 的儲列重新順給 CPU 第
0, 1, 2 核上,指令:
echo 1 > /sys/class/net/enp1s0/queues/rx-0/rps_cpus
echo 2 > /sys/class/net/enp1s0/queues/rx-1/rps_cpus
echo 4 > /sys/class/net/enp1s0/queues/rx-2/rps_cpus
1,2,4 是二進位遮罩轉為十進位數值,二進位最右邊是第一顆 CPU 核心,因此我
指定某個 Rx 儲列由 CPU 第三顆核心處理的話,二進位遮罩是 0100,換算十進位
是 4,以此類推。
Rx 儲列安排好之後,當然最理想是 IRQ 也一併和 Rx 儲列調整,前面截圖已知
RxTx-0, RxTx-1, RxTx-2 的 IRQ 分別是 128, 129, 130,我們就可以指定 IRQ
給相對的 CPU 核心:
echo 0 > /proc/irq/128/smp_affinity_list
echo 1 > /proc/irq/129/smp_affinity_list
echo 2 > /proc/irq/130/smp_affinity_list
(當然在做這個設定之前,要將 irqbalance 守護程式整個關掉。)
截圖呈現三個 RxTx 儲列的 IRQ 分別交給 CPU 0, 1, 2
https://imgur.com/QETjXby.jpg
為了配合這個 Rx 儲列硬平均,我也指定 networkaudiod 這個 daemon 跑在負責這
三個儲列的 CPU 核心上(networkaudiod 的主體 thread 會在這三個 CPU 核心上
隨機跑動)。
不過這也還是單位時間內 33% 機率資料流會被 networkaudiod 的主 thread 吃到,
因此還可以再用 Receive Flow Steering, RPS 來輔助資料流導向的命中率,這個
部分因為服務單純,因此 flow table 大小我並沒有設很大,這部分就看個人的
需求而定:
echo 8192 > /proc/sys/net/core/rps_sock_flow_entries
其他 Rx 儲列的 flow table 必須小於主 table size,我是設定 1024:
echo 1024 > /sys/class/net/enp1s0/queues/rx-0/rps_flow_cnt
echo 1024 > /sys/class/net/enp1s0/queues/rx-1/rps_flow_cnt
echo 1024 > /sys/class/net/enp1s0/queues/rx-2/rps_flow_cnt
NAA 經過 RSS + RPS + RFS 的調整之後,Ravenna 器材接收端變平順了些:
https://imgur.com/wZia5OZ.jpg
若您的 endpoint 是小電腦,不妨試著調整看看,或許會有驚喜 :-)
(以上的調整是採 run-time 方式調整,若會寫 shell script 就能省很多事,但
這裡就不是主題範圍了...)
--
推專業
81
[問題] 還是沒搞懂魔劣的男主為何實技評分會低耶魔劣新一季好像要播了? 想說在巴哈動畫瘋復習一下 因為我以前看過一次第一季 但一直沒搞懂到底為何魔劣第一季裡,為何男主在入學評測時 實技的分數會不高50
[心得] 調查技嘉於 INTEL BASELINE 設定之 PL2全文標題:跟進調查技嘉於 INTEL BASELINE 設定之 PL2 188W 與 AC_LL 1.7 的來由~ 技嘉沒有錯! 原文轉自 UNIKO's Hardware 網頁好讀版:41
[情報] 2050年出現1024核心CPU?!多核心處理器還能走多遠?2050年出現1024核心CPU?! 隨著Ryzen Threadripper 3990X處理器的上市,AMD於桌上型處理器也帶來了64核心128執行 緒處理器。此為目前最強大的桌上型處理器,甚至短時間內都應沒有競品能超越它了。 想想兩三年前,市場上的高階處理器還不過是4-6核心而已,8核心到現在也不能說是普及,38
Re: [標的] INTC intel 討論討論? 週末閒聊? 先說結論, 不看好Intel, 我也從來沒買過 Intel 營收主要來自兩個部分: 晶圓廠, IC設計37
[硬體] M2 MackBook Air/Pro 37,900 ~ 46,900MBA M2 8 核心 CPU 8 核心 GPU 8GB 統一記憶體 256GB SSD 儲存裝置 NT $37,900 8 核心 CPU 10 核心 GPU 8GB 統一記憶體 512GB SSD 儲存裝置 NT $46,90033
Re: [閒聊] intel 12代之後的大小核到底有沒有調度對OS而言 其實沒有分什麼大小核 一般設計系統就是以core為概念設計 就像是伺服器用的雙路主機板 上面插兩顆八核心cpu17
[情報] CPU也課金?英特爾計畫提供花錢解鎖額外電腦王 CPU也課金?英特爾計畫提供花錢解鎖額外功能,Linux核心率先支援 cnBetacnBeta 發表於 2022年2月15日 14:30 2022-02-15 今年春季即將推出的Linux 5.18版本會上線眾多新功能,不僅會支援Intel 12代 Core的大小核調度機制,同時還會支援Intel CPU處理器的另一個功能——軟體16
[情報] IceLake伺服器CPU IPC增長達54%資料來源WCCF,不喜請左轉 SiSoftware出現的數據,INTEL 10奈米伺服器CPU應該不遠了 可以看到14核心IceLake得分360.36 GOPS 基礎時脈2Ghz11
[情報] AMD大小核APU為5GHz(7~8W)+4GHz (5W)設計前幾天已經知道AMD據稱要推出大小核的設計了 以下資料是根據ES版得知的 實際情況可能會更好 根據爆料者所述 AMD的這種混合核心設計不叫"大小核" 而叫做"經典密集核心"X
[問卦]PC CPU為什麼不塞幾個ARM核心來跑 Android模擬?大家都知道 目前CPU核心數量越來越多 10核以上也不少見 只是平時電腦執行軟體 很少需要用到這麼多核心