IO效能對於一個系統的影響是至關重要的。一個系統經過多項最佳化以後,瓶頸往往落在資料庫;而資料庫經過多種最佳化以後,瓶頸最終會落到IO。而IO效能的發展,明顯落後於CPU的發展。Memchached也好,NoSql也好,這些流行技術的背後都在直接或者間接地迴避IO瓶頸,從而提高系統效能。 IO系統的分層:
層次比較多,但總的就是三部分。磁碟(儲存)、VM(卷管理)和檔案系統。專有名詞不好理解,打個比方說:磁碟就相當於一塊待用的空地;LVM相當於空地上的圍牆(把空地劃分成多個部分);檔案系統則相當於每塊空地上建的樓房(決定了有多少房間、房屋編號如何,能容納多少人住);而房子裡面住的人,則相當於系統裡面存的資料。
對應了的FileSystem和Buffer Cache。 FileSystem(檔案系統):解決了空間管理的問題,即:資料如何存放、讀取。 BufferCache:解決資料緩衝的問題。對讀,進行cache,即:緩衝經常要用到的資料;對寫,進行buffer,緩衝一定資料以後,一次性進行寫入。
對應的Vol Mgmt。 VM其實跟IO沒有必然聯絡。他是處於檔案系統和磁碟(儲存)中間的一層。VM屏蔽了底層磁碟對上層檔案系統的影響。當沒有VM的時候,檔案系統直接使用儲存上的地址空間,因此檔案系統直接受限於物理硬碟,這時如果發生磁碟空間不足的情況,對應用而言將是一場噩夢,不得不新增硬碟,然後重新進行資料複製。而VM則可以實現動態擴充,而對檔案系統沒有影響。另外,VM也可以把多個磁碟合并成一個磁碟,對檔案系統呈現統一的地址空間,這個特性的殺傷力不言而喻。
對應的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系統放放面面。
|