亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現linux塊設備IO棧淺析

發布時間:2021-12-18 17:55:46 來源:億速云 閱讀:219 作者:柒染 欄目:云計算

如何實現linux塊設備IO棧淺析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

linux塊設備IO棧淺析

塊存儲,簡單來說就是使用塊設備為系統提供存儲服務。塊存儲分多種類型,有單機塊存儲,網絡存儲(如NAS,SAN等),分布式塊存儲(目前主流的如AWS的EBS,青云的云硬盤,阿里云的云磁盤,網易云硬盤等)。通常塊存儲的表現形式就是一塊設備,用戶看到的就是類似于sda,sdb這樣的邏輯設備。本文主要介紹Linux塊設備,對Linux的塊設備I/O棧進行分析。

1.塊設備基本概念

塊設備將信息存儲在固定大小的塊中,每個塊都有自己的地址。對操作系統而言,塊設備是以字符設備的外觀展現的,例如/dev/sda,雖然對這種字符設備可以按照字節為單位訪問,但是實際上到塊設備上卻是以塊為單位(最小512byte,即一個扇區),這之間的轉換是由操作系統來實現的。
下面介紹幾個塊設備的基本概念:
1)扇區:磁盤盤片上的扇形區域,邏輯化數據,方便管理磁盤空間,是硬件設備數據傳送的基本單位,一般512Byte;
2)塊:塊是VFS和文件系統數據傳送的基本單位,必須是扇區的整數倍,格式化文件系統時,可以指定塊大小(一般512,1024,2048,4096字節);
3)段:一個內存頁或者內存頁中的一部分,包含一些相鄰磁盤扇區中的數據;磁盤的每個I/O操作就是在磁盤與一些RAM單元之間相互傳一些相鄰扇區的內容,大多數情況下,磁盤控制器采用DMA方式進行數據傳送。如果不同的段在RAM中相應的頁框是連續的并且在磁盤上相應的數據塊也是相鄰的,就可以在通用塊層合并它們,產生更大的內存區域,這個區域稱為物理段。
通常情況下,我們是通過文件系統來訪問塊設備,也可以直接使用裸設備,通過指定偏移和大小來讀寫裸設備。
常見的塊存儲設備就是物理磁盤,在Linux系統下,還提供基于其他塊設備之上的邏輯設備,如Device Mapper,軟RAID等。

2.塊設備I/O棧

2.1基本概念

介紹塊設備的I/O棧之前,我們先來了解一下塊I/O棧的幾個基本概念。
1)bio:bio是通用塊層I/O請求的數據結構,表示上層提交的I/O請求,一個bio包含多個page,這些page必須對應磁盤上一段連續的空間。由于文件在磁盤上并不連續存放,文件I/O提交到塊設備之前,極有可能被拆成多個bio結構;
2)request:表示塊設備驅動層I/O請求,經由I/O調度層轉換后的I/O請求,將會發到塊設備驅動層進行處理;
3)request_queue: 維護塊設備驅動層I/O請求的隊列,所有的request都插入到該隊列,每個磁盤設備都只有一個queue(多個分區也只有一個);
這3個結構的關系如下圖示:一個request_queue中包含多個request,每個request可能包含多個bio,請求的合并就是根據各種原則將多個bio加入到同一個requesst中。
如何實現linux塊設備IO棧淺析

2.2 請求處理方式

