物理IO與邏輯IO

IO性能對於一個系統的影響是至關重要的。一個系統經過多項優化以後,瓶頸往往落在數據庫;而數據庫經過多種優化以後,瓶頸最終會落到IO。而IO性能的發展,明顯落後於CPU的發展。Memchached也好,NoSql也好,這些流行技術的背後都在直接或者間接地迴避IO瓶頸,從而提高系統性能。

 

IO系統的分層:

 

  1.   三層結構

上圖層次比較多,但總的就是三部分。磁盤(存儲)、VM(卷管理)和文件系統。專有名詞不好理解,打個比方說:磁盤就相當於一塊待用的空地;LVM相當於空地上的圍牆(把空地劃分成多個部分);文件系統則相當於每塊空地上建的樓房(決定了有多少房間、房屋編號如何,能容納多少人住);而房子裏面住的人,則相當於系統裏面存的數據。

 

  • 文件系統—數據如何存放?

 

對應了上圖的File System和Buffer Cache。

File System(文件系統):解決了空間管理的問題,即:數據如何存放、讀取。

Buffer Cache:解決數據緩衝的問題。對讀,進行cache,即:緩存經常要用到的數據;對寫,進行buffer,緩衝一定數據以後,一次性進行寫入。

 

  • VM—磁盤空間不足了怎麼辦?

 

對應上圖的Vol Mgmt。

VM其實跟IO沒有必然聯繫。他是處於文件系統和磁盤(存儲)中間的一層。VM屏蔽了底層磁盤對上層文件系統的影響。當沒有VM的時候,文件系統直接使用存儲上的地址空間,因此文件系統直接受限於物理硬盤,這時如果發生磁盤空間不足的情況,對應用而言將是一場噩夢,不得不新增硬盤,然後重新進行數據複製。而VM則可以實現動態擴展,而對文件系統沒有影響。另外,VM也可以把多個磁盤合併成一個磁盤,對文件系統呈現統一的地址空間,這個特性的殺傷力不言而喻。

  • 存儲—數據放在哪兒?如何訪問?如何提高IO速度?

 

對應上圖的Device Driver、IO Channel和Disk Device

數據最終會放在這裏,因此,效率、數據安全、容災是這裏需要考慮的問題。而提高存儲的性能,則可以直接提高物理IO的性能

 

    2. Logical IO vs Physical IO

 

邏輯IO是操作系統發起的IO,這個數據可能會放在磁盤上,也可能會放在內存(文件系統的Cache)裏。

物理IO是設備驅動發起的IO,這個數據最終會落在磁盤上。

      邏輯IO和物理IO不是一一對應的。

 

這部分的東西在網絡編程經常能看到,不過在所有IO處理中都是類似的。

IO請求的兩個階段

       等待資源階段:IO請求一般需要請求特殊的資源(如磁盤、RAM、文件),當資源被上一個使用者使用沒有被釋放時,IO請求就會被阻塞,直到能夠使用這個資源。

       使用資源階段:真正進行數據接收和發生。

       舉例說就是排隊服務。

 等待數據階段,IO分爲阻塞IO和非阻塞IO。

       阻塞IO:資源不可用時,IO請求一直阻塞,直到反饋結果(有數據或超時)。

       非阻塞IO:資源不可用時,IO請求離開返回,返回數據標識資源不可用

 使用資源階段,IO分爲同步IO和異步IO。

       同步IO:應用阻塞在發送或接收數據的狀態,直到數據成功傳輸或返回失敗。

       異步IO:應用發送或接收數據後立刻返回,數據寫入OS緩存,由OS完成數據發送或接收,並返回成功或失敗的信息給應用。

 

 

按照Unix的5個IO模型劃分

 

  • 阻塞IO
  • 非阻塞IO
  • IO複用
  • 信號驅動的IO
  • 異步IO

從性能上看,異步IO的性能無疑是最好的。

 

各種IO的特點

  • 阻塞IO:使用簡單,但隨之而來的問題就是會形成阻塞,需要獨立線程配合,而這些線程在大多數時候都是沒有進行運算的。Java的BIO使用這種方式,問題帶來的問題很明顯,一個Socket需要一個獨立的線程,因此,會造成線程膨脹。
  • 非阻塞IO:採用輪詢方式,不會形成線程的阻塞。Java的NIO使用這種方式,對比BIO的優勢很明顯,可以使用一個線程進行所有Socket的監聽(select)。大大減少了線程數。

 

  • 同步IO:同步IO保證一個IO操作結束之後纔會返回,因此同步IO效率會低一些,但是對應用來說,編程方式會簡單。Java的BIO和NIO都是使用這種方式進行數據處理。
  • 異步IO:由於異步IO請求只是寫入了緩存,從緩存到硬盤是否成功不可知,因此異步IO相當於把一個IO拆成了兩部分,一是發起請求,二是獲取處理結果。因此,對應用來說增加了複雜性。但是異步IO的性能是所有很好的,而且異步的思想貫穿了IT系統放放面面。

Oracle:

LOGICAL AND PHYSICAL I/O
LOGICAL I/O 是ORACLE 內核從DATABASE BUFFER CACHE 取得數據。如果內核不能從CACHE中得到數據它將請求操作系統取得數據。
PHYSICAL I/O 是ORACLE 內核從操作系統取得數據,因爲不能從DATABASE BUFFER CACHE中取得數據了。
請注意物理I/O不一定就是磁盤讀取,因爲操作系統內部也有BUFFER CACHE,但是從OARCLE觀點來看,這些讀取都是物理I/O 

其實實際上我們應該減少的是邏輯I/O而不是物理I/O 

1. 邏輯I/O需要LATCHES 或者序列化設備,這些東西嚴重的影響了系統的擴展性
2. 如果減少了邏輯I/O,物理I/O就會自然的執行因爲邏輯I/O如果不能成功的話,那麼物理I/O就會起作用
3. 物理I/O並不像想象的那麼花費時間,因爲大多數的情況下,操作系統的CACHE都能夠滿足要求。 

邏輯I/O有下面兩個部分組成
1. CONSISTENT GETS
2. DB BLOCK 或者CURRENT GETS

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