踐:批量提交WR與Doorbell優(yōu)化)
一、從一次詭異的性能抖動(dòng)說(shuō)起去年在調(diào)一個(gè)分布式存儲(chǔ)的RDMA路徑時(shí),遇到一個(gè)讓人抓狂的問(wèn)題:?jiǎn)芜B接小IO(4KB)的延遲曲線(xiàn),每隔幾十秒就會(huì)出現(xiàn)一個(gè)尖刺,峰值延遲從正常的5μs直接跳到200μs+。抓了ibv_devinfo、perftest、甚至用ftrace跟蹤內(nèi)核路徑,最后發(fā)現(xiàn)罪魁禍?zhǔn)拙谷皇荄oorbell的寫(xiě)入時(shí)機(jī)。當(dāng)時(shí)代碼里每個(gè)WR(Work Request)提交后都立刻調(diào)用了ibv_post_send,然后緊跟著一個(gè)mmio寫(xiě)Doorbell。這種寫(xiě)法在低負(fù)載下完全沒(méi)問(wèn)題,但一旦隊(duì)列深度(QD)超過(guò)16,Doorbell的MMIO寫(xiě)入就成了PCIe總線(xiàn)上的“堵車(chē)點(diǎn)”——每次寫(xiě)操作都要穿越PCIe拓?fù)?,而CPU側(cè)的寫(xiě)合并(Write Combining)策略又和硬件期望的Doorbell語(yǔ)義打架,最終導(dǎo)致硬件側(cè)Doorbell丟失或延遲處理。這個(gè)坑讓我意識(shí)到:RDMA編程里,批量提交WR和Doorbell優(yōu)化不是“錦上添花”,而是“保命操作”。下面直接上干貨,不講虛的。二、WR批量提交:別讓硬件餓著2.1 單WR提交的代價(jià)每次ibv_post_send調(diào)用,本質(zhì)上是在軟件隊(duì)列(SQ)里插入一個(gè)WR,然后觸發(fā)一次Doorbell通知硬件“有活干了”。但這里有個(gè)隱藏成本:Doorbell的MMIO寫(xiě)入大約需要幾百納秒到幾微秒(取決于PCIe拓?fù)浜虲PU頻率),而WR本身的構(gòu)造和鏈表操作可能只有幾十納秒。如果每個(gè)WR都單獨(dú)提交,Doorbell開(kāi)銷(xiāo)會(huì)吃掉大部分性能。更坑的是,某些網(wǎng)卡(比如Mellanox ConnectX-