io-stack
如圖所示是塊設備的I/O棧,其中的紅色文字表示關鍵I/O路徑的函數。
為了描述I/O處理流程,先介紹一下Direct I/O和緩存I/O的區別:
1)Direct I/O繞過page cache,而緩存I/O都是寫到page cache里就表示寫請求完成,然后由文件系統的刷臟頁機制把數據刷到磁盤。因此,使用緩存I/O,掉電時有可能page cache里的臟數據未刷到磁盤上,造成數據丟失;
2)緩存I/O機制中,DMA方式可以將數據直接從磁盤讀到page cache中,或者將數據從page cache直接寫回到磁盤上,而不能直接在應用程序地址空間和磁盤之間進行數據傳輸,這樣的話,數據在傳輸過程中需要在應用程序地址空間和page cache之間進行多次數據拷貝操作,這些數據拷貝操作所帶來的CPU以及內存開銷是非常大的。而Direct I/O的優點就是通過減少操作系統內核緩沖區和應用程序地址空間的數據拷貝次數,降低了對文件讀取和寫入時所帶來的CPU的使用以及內存帶寬的占用,但是Direct I/O的讀操作不能從page cache中獲取數據,會直接從磁盤上讀取,帶來性能上的損失。一般Direct I/O與異步I/O結合起來使用提高性能。
3)Direct I/O要求用戶態的緩沖區對齊;
4)Direct I/O一般用于需要自己管理緩存的應用如數據庫系統。

對于I/O的讀寫流程,邏輯比較復雜,這里以寫流程簡單描述如下:
1)用戶調用系統調用write寫一個文件,會調到sys_write函數;
2) 經過VFS虛擬文件系統層,調用vfs_write, 如果是緩存寫方式,則寫入page cache,然后就返回,后續就是刷臟頁的流程;如果是Direct I/O的方式,就會走到do_blockdev_direct_IO的流程;
3)如果操作的設備是邏輯設備如LVM,MDRAID設備等,會進入到對應內核模塊的處理函數里進行一些處理,否則就直接構造bio請求,調用submit_bio往具體的塊設備下發請求,submit_bio函數通過generic_make_request轉發bio,generic_make_request是一個循環,其通過每個塊設備下注冊的q->make_request_fn函數與塊設備進行交互;
4)請求下發到底層的塊設備上,調用塊設備請求處理函數__make_request進行處理,在這個函數中就會調用blk_queue_bio,這個函數就是合并bio到request中,也就是I/O調度器的具體實現:如果幾個bio要讀寫的區域是連續的,就合并到一個request;否則就創建一個新的request,把自己掛到這個request下。合并bio請求也是有限度的,如果合并后的請求超過閾值(在/sys/block/xxx/queue/max_sectors_kb里設置),就不能再合并成一個request了,而會新分配一個request;
5)接下來的I/O操作就與具體的物理設備有關了,交由相應的塊設備驅動程序進行處理,這里以scsi設備為例說明,queue隊列的處理函數q->request_fn對應的scsi驅動的就是scsi_request_fn函數,將請求構造成scsi指令下發到scsi設備進行處理,處理完成后就會依次調用各層的回調函數進行完成狀態的一些處理,最后返回給上層用戶。

2.3 request-based和bio-based

在塊設備的I/O處理流程中,會涉及到兩種不同的處理方式:
1)request-based:這種處理方式下,會進行bio合并到request(即I/O調度合并)的流程,最后才把請求下發到物理設備。目前使用的物理盤都是request-based的設備;
2)bio-based:在邏輯設備自己定義的request處理函數make_request_fn里進行處理,然后調用generic_make_request下發到底層設備。ramdisk設備、大部分Device Mapper設備、virtio-blk都是bio-based;
下圖從Device Mapper的角度來說明request-based和bio-based處理流程的區別。
一個需要注意的地方是,Device mapper目前只有multipath插件是request-based的,其他的如linear,strip都是bio-based,所以如果是linear DM設備上創建的一個文件系統,對這個文件系統里的文件進行讀寫,采用緩存I/O時,即使刷臟頁時是連續的請求,在DM設備上也不會進行合并,只會到底層的設備(如/dev/sdb)上才進行合并。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桃园市| 嵊州市| 巢湖市| 开封市| 临清市| 南丰县| 荆门市| 漯河市| 大同市| 阿图什市| 霍城县| 大英县| 会昌县| 论坛| 西峡县| 晋城| 双牌县| 克拉玛依市| 临邑县| 临桂县| 册亨县| 玛纳斯县| 出国| 平和县| 乐平市| 大余县| 辽阳市| 融水| 安多县| 社会| 永寿县| 孝感市| 政和县| 河间市| 昭通市| 民县| 米脂县| 新干县| 尼木县| 东阳市| 天水市|