在前一篇文章《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.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20160331/20160331090346290.png" alt="\">
在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 驅動代碼修改大致如下:
結語
上層應用業務雖然大部分是異步模式的,但對於基於同步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技術原理,並通過測試展示了其性能優勢。