1、概述 node
IO 系統的分層:linux
上圖層次比較多,但總的就是三部分。磁盤 (存儲)、 VM (volumes management 卷管理)和文件系統 。專有名詞很差理解,打個比方說:磁盤就至關於一塊待用的空地; LVM 至關於空地上的圍牆(把空地劃分紅多個部分);文件系統則至關於每塊空地上建的樓房(決定了有多少房數據庫
間、房屋編號如何,能容納多少人住);而房子裏面住的人,則至關於系統裏面存的數據。緩存
1.一、文件系統—數據如何存放?安全
對應了上圖的 File System 和 Buffer Cache 。網絡
File System (文件系統):解決了空間管理的問題 ,即:數據如何存放、讀取。數據結構
Buffer Cache :解決數據緩衝的問題。對讀,進行 cache ,即:緩存常常要用到的數據;對寫,進行buffer ,緩衝必定數據之後,一次性進行寫入。異步
1.二、VM —磁盤空間不足了怎麼辦?memcached
對應上圖的 Vol Mgmt 。性能
VM 其實跟 IO 沒有必然聯繫。他是處於文件系統和磁盤(存儲)中間的一層。 VM 屏蔽了底層磁盤對上層文件系統的影響 。當沒有 VM 的時候,文件系統直接使用存儲上的地址空間,所以文件系統直接受限於物理硬盤,這時若是發生磁盤空間不足的狀況,對應用而言將是一場噩夢,不得不
新增硬盤,而後從新進行數據複製。而 VM 則能夠實現動態擴展,而對文件系統沒有影響。另外, VM 也能夠把多個磁盤合併成一個磁盤,對文件系統呈現統一的地址空間,這個特性的殺傷力不言而喻。
1.三、存儲—數據放在哪兒?如何訪問?如何提升IO 速度?
對應上圖的 Device Driver 、 IO Channel 和 Disk Device
數據最終會放在這裏,所以,效率、數據安全、容災是這裏須要考慮的問題。而提升存儲的性能,則能夠直接提升物理 IO 的性能
邏輯 IO 是操做系統發起的 IO ,這個數據可能會放在磁盤上,也可能會放在內存(文件系統的 Cache )裏。
物理 IO 是設備驅動發起的 IO ,這個數據最終會落在磁盤上。
邏輯 IO 和物理 IO 不是一一對應的。
異步IO :因爲異步 IO 請求只是寫入了緩存,從緩存到硬盤是否成功不可知,所以異步 IO 至關於把一個IO 拆成了兩部分,一是發起請求,二是獲取處理結果。所以,對應用來講增長了複雜性。可是異步 IO 的性能是全部很好的,並且異步的思想貫穿了 IT 系統方方面面。
一、IOPS ,即每秒鐘處理的 IO 請求數量。 IOPS 是隨機訪問類型業務( OLTP 類 )很重要的一個參考指標;
一塊物理硬盤能提供多少 IOPS ?
從磁盤上進行數據讀取時,比較重要的幾個時間是:尋址時間 (找到數據塊的起始位置),旋轉時間 (等待磁盤旋轉到數據塊的起始位置),傳輸時間 (讀取數據的時間和返回的時間)。其中尋址時間是固定的(磁頭定位到數據的存儲的扇區便可),旋轉時間受磁盤轉速的影響,傳輸時間受
數據量大小的影響和接口類型的影響(不用硬盤接口速度不一樣),可是在隨機訪問類業務中,他的時間也不多。所以,在硬盤接口相同的狀況下, IOPS主要受限於尋址時間和傳輸時間。
OS 的一次 IO 請求對應物理硬盤一個 IO嗎?
在沒有文件系統、沒有VM(卷管理)、沒有RAID,沒有存儲設備的狀況下,這個答案仍是成立的。可是當這麼多中間層加進去之後,這個答案就不是這樣了。物理硬盤提供的 IO 是有限的,也是整個 IO 系統存在瓶頸的最大根源。因此,若是一塊硬盤不能提供,那麼多塊在一塊兒並行處理,
這不就好了嗎?確實是這樣的。能夠看到,越是高端的存儲設備的 cache 越大,硬盤越多,一方面經過cache 異步處理IO ,另外一方面經過盤數增長,儘量把一個OS 的IO 分佈到不一樣硬盤上,從而提升性能 。文件系統則是在 cache 上會影響,而 VM則多是一個 IO 分佈到多個不一樣設備上( Striping )。
因此,一個 OS 的IO 在通過多箇中間層之後,發生在物理磁盤上的IO 是不肯定的。多是一對一個,也可能一個對應多個 。
IOPS 能算出來嗎?
對單塊磁盤的 IOPS 的計算沒有沒問題,可是當系統後面接的是一個存儲系統時、考慮不一樣讀寫比例, IOPS 則很難計算,而須要根據實際狀況進行測試。主要的因素有:
當時上面 N 多因素混合在一塊兒之後, IOPS 的值就變得撲朔迷離了。因此,通常須要經過實際應用的測試才能得到。
二、IO Response Time
即 IO 的響應時間。 IO 響應時間是從操做系統內核發出一個 IO 請求到接收到 IO 響應的時間。所以, IO Response time 除了包括磁盤獲取數據的時間,還包括了操做系統以及在存儲系統內部 IO 等待的時間。通常看,隨 IOPS 增長,由於 IO 出現等待, IO 響應時間也會隨之增長。對一
個 OLTP 系統, 10ms 之內的響應時間,是比較合理的。下面是一些 IO 性能示例:
須要注意, IOPS 與 IO Response Time 有着密切的聯繫。通常狀況下, IOPS 增長,說明 IO 請求多了, IO Response Time 會相應增長。可是會出現 IOPS 一直增長,可是 IO Response Time 變得很是慢,超過 20ms 甚至幾十 ms ,這時候的 IOPS 雖然還在提升,可是意義已經
不大,由於整個 IO 系統的服務時間已經不可取。
三、Throughput 即吞吐量
這個指標衡量標識了最大的數據傳輸量。如上說明,這個值在順序訪問或者大數據量訪問的狀況下會比較重要 。尤爲在大數據量寫的時候。
吞吐量不像 IOPS 影響因素不少,吞吐量通常受限於一些比較固定的因素,如:網絡帶寬、 IO 傳輸接口的帶寬、硬盤接口帶寬等。通常他的值就等於上面幾個地方中某一個的瓶頸。
3、IO中的概念:
IO Chunk Size
即單個 IO 操做請求數據的大小。一次 IO 操做是指從發出 IO 請求到返回數據的過程。 IO Chunk Size 與應用或業務邏輯有着很密切的關係。好比像 Oracle 一類數據庫,因爲其 block size 通常爲 8K ,讀取、寫入時都此爲單位,所以, 8K 爲這個系統主要的 IO Chunk Size 。
IO Chunk Size小,考驗的是 IO 系統的 IOPS 能力; IO Chunk Size 大,考驗的時候 IO 系統的 IO 吞吐量。
Queue Deep
熟悉數據庫的人都知道, SQL 是能夠批量提交的,這樣能夠大大提升操做效率。 IO 請求也是同樣, IO 請求能夠積累必定數據,而後一次提交到存儲系統,這樣一些相鄰的數據塊操做能夠進行合併,減小物理 IO 數。並且Queue Deep 如其名,就是設置一塊兒提交的 IO 請求數量的。
通常 Queue Deep 在 IO 驅動層面上進行配置。Queue Deep 與 IOPS 有着密切關係。 Queue Deep 主要考慮批量提交 IO 請求,天然只有 IOPS 是瓶頸的時候纔會有意義,若是 IO 都是大 IO ,磁盤已經成瓶頸, Queue Deep 意義也就不大了。通常來講, IOPS 的峯值會隨着 Queue
Deep 的增長而增長 ( 不會很是顯著 ) , Queue Deep 通常小於 256 。
隨機訪問(隨機IO )、順序訪問(順序IO )
隨機訪問的特色是每次 IO 請求的數據在磁盤上的位置跨度很大 (如:分佈在不一樣的扇區),所以 N個 很是小的 IO 請求(如: 1K ),必須以 N 次 IO 請求才能獲取到相應的數據。
順序訪問的特色跟隨機訪問相反,它請求的數據在磁盤的位置是連續的 。當系統發起 N個 很是小的 IO 請求(如: 1K )時,由於一次 IO 是有代價的,系統會取完整的一塊數據(如 4K 、 8K ),因此當第一次 IO 完成時,後續 IO 請求的數據可能已經有了。這樣能夠減小 IO 請求的次數。
這也就是所謂的預取。
隨機訪問和順序訪問一樣是有應用決定的。如數據庫、小文件的存儲的業務,大可能是隨機 IO 。而視頻類業務、大文件存取,則大多爲順序 IO 。
linux 下文件系統的結構,其中 VFS ( Virtual File System )是 Linux Kernel 文件系統的一個模塊,簡單看就是一個 Adapter ,對下屏蔽了下層不一樣文件系統之間的差別,對上爲操做系統提供了統一的接口 .中間部分爲各個不一樣文件系統的實現。再往下是 Buffer Cache 和 Driver 。
文件系統的結構
各類文件系統實現方式不一樣,所以性能、管理性、可靠性等也有所不一樣。下面爲 Linux Ext2 ( Ext3 )的一個大體文件系統的結構。
Boot Block 存放了引導程序;
super Block存放了整個文件系統的一些全局參數,如:卷名、狀態、塊大小、塊總數等,在mount時候,這些信息被載入內存,umount時被釋放;
上圖描述了 Ext2 文件系統中很重要的三個數據結構和他們之間的關係。
Inode : Inode 是文件系統中最重要的一個結構。如圖,他裏面記錄了文件相關的全部信息,也就是咱們常說的 meta 信息。包括:文件類型、權限、全部者、大小、 atime 等:
Directory 表明了文件系統中的目錄,包括了當前目錄中的全部 Inode 信息。其中每行只有兩個信息,一個是文件名,一個是其對應的 Inode 。須要注意, Directory 不是文件系統中的一個特殊結構,他實際上也是一個文件,有本身的 Inode ,而它的文件內容信息裏面,包括了上面看到的
那些文件名和 Inode 的對應關係。以下圖:
Data Block 即存放文件的時間內容塊。 Data Block 大小必須爲磁盤的數據塊大小的整數倍,磁盤通常爲 512 字節,所以Data Block 通常爲 1K 、 2K 、 4K 。
雖然 Buffer 和 Cache 放在一塊兒了,可是在實際過程當中 Buffer 和 Cache 是徹底不一樣了。 Buffer 通常對於寫而言,也叫「緩衝區」,緩衝使得多個小的數據塊可以合併成一個大數據塊,一次性寫入; Cache 通常對於讀並且,也叫「緩存」,避免頻繁的磁盤讀取。如圖爲 Linux 的 free 命令,
其中也是把 Buffer 和 Cache 進行區分,這兩部分都算在了 free 的內存。
Buffer Cache
Buffer Cache 中的緩存,本質與全部的緩存都是同樣,數據結構也是相似,下圖爲 VxSF 的一個 Buffer Cache 結構。
這個數據結構與 memcached 和 Oracle SGA 的 buffer 何等類似。左側的 hash chain 完成數據塊的尋址,上方的的鏈表記錄了數據塊的狀態。