Linux 2 6 35 新增特性 RPS RFS

2021-06-21 20:48:25 字數 2504 閱讀 2727

本帖最後由 lenky0401 於 2010-08-15 23:02 編輯

懶得拷貝了(主要是試了拷貝,竟然拷貝不了,突然感覺還是qq空間發表日誌時的貼上功能強大,連文字帶圖一起拷貝過去了,之後還提示是否要把給抓取過來存到qq相簿),

原文:linux 2.6.35於2023年8月1號發布,新增特性比較多,而其中最引我注意的為第一點:transparent spreading of incoming network traffic load across cpus。

關於此點改進的詳細介紹可以檢視lwn上的兩篇文章:"receive packet steering" and "receive flow steering"。

下面我就自己的理解來做一下闡述,不當之處,多多包涵。j

首先是receive packet steering (rps)

隨著單核cpu速度已經達到極限,cpu向多核方向發展,要持續提高網路處理頻寬,傳統的提公升硬體裝置、智慧型處理(如gso、tso、ufo)處理辦法已不足夠。如何充分利用多核優勢來進行並行處理提高網路處理速度就是rps解決的課題。

以乙個具有8核cpu和乙個nic的,連線在網路中的主機來說,對於由該主機產生並通過nic傳送到網路中的資料,cpu核的並行性是自熱而然的事情:

問題主要在於當該主機通過nic收到從網路發往本機的資料報時,應該將資料報分發給哪個cpu核來處理(有些具有多條接收佇列和多重中斷線路的nic可以幫助資料報並行分發,這裡考慮普通的nic,普通的nic通過rps來模擬實現並行分發):

普通的nic來分發這些接收到的資料報到cpu核處理需要一定的知識智慧型以幫助提公升效能,如果資料報被任意的分配給某個cpu核來處理就可能會導致所謂的「cacheline-pingpong」現象:

比如data0資料流的第乙個包被分發給cpu0來處理,第二個包分發給cpu1處理,第三個包又分發給cpu0處理;而data1資料流恰好相反。這樣的交替輪換(8核情況交替得更隨意)會導致cpu核的cache利用過分抖動。

rps就是消除這種cpu核隨意性分配的智慧型知識,它通過資料報相關的資訊(比如ip位址和埠號)來建立cpu核分配的hash表項,當乙個資料報從nic轉到核心網路子系統時就從該hash表內獲取其對應分配的cpu核(首次會建立表項)。這樣做的目的很明顯,它將具有相同相關資訊(比如ip位址和埠號)的資料報都被分發給同乙個cpu核來處理,避免了cpu的cache抖動現象,提高處理效能。

有兩點細節:第一,所有cpu核具有等同的被繫結機率,但管理員可以明確設定cpu核的繫結情況;第二,hash表項的計算是由nic進行的,不消耗cpu。

rps的效能優化結果為大致可提公升3倍左右。tg3驅動的nic效能由90,000提公升到285,000,而e1000驅動的nic效能由90,000提公升到292,000,其它驅動nic也得到類似的測試結果。

接下來是receive flow steering (rfs)

rfs是在rps上的改進,從上面的介紹可以看到,通過rps已經可以把同一流的資料報分發給同乙個cpu核來處理了,但是有可能出現這樣的情況,即給該資料流分發的cpu核和執行處理該資料流的應用程式的cpu核不是同乙個:

不僅要把同一流的資料報分發給同乙個cpu核來處理,還要分發給其『被期望』的cpu核來處理就是rfs需要解決的問題。

1.         乙個用於表示期望處理具有該類相關資訊資料報的cpu核對映,通過recvmsg()或sendmsg()等系統呼叫資訊來建立該hash表(稱之為期望cpu表)。比如執行於cpu0核上的某應用程式呼叫了recvmsg()從遠端機器host1上獲取資料,那麼nic對從host1上發過來的資料報的分發期望cpu核就是cpu0。

2.         乙個用於表示最近處理過具有該類相關資訊資料報的cpu核對映,稱這種表為當前cpu表。該錶的存在是因為有多執行緒的情況,比如執行在兩個cpu核上的多執行緒程式(每個核執行乙個執行緒)交替呼叫recvmsg()系統函式從同乙個socket上獲取遠端機器host1上的資料會導致期望cpu表頻繁更改。如果資料報的分發僅由期望cpu表決定則會導致資料報交替分發到這兩個cpu核上,很明顯,這不是我們想要的效果。

既然cpu核的分配由兩個hash錶值決定,那麼就可以有乙個演算法來描述這個決定過程:

1.         如果當前cpu表對應表項未設定或者當前cpu表對應表項對映的cpu核處於離線狀態,那麼使用期望cpu表對應表項對映的cpu核。

2.         如果當前cpu表對應表項對映的cpu核和期望cpu表對應表項對映的cpu核為同乙個,那麼好辦,就使用這乙個核。

3.         如果當前cpu表對應表項對映的cpu核和期望cpu表對應表項對映的cpu核不為同乙個,那麼:

a)         如果同一流的前一段資料報未處理完,那麼必須使用當前cpu表對應表項對映的cpu核,以避免亂序。

b)        如果同一流的前一段資料報已經處理完,那麼則可以使用期望cpu表對應表項對映的cpu核。

分情況判斷:

rfs適用於面向流的網路協議,它能更好的提公升cpu的cache效率,不論是核心還是應用程式本身。rfs的效能優化結果在普通環境下為大致可提公升3倍左右,而在多執行緒環境大致可提公升2倍。能通過軟體的形式提公升機器網路頻寬效能自然也是再好不過的事情了。

Ubuntu安裝Linux2 6 35核心編譯

sudo tar xvf linux 2.6.35.tar.xz c usr src cd usr src 第二步 安裝編譯核心時需要的工具 sudo apt install sudo apt get install build essential kernel package libncurses...

linux 2 6 35核心移植 USB驅動的新增

實驗目的 在fs2410開發板上進行linux 2.6.22.6核心的移植,這個部分完成usb裝置驅動的新增,完成相應的功能。實驗環境 1 ubuntu 10.10發行版 2 u boot 2010.03 3 fs2410平台 4 交叉編譯器 arm none linux gnueabi gcc 4...

linux新增特性timerfd

linux2.6.25版本新增了timerfd這個供使用者程式使用的定時介面,這個介面基於檔案描述符,當超時事件發生時,該檔案描述符就變為可讀。我首次接觸這個新特性是在muduo網路庫的定時器裡看到的,那麼新增乙個這樣的定時器介面有什麼意義呢?要說明這個問題我得先給大家列舉一下linux下能實現定時...