2016-06-22 117 views
3

我一直在閱讀關於Linux的性能優化,以便在接收金融市場數據時獲得最快的數據包處理時間。我看到,當網卡接收到一個數據包時,它通過DMA將其存儲在內存中,然後產生一個HardIRQ,然後設置一些NAPI設置並引發一個SoftIRQ。然後,SoftIRQ使用NAPI /設備驅動程序通過輪詢從RX緩衝區中讀取數據,但這隻會在有限的時間內運行(net.core.netdev_budget,默認爲300個數據包)。這些都是參照真實服務器運行Ubuntu,與Solarflare的網卡我的問題是如下:Linux上的SoftIRQ和快速數據包處理網絡

  1. 如果每個HardIRQ提出了一個軟中斷,以及設備驅動程序在1個圍棋(netdev_budget)讀取多個數據包,會發生什麼到每一個從RX緩衝區中排出的數據包引發的SoftIRQs(每個包接收到的數據包將會增加一個難度,然後是軟irq)?這些排隊?

  2. 爲什麼NA​​PI使用輪詢來排空RX_buffer?系統剛生成一個SoftIRQ並正在讀取RX緩衝區,那麼爲什麼輪詢?

  3. 推測,通過softirq排空RX_Buffer只會從1個特定的RX_Buffer發生,而不會發生在多個RX_Buffers之間?如果是這樣,那麼增加netdev_budget可以延遲處理/排空其他RX_buffers?或者可以通過將不同的RX_buffers分配給不同的內核來緩解這種情況?

  4. 有一些設置可以確保立即提出並處理HardIRQ。但是,SoftIRQ可能會在稍後處理。是否有設置/配置以確保與網絡RX相關的SoftIRQ也以最高優先級處理並且沒有延遲?

+0

這可能更適合Linux/Ubuntu Stack Exchange站點之一。 –

回答

3

我寫了一個全面的博客文章,解釋了回答您的問題和其他一切有關調整,優化,分析,並瞭解整個Linux網絡棧here

問題的答案:而軟中斷正在處理什麼也不做由駕駛員提出

  1. sofirqs。這是因爲NAPI幫助程序代碼首先檢查NAPI是否已在運行,然後嘗試提升softirq。即使NAPI沒有檢查,你也可以用see from the softirq source作爲位矢來實現softirqs。這意味着softirq只能是1(待定)或0(未待定)。雖然它設置爲1,但將其設置爲1的其他呼叫將不起作用。

  2. softirq用於啓動NAPI輪詢循環並控制NAPI輪詢,因此它不會佔用100%的CPU使用量。 NAPI輪詢循環只是一個for循環,softirq代碼管理它可以花多少時間以及它有多少預算。

  3. 每個處理數據包的CPU都可以花費全部預算。因此,如果預算設置爲300,並且您有2個CPU,則每個CPU可以處理300個數據包,每個CPU總數爲600個。僅當您的NIC支持多個RX隊列並且您已將IRQ分配給單獨的CPU處理。如果您的NIC沒有,您可以使用接收數據包控制來幫助解決此問題(RPS)。有關更多信息,請參閱上面的博文。

  4. 不,這裏沒有設置。請注意,softirqs在提升它們的相同CPU上運行。因此,如果將RX隊列1的硬件處理器設置爲CPU 16,則softirq將在CPU 16上運行。你可以做的一件事是:將硬件設置爲特定的CPU,並將使用該數據的應用程序設置到相同的CPU上。將所有其他應用程序(如cron作業,後臺任務等)固定到其他CPU - 這確保只有硬件處理程序softirq和處理數據的應用程序才能運行。

如果您需要極低的延遲的網絡數據包讀取,你應該嘗試使用新的Linux內核的網絡功能,稱爲busy polling。它可以用來幫助最小化和減少網絡數據包處理延遲。使用此選項會增加CPU使用率。

+0

謝謝@ joe-damato。您的博客文章非常有幫助。作爲一個後續 - 我有一個太陽耀斑尼克與成對的RX和TX隊列(8臺,8核心機器),每套共享一個IRQ號碼。我用smp_affinity來設置哪個內核被哪個內核處理。但是,這也可以確保發送(tx)中斷也由同一個內核處理。這將如何與xps協同工作?還有一種方法可以查看/設置哪個tx隊列用於特定的應用程序/ TCP連接? – Nidhi

+0

嗨@Nidhi聽起來像這可能需要一個完全獨立的問題,而不是評論:)是否有任何東西從我的答案缺失,它被接受? –