4

我正試着在嵌入式linux環境下測試NAPI的功能。我使用'pktgen'來生成大量數據包,並試圖驗證我的網絡接口的中斷計數是/proc/interrupts如何測試linux NAPI功能?

我發現中斷計數比生成的數據包少。 另外我試圖調整'netdev_budget'值從1到1000(默認值是300),這樣我可以觀察netdev_budget增加時中斷計數的減少。

但是增加netdev_budget似乎沒有幫助。中斷類似於與netdev_budget觀察中斷計數設置爲300

因此,這裏有我的疑問:

  1. 什麼是「netdev_budget」對NAPI的影響?

  2. 我可以/應該調整哪些其他參數以觀察中斷計數的更改?

  3. 有沒有其他辦法,我可以用它來測試Linux上的NAPI功能?(除了直接看網絡驅動程序代碼)

任何幫助深表appreaciated。

在此先感謝。

+0

測試「腐爛的小包」。在從napi輪詢返回到中斷模式的過渡期間,幀的到達可能未被檢測到。直到另一幀到達觸發接收中斷時纔會處理該幀。 – sawdust

+0

嗨@sawdust謝謝你的提示。但是,您能否詳細說明您的答案?因爲我沒有看到任何丟棄的數據包,除非我增加數據包/幀的大小。那麼,我應該怎麼做才能檢查是否有「腐爛的數據包」? – sunisiha

+0

腐爛的數據包不是丟棄的數據包。這是一個延遲的數據包。爲了容易地注意到這樣的錯誤,你必須有定時數據包,例如期望在X秒內做出響應,並且鏈接在活動突發和非活動時段之間變化。產生問題的環境涉及10條指令的時間窗口。但墨菲法則佔上風。創建環境可能很難,這部分解釋了爲什麼司機會因爲這個bug而被釋放。 – sawdust

回答

5

我寫了一個comprehensive blog post about Linux network tuning,它解釋了關於監視,調整和優化Linux網絡堆棧(包括NAPI權重)的所有內容。看一看。

請記住:某些驅動程序不要在NAPI啓動時禁用NIC的IRQ。他們應該這樣做,但有些根本就沒有。您可以通過檢查驅動程序中的硬IRQ處理程序來查看硬核IRQ是否被禁用來驗證。

請注意,在博客文章和下文中提到的某些情況下,可以重新啓用硬IRQ。

至於你的問題:

  1. 增加netdev_budget增加了NET_RX軟中斷可以處理的數據包數量。可以處理的數據包數量也受限於一個不可調整的時間限制。這是爲了防止NET_RX softirq佔用100%的CPU使用量。如果設備在其時間分配期間未收到足夠的數據包進行處理,則hardirqs爲reneabled並且禁用NAPI。

  2. 如果支持,您還可以嘗試修改NIC的IRQ合併設置。請參閱上面的博文,瞭解更多關於如何做到這一點的信息,以及這意味着什麼。

  3. 您應該將監視添加到您的/proc/net/softnet_stat文件中。該文件中的字段可以幫助您計算出正在處理的數據包數量,是否耗盡時間等。

一個問題給你,如果我可以考慮,:

爲什麼你的hardirq率回事?直接可能沒關係。 NIC驅動程序中的hardirq處理程序應該儘可能少地工作,所以它執行很多對您的系統可能不是問題。如果是這樣,你應該仔細衡量,因爲它似乎不太可能。不過,您可以調整IRQ合併設置和IRQ CPU關聯來分配處理,以分別更改由NIC生成並由特定CPU處理的硬件數量。

您應該考慮您是否對分組處理吞吐量或分組處理延遲更感興趣。根據所關心的問題,您可以適當調整網絡堆棧。記住:要完全調整和優化您的Linux網絡堆棧,您必須監視和調整每個組件。它們都是交織在一起的,很難(通常也不足)只監視和調整堆棧的一個方面。