linux I/O棧 預習(下)

二、預習下

由於我們在上一篇文章中,描述了比較高層的I/O stack的結構,接下來我們來講講底層的結構。
linux I/O棧 預習(下)

這一節,可能絕大多數的人在實際的工作中,並不是涉及到開發,但也是linux I/O中非常重要的。
那我們就一一列舉,來講講它們都是什麼。
1、Block Layer,在很多年前,我在看SCSI子系統的時候,我那時候就不是太確立Block Layer到底是什麼,因爲這其中要理解block device、BIO和一系列的request_fn。所以理解block layer應該不是什麼簡單的事情,因爲它是一個很抽象的概念,更不能一言能概括,但是我們能夠從圖上看出一點,就是經過block layer的多個bio,最終都變成了有序的request,那麼我們應該能看出來它可以排序合併bio,並且能夠make request from bios。

2、I/O scheduler和blkmq,因爲磁盤訪問數據尋道和旋轉延遲所導致出磁盤訪問的一個特性,linux爲磁盤設計了特殊的map bios to requests的方式,就叫做I/O scheduler,從這個function的結構來看,一個request從init到build之間的時差是用來map bios的,這個時差對於I/O scheduler是不可控的,linux i/o stack爲此提供了一個專屬的方法,被叫做blk_plug和blk_unplug,即從上層來派發bios的時候,上層是知道某些bios是需要並且可以做合併和排序的,那麼就需要上層來plug這個bios seq,由unplug來觸發build request,這個過程通常需要block device之間或和LIO/VFS配合實現。
blkmq:是linux爲那些不需要做I/O scheduler的設備所設計的新的隊列模型,具有高併發的特性,適用於新型的nvme ssd等具有高hardware queue depth的設備,由於幾乎不再依賴blk_plug等增加latency的處理流程,這種I/O隊列模型的性能會非常高。

3、scsi mid layer:scsi子系統一直是支持存儲協議的big子系統,就連其內部也分爲high layer、mid layer和low layer。這三層的特點就好像殖民地時期的殖民地結構,其中high layer扮演者那些殖民者,他們對當地並不熟悉,需要在當地建立傀儡政權,來保證其統治地位,也就是scsi子系統中的high layer用來實現的scsi disk,scsi tape,scsi cdrom,這種scsi高級特性的設備描述,他們是不管當地是什麼情況,用同一的方式來發布scsi cmd。爲了保證scsi high layer的命令得以執行,那麼scsi subsystem中的傀儡政權,也就是scsi結構網絡層,scsi mid layer構建了一個等級森嚴的拓撲方式:host:channel:target:lun,而且必須要所有的low layer都必須遵循這種拓撲方式,雖然說這種方式很殘忍,甚至來說在一個host被註冊的時候,它直接能和low layer通信的方式也顯得很露骨(比如:slave_configure等),但是還有事一批的喜歡當slave的公司做出了無數的scsi low layer的產品,這其中比較著名的是:mpt3sas(lsi),pm8001(pmc),qla2xxx(qlogic)等吧,這些商品一般就是大家比較熟知的sas hba,raid card,fc hba等,所以沒有諂媚就沒有暴力,他們記住做硬件產品一定要抱個和scsi這樣粗的大腿,做出來就不愁賣。但是這些年scsi也沒有那麼好過了,因爲這充滿等級森嚴的scsi mid layer的存儲I/O,必須要求所有的scsi deivce去dispatch cmd都必須是一個接口到low layer,導致了單個scsi host沒辦法發揮新型介質nand flash的所有性能,讓新的協議nvme大行其道,好比共產主義給殖民地同志們帶來的希望,大家紛紛要突破scsi host的牢籠,那麼scsi的命運如何,未來到底會不會被nvme所取代,我們拭目以待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章