今年的Xen summit裏,intel介紹了io性能調優方面的兩個點,一個是multi page io ring, 更大的max_segment,另一個per-block lock。
裏面說的vm裏面的io 性能損耗比原生的差了26%, 通過第一個點的調優,能夠提高17%,加上第二點的優化,能提高到24%,這樣的話,vm裏面的io性能幾乎認爲沒損耗。
ctrix在今年3月份的時候給了個patch,實現了multi page io ring,這個patch主要的工作是對blkback, blkfront的修改,並沒有包括下游路勁的修改。
先來說下io ring在vm io這塊的作用和主要代碼邏輯
VM的blkfront裏面,會去申請一個shared io ring, 目前是一個page size, 通過grant_table做授權,告訴host,怎樣拿到這個shared io ring.
host的blkback會去根據這個讀到的grant_table授權項去做映射,把io ring映射到host addr。
io ring的結構包括了req, rsp, 簡單的生產者消費者模式,blkfront是req的生產者,rsp的消費者,blkback是req的消費者,rsp的生產者,分別有着各自的id,來記錄當前的生產消費記錄。
blkfront通過往shared io ring裏面去扔req, blkback從裏面拿出req, 經過處理交給下游。這就是我們通常看到的io ring, citrix的patch也是針對這部分邏輯進行的修改。
在下游,還有另外一個io ring存在,做着類似的工作, 那就是blktap -> tapdisk2
tapdisk2通過打開一個字符設備blktap,並且mmap到字符設備上,從而獲得了blktap設備裏面創建的shared io ring的地址
所以如果要想改實現multi page io ring, 除了citrix的patch,還需要一個blktap和tapdisk2的patch
看了citrix patch,會發現使用了multi page io ring,就需要使用到多個授權項 ring_ref[], 在ring_ref的消息通知上會有點小小的麻煩。
後面先把citrix的patch做backport, 並完成blktap,tapdisk2的patch,再考慮下inel提出的那幾點改進如更大的max_segment