歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> IO-Polling的代碼分析

IO-Polling的代碼分析

日期:2017/3/1 12:14:26   编辑:關於Linux

在前一篇文章《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-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技術原理,並通過測試展示了其性能優勢。
Copyright © Linux教程網 All Rights Reserved