IO-Polling的程式碼分析
在前一篇文章《IO-Polling實現分析與效能評測》中提到了IO-Polling與中斷的原理區別,並通過兩種模式下NVMe SSD的效能測試對兩者進行了對比。這篇文章將深入到IO-Polling的代碼層面,對這一IO處理模式進行一個解讀。
IO-Polling模式已經加入了linux 4.4的核心,並已有多個成員組在測試IO-Polling對快速裝置的效能影響。目前的IO-Polling僅支援direct-IO的sync模式讀寫操作,後期將加入對libaio的IO-Polling的支援,詳細見git log資訊。
IO-Polling的程式碼分析
本文基於linux核心4.4版本,簡單分析支援IO-Polling模式核心塊裝置層,檔案系統以及底層NVMe驅動所修改修改的大致內容。4.4版linux核心的IO-Polling共修改33個檔案,詳細修改列表見:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20160331/20160331090346290.png" alt="\">
在block/blk-core.c中主要新增blk-poll函數,用以支援polling模式。在blk-poll函數中,如果底層驅動不支援mq或者mq中不支援polling模式,則會返回上層,採用中斷模式。如果底層驅動支援mq的polling模式,則調用底層驅動的poll函數進行IO處理,詳細函數內容見。
在block/blk-mq-sysfs.c以及block/blk-sysfs.c檔案中,增加了sys檔案系統對io-poll參數的支援
在block/blk-mq.c檔案中,修改各個函數增加對poll邏輯的處理。
除以上對通用塊裝置層的修改,各個IO裝置要支援polling模式,還需要對各自的裝置進行部分修改。以NVMe 裝置為例,NVMe 驅動源碼中增加nvme_poll函數,在註冊是掛載到block層,當上層以polling模式訪問NVMe 裝置時,驅動將調用nvme_poll函數,而不再走中斷模式。NVMe 驅動代碼修改大致如下:
而在檔案系統層fs/direct-io.c中,direct-io的有關函數的已修改支援polling,實際測試中polling只有在direct_io中才起作用,buffer_io模式下,IO模式依然採用中斷方式。前一篇文章中僅提供了裸裝置polling模式效能資料,對於檔案系統的polling模式將在後期對此做詳細分析。
結語
上層應用業務雖然大部分是非同步模式的,但對於基於同步IO,並且對延遲非常敏感小部分關鍵業務而言,IO-Polling所帶來的延遲收益也是有巨大協助的。同時,linux核心也在不斷進化過程中,非同步模式Polling也將加入。隨著高速存放裝置的發展,IO-Polling的工作模式對延遲敏感型業務將發揮更大的作用。
本文作者Luna是Memblaze產品工程師,主要的研究方向包括KVM、Virtio等虛擬化技術,最擅長的是PCIe SSD在KVM的虛擬化情境中的最佳化。Luna之前的一篇文章《QEMU-KVM I/O效能最佳化之Virtio-blk-data-plane》詳細分析了Virtio-blk-data-plane技術原理,並通過測試展示了其效能優勢。