PCIe設(shè)備的數(shù)據(jù)流有哪些,分別是什么場(chǎng)景?
PCIe設(shè)備的數(shù)據(jù)流主要為4大類:
1.CPU發(fā)起的,訪問(wèn)PCIe設(shè)備配置空間的數(shù)據(jù)流。這種數(shù)據(jù)流主要是BIOS/Linux PCIedriver 對(duì)設(shè)備進(jìn)行初始化、資源分配時(shí),讀寫配置空間的。包括PCIe 枚舉,BAR空間分配, MSI 分配等。 設(shè)備驅(qū)動(dòng)通過(guò) pci_wirte_config() / pci_read_config() 發(fā)起配置空間訪問(wèn)。 lspci /setpci 也是對(duì)應(yīng)到配置空間訪問(wèn)。
2.CPU發(fā)起的,訪問(wèn)PCIe設(shè)備MMIO/IO的數(shù)據(jù)流。將Bar空間mmap 到系統(tǒng)地址空間后,設(shè)備驅(qū)動(dòng)可通過(guò)地址訪問(wèn)PCIe設(shè)備的 Bar/ MMIO 空間。 一般的,設(shè)備會(huì)將特定的寄存器和存儲(chǔ)實(shí)現(xiàn)在MMIO空間內(nèi)。CPU可使用 iowrite32() / ioread32() 等方式訪問(wèn) MMIO空間。這是一種效率較低的PCIe使用方式.
3.PCIe設(shè)備發(fā)起的,訪問(wèn) HostMemory 的 DMA數(shù)據(jù)流。這種數(shù)據(jù)流由PCIe設(shè)備的DMAEngine 發(fā)起,是一種常見的、高性能的PCIe數(shù)據(jù)流。CPU通過(guò)配置 PCIe設(shè)備內(nèi)的DMAEngine (通過(guò)MMIO寄存器),啟動(dòng)設(shè)備PCIeDMA。網(wǎng)卡,GPU等PCIe設(shè)備,數(shù)據(jù)通路均有PCIeDMA完成。
4.PCIe設(shè)備發(fā)起的,訪問(wèn)PCIe設(shè)備MMIO/IO的數(shù)據(jù)流, 亦稱P2P (Peer to Peer)。同(3)類似,也是利用PCIe設(shè)備的DMAengine, 但是數(shù)據(jù)訪問(wèn)的是其他PCIe設(shè)備的MMIO地址空間而非HostMemory. CPU須配置橋片端口路由地址。 GDR (GPU directRDMA) 就是利用這種數(shù)據(jù)流,避免主機(jī)內(nèi)存的數(shù)據(jù)拷貝。
CPU訪問(wèn)設(shè)備內(nèi)存(Bar空間)和訪問(wèn)主機(jī)內(nèi)存,有什么不同?
Prefetchable MMIO 映射到系統(tǒng)地址空間后,軟件可以通過(guò)地址對(duì)PCIeMMIO空間進(jìn)行直接訪問(wèn)(CPU使用MOV指令),這一點(diǎn)與系統(tǒng)內(nèi)存訪問(wèn)在操作上是一致的。
RootComplex 會(huì)根據(jù)CPU訪問(wèn)的地址決定數(shù)據(jù)訪問(wèn)路由,對(duì)于系統(tǒng)內(nèi)存地址空間,數(shù)據(jù)會(huì)被路由到iMC(integrated Memory Controller) 訪問(wèn)DDR;對(duì)于MMIO地址空間,數(shù)據(jù)會(huì)被路由到HostBridge 轉(zhuǎn)換為 TLP發(fā)起對(duì)設(shè)備的PCIe通信。
一般的,HostMemory 分配都是Cacheable(writeback) 的,而 MMIO通常是Uncacheable的,加之兩者帶寬和通信機(jī)理的不同,導(dǎo)致了CPU使用地址直接訪問(wèn)PCIeMMIO空間無(wú)法達(dá)到訪問(wèn)系統(tǒng)內(nèi)存的性能,也無(wú)法用滿PCIe帶寬。使用memcpy() 在HostMemory 和MMIO 地址拷貝數(shù)據(jù)也是一種低效方式。
對(duì)于連續(xù)的MMIO空間訪問(wèn),可以通過(guò)支持writecombine的方式( mmap_wc() )來(lái)提升性能。
為什么需要使用PCIe DMA,在設(shè)備與主機(jī)間搬運(yùn)數(shù)據(jù)?
PCIe DMA 能夠?qū)崿F(xiàn)高性能的數(shù)據(jù)搬運(yùn)。
1.CPU僅需要配置DMAEngine, 大塊的數(shù)據(jù)搬運(yùn)過(guò)程無(wú)需CPU參與,CPU占用率低;
2.DMAEngine 是全硬件化的通信方式,TLPpayload 大overhead小,PCIe鏈路使用率高;
3.支持descriptor的DMA能夠?qū)崿F(xiàn)用戶態(tài)數(shù)據(jù)的零拷貝,減小內(nèi)存帶寬消耗;
4.支持多隊(duì)列的DMA,能夠提高系統(tǒng)并行度,支持多核,多進(jìn)程應(yīng)用,硬件解決IO搶占和調(diào)度問(wèn)題,軟件編程簡(jiǎn)單;
如何使用PCIe設(shè)備的中斷?
PCIe協(xié)議定義了三種中斷:INTx (legacy), MSI, MSIX
1.INTx中斷是相對(duì)古老的PCIe設(shè)備中斷方式,整個(gè)系統(tǒng)僅支持8個(gè)INTx 中斷,所有設(shè)備共用。PCIe中的INTx 中斷是通過(guò)PCIemessage發(fā)送到 switch和 IOAPIC的。CPU收到 IOAPIC轉(zhuǎn)發(fā)到 localAPIC 的 INTx 中斷后,需要查詢ISR確定中斷源設(shè)備,并進(jìn)一步查詢中斷含義,才能執(zhí)行中斷處理函數(shù)。中斷數(shù)量少,中斷查詢復(fù)雜,響應(yīng)延遲大,與數(shù)據(jù)流不保序等問(wèn)題的存在,是INTx的主要缺陷。
2.MSI是實(shí)現(xiàn)在配置空間的消息中斷,每個(gè)PCIefunction可支持最多32個(gè)MSI中斷。MSI中斷是一筆PCIe寫報(bào)文,向APIC地址域?qū)懭胩囟ǖ臄?shù)據(jù),觸發(fā)CPU中斷。因?yàn)槠渫ㄟ^(guò)PCIewriteTLP 實(shí)現(xiàn),中斷與業(yè)務(wù)數(shù)據(jù)的保序性容易實(shí)現(xiàn),硬件處理RacingCondition的代價(jià)更小。MSI中斷可以具備特定的含義,設(shè)備之間不耦合,中斷響應(yīng)快。
3.MSIx是實(shí)現(xiàn)在Bar空間的消息中斷,優(yōu)點(diǎn)與MSI類似,但其數(shù)量支持更多,每個(gè)function最多可以支持2K條中斷向量。
MSI和MSIx 是目前主流的中斷實(shí)現(xiàn)方式,在虛擬化的場(chǎng)景下,中斷可以通過(guò)IOMMU 實(shí)現(xiàn)remap和 posting, 進(jìn)一步提升系統(tǒng)性能。
網(wǎng)卡接收方向性能低,進(jìn)行調(diào)優(yōu)有哪些思路?
網(wǎng)卡收包性能性能調(diào)優(yōu),需先識(shí)別出性能瓶頸,可通過(guò)performance監(jiān)控工具(如IntelPCM),查看 CPU利用率,內(nèi)存帶寬使用,PCIe流量等。
一般的,優(yōu)化方向包括:
1.確定NUMA的親和性,保證CPU/Memory/PCIe 三者的親和性
2.確定PCIe全鏈路的帶寬匹配,確保內(nèi)存帶寬(讀+寫雙向)有余量
4.查看并打開IDO/RO (需注意應(yīng)用場(chǎng)景無(wú)保序風(fēng)險(xiǎn))
5.DMAEngine 參數(shù)的調(diào)優(yōu),Batch操作的閾值配置(隊(duì)列doorbell, completion notify等)
6.中斷頻率的調(diào)優(yōu)和控制(一般在20K/100k 每秒,需結(jié)合應(yīng)用和CPU)
7.DDIO和 cacheable /uncacheable 內(nèi)存空間的分配
具體原理和操作可參考課程中的有關(guān)介紹。
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10807瀏覽量
210852 -
Linux
+關(guān)注
關(guān)注
87文章
11212瀏覽量
208721 -
PCIe
+關(guān)注
關(guān)注
15文章
1200瀏覽量
82354 -
dma
+關(guān)注
關(guān)注
3文章
558瀏覽量
100348 -
數(shù)據(jù)流
+關(guān)注
關(guān)注
0文章
119瀏覽量
14318
原文標(biāo)題:PCIe 課程典型問(wèn)題解答
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論