我正在研究Linux環回和IP網絡數據處理,而且似乎沒有代碼可以涵蓋2個不同套接字上的CPU通過環回傳遞數據的情況。通過環回來優化套接字數據傳輸NUMA
我認爲應該有可能檢測到這種情況,然後應用硬件DMA,以避免NUMA爭用將數據複製到接收器。
我的問題是:
- 我是正確,這不是目前在Linux中做了什麼?
- 我認爲這是可能的正確軌道?
- 我應該研究哪些內核API或現有驅動程序來幫助完成這樣的環回版本?
我正在研究Linux環回和IP網絡數據處理,而且似乎沒有代碼可以涵蓋2個不同套接字上的CPU通過環回傳遞數據的情況。通過環回來優化套接字數據傳輸NUMA
我認爲應該有可能檢測到這種情況,然後應用硬件DMA,以避免NUMA爭用將數據複製到接收器。
我的問題是:
有幾個項目/企圖接口添加到擬用於HPS(MPI)內存到內存的DMA引擎:
process_vm_readv
,process_vm_writev
:http://man7.org/linux/man-pages/man2/process_vm_readv.2.htmlKNEM可以使用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。
爲什麼不使用使用[* Unix套接字*](http://en.wikipedia.org/wiki/Unix_domain_socket)? –
@artlessnoise:謝謝你的建議!與其他CPU通信時,unix域套接字的源代碼也顯示簡單的數據副本。我想避免QPI的阻塞性質,並允許硬件輔助DMA執行數據傳輸。 – jxh
嗯,我明白了。套接字需要複製,因爲套接字的每一端(很可能)都是不同的進程。內存到內存DMA實際上並不常見(在硬件中找到)。有一個[DMA基礎結構](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/dmaengine.h#n66),它需要被插入到網絡堆棧中。對於* Unix套接字*我更有意義。其他可能性是* COW *;但它取決於每個進程中的用例。 –