根筆者最近在SPDK優化上的工做,下面總結了一些能夠提高性能的優化點。緩存
對於NVME SSD和RDMA這種基於completion queue/submittion queue 硬件機制的設備,就應該根據硬件隊列執行的特性,始終保持隊列中有物理隊列深度這麼多的請求在跑,這樣纔可能榨乾硬件性能。數據結構
在IO路徑上若是你須要緩存一段請求,而且只只須要操做它的頭和尾。若是是基於C++ 模板,切記:不要使用雙向鏈表,而應該用queue。併發
大廠的不少基礎庫中,指望的淺複製,在有些狀況下可能包括拷貝操做,針對這個須要仔細篩查。特別是在IO路徑上不一樣的函數參數傳遞
的過程當中,儘可能用指針傳遞。ide
IO路徑上頻繁的內存分配會影響性能,特別是對 spdk 提供的內存分配函數。一種思路是預估請求的多少,預先分配好。函數
讀寫程序跑起來的時候,能夠用perf 跟蹤並記錄到熱點函數,而後分析
是否符合預期,對於不符合預期的想辦法把它的時間佔比降下來。筆者經過perf 發現,對一個std::map結構進行判空比較佔據了超過5%的比例,後來經過把這個判斷放到其餘條件以後,性能獲得必定改善。性能
IO路徑上儘可能避免鎖,由於:
對於自旋鎖:它很耗CPU;對於互斥鎖:它又極可能致使頻繁的上下文切換。進而總體上影響性能。優化
把IO路徑上乘、除、模等須要比較多CPU週期的操做,改形成位的操做;把冗餘的日誌和睡眠減小乃至都去掉,也會對性能有提高。線程
這個是常見的公共的優化方法,常見於計算密集型的應用。指針
經過綜合上面的措施,筆者把4K粒度的讀寫從2~3萬IOS優化到45萬左右IOPS。固然在多個線程併發、隊列深度不一樣的狀況下,是否還能保持如此高的性能還有待驗證。日誌