2015-04-23 70 views
5

我正在研究Linux環回和IP網絡數據處理,而且似乎沒有代碼可以涵蓋2個不同套接字上的CPU通過環回傳遞數據的情況。通過環回來優化套接字數據傳輸NUMA

我認爲應該有可能檢測到這種情況,然後應用硬件DMA,以避免NUMA爭用將數據複製到接收器。

我的問題是:

  • 我是正確,這不是目前在Linux中做了什麼?
  • 我認爲這是可能的正確軌道?
  • 我應該研究哪些內核API或現有驅動程序來幫助完成這樣的環回版本?
+0

爲什麼不使用使用[* Unix套接字*](http://en.wikipedia.org/wiki/Unix_domain_socket)? –

+0

@artlessnoise:謝謝你的建議!與其他CPU通信時,unix域套接字的源代碼也顯示簡單的數據副本。我想避免QPI的阻塞性質,並允許硬件輔助DMA執行數據傳輸。 – jxh

+0

嗯,我明白了。套接字需要複製,因爲套接字的每一端(很可能)都是不同的進程。內存到內存DMA實際上並不常見(在硬件中找到)。有一個[DMA基礎結構](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/dmaengine.h#n66),它需要被插入到網絡堆棧中。對於* Unix套接字*我更有意義。其他可能性是* COW *;但它取決於每個進程中的用例。 –

回答

1

有幾個項目/企圖接口添加到擬用於HPS(MPI)內存到內存的DMA引擎:

KNEM可以使用I/OAT在某些Intel DMA引擎微體系結構和尺寸

I/OAT副本卸載通過DMA引擎 一個有趣的異步功能肯定是I/OAT副本卸載。 icopy.flags = KNEM_FLAG_DMA;

有些作者說,這對新的英特爾微架構的硬件DMA引擎沒有任何好處:

http://www.ipdps.org/ipdps2010/ipdps2010-slides/CAC/slides_cac_Mor10OptMPICom.pdf

I/OAT只爲過時的架構

有用CMA被宣佈爲類似項目:http://www.open-mpi.org/community/lists/devel/2012/01/10208.php

這些系統調用被設計成允許快速的消息通過 允許消息傳遞到與單個複製操作 (而不是使用時,其將需要 例如雙拷貝進行交換,共享存儲器或管道)。

如果可以的話,你不應該使用套接字(尤其是tcp套接字)來傳輸數據,它們有很高的軟件開銷,當你在單機上工作時不需要這些開銷。標準skb大小限制可能太小以至於無法有效使用I/OAT,因此網絡堆棧可能不會使用I/OAT。