Linux 網路上的 SoftIRQ 和快速資料包處理

Linux 網路上的 SoftIRQ 和快速資料包處理

我一直在閱讀有關 Linux 效能調整的內容,以便在接收金融市場數據時獲得最快的資料包處理時間。我看到當 NIC 接收到資料包時,它會透過 DMA 將其放入記憶體中,然後引發一個 HardIRQ - 這又會設定一些 NAPI 設定並引發一個 SoftIRQ。然後,SoftIRQ 使用 NAPI/裝置驅動程式透過輪詢從 RX 緩衝區讀取數據,但這僅運行一段有限的時間(net.core.netdev_budget,預設為 300 個資料包)。這些是參考運行 ubuntu 的真實伺服器,帶有 Solarflare NIC 我的問題如下:

  1. 如果每個HardIRQ 引發一個SoftIRQ,並且裝置驅動程式在1 go 中讀取多個資料包(netdev_budget),則1 go 中從RX 緩衝區中耗盡的每個資料包引發的SoftIRQ 會發生什麼情況(收到的每個資料包都會引發一個硬IRQ)然後是軟中斷)?這些都在排隊嗎?

  2. 為什麼 NAPI 使用輪詢來耗盡 RX_buffer?系統剛剛產生一個 SoftIRQ 並正在讀取 RX 緩衝區,那麼為什麼要進行輪詢呢?

  3. 據推測,透過軟中斷耗盡 RX_Buffer 只會發生在 1 個特定的 RX_Buffer 上,而不會發生在多個 RX_Buffer 上?如果是這樣,那麼增加 netdev_budget 會延遲其他 RX_buffer 的處理/耗盡嗎?或者可以透過將不同的 RX_buffer 分配給不同的核心來緩解這種情況嗎?

  4. 有一些設定可以確保立即引發和處理 HardIRQ。然而,SoftIRQ 可能會在稍後處理。是否有設定/配置來確保與網路 RX 相關的 SoftIRQ 也得到最高優先權且無延遲的處理?

答案1

關於第四個問題的回答,

是的 網路卡是與軟體中斷相關的外設,因為軟體中斷是所有下半部機制中最高優先順序的。

因此,為了防止延遲可能導致隨後丟包,使用了軟中斷。

基本上,NAPI 機制還旨在處理那些由於某些原因而核心無法使用中斷機制處理的速度的資料包。

我建議直接閱讀 LDD3 中網路驅動程式的章節。這裡是對此有幫助的連結。

相關內容