国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux后臺開發(fā)必知的io優(yōu)化知識匯總

2024-08-27 23:54:47
字體:
供稿:網(wǎng)友
  系統(tǒng)學(xué)習(xí)
 
  IO性能對于一個系統(tǒng)的影響是至關(guān)重要的。一個系統(tǒng)經(jīng)過多項優(yōu)化以后,瓶頸往往落在數(shù)據(jù)庫;而數(shù)據(jù)庫經(jīng)過多種優(yōu)化以后,瓶頸最終會落到IO。而IO性能的發(fā)展,明顯落后于CPU的發(fā)展。Memchached也好,NoSql也好,這些流行技術(shù)的背后都在直接或者間接地回避IO瓶頸,從而提高系統(tǒng)性能。
 
  IO系統(tǒng)的分層:
 
 
 
  上圖層次比較多,但總的就是三部分。磁盤(存儲)、VM(卷管理)和文件系統(tǒng)。專有名詞不好理解,打個比方說:磁盤就相當(dāng)于一塊待用的空地;LVM相當(dāng)于空地上的圍墻(把空地劃分成多個部分);文件系統(tǒng)則相當(dāng)于每塊空地上建的樓房(決定了有多少房間、房屋編號如何,能容納多少人住);而房子里面住的人,則相當(dāng)于系統(tǒng)里面存的數(shù)據(jù)。
 
  文件系統(tǒng)—數(shù)據(jù)如何存放?
 
  對應(yīng)了上圖的File System和Buffer Cache。
 
  File System(文件系統(tǒng)):解決了空間管理的問題,即:數(shù)據(jù)如何存放、讀取。
 
  Buffer Cache:解決數(shù)據(jù)緩沖的問題。對讀,進行cache,即:緩存經(jīng)常要用到的數(shù)據(jù);對寫,進行buffer,緩沖一定數(shù)據(jù)以后,一次性進行寫入。
 
  VM—磁盤空間不足了怎么辦?
 
  對應(yīng)上圖的Vol Mgmt。
 
  VM其實跟IO沒有必然聯(lián)系。他是處于文件系統(tǒng)和磁盤(存儲)中間的一層。VM屏蔽了底層磁盤對上層文件系統(tǒng)的影響。當(dāng)沒有VM的時候,文件系統(tǒng)直接使用存儲上的地址空間,因此文件系統(tǒng)直接受限于物理硬盤,這時如果發(fā)生磁盤空間不足的情況,對應(yīng)用而言將是一場噩夢,不得不新增硬盤,然后重新進行數(shù)據(jù)復(fù)制。而VM則可以實現(xiàn)動態(tài)擴展,而對文件系統(tǒng)沒有影響。另外,VM也可以把多個磁盤合并成一個磁盤,對文件系統(tǒng)呈現(xiàn)統(tǒng)一的地址空間,這個特性的殺傷力不言而喻。
 
  存儲—數(shù)據(jù)放在哪兒?如何訪問?如何提高IO速度?
 
  對應(yīng)上圖的Device Driver、IO Channel和Disk Device
 
  數(shù)據(jù)最終會放在這里,因此,效率、數(shù)據(jù)安全、容災(zāi)是這里需要考慮的問題。而提高存儲的性能,則可以直接提高物理IO的性能
 
  2. Logical IO vs Physical IO
 
  邏輯IO是操作系統(tǒng)發(fā)起的IO,這個數(shù)據(jù)可能會放在磁盤上,也可能會放在內(nèi)存(文件系統(tǒng)的Cache)里。
 
  物理IO是設(shè)備驅(qū)動發(fā)起的IO,這個數(shù)據(jù)最終會落在磁盤上。
 
  邏輯IO和物理IO不是一一對應(yīng)的。
 
  這部分的東西在網(wǎng)絡(luò)編程經(jīng)常能看到,不過在所有IO處理中都是類似的。
 
  IO請求的兩個階段:
 
  等待資源階段:IO請求一般需要請求特殊的資源(如磁盤、RAM、文件),當(dāng)資源被上一個使用者使用沒有被釋放時,IO請求就會被阻塞,直到能夠使用這個資源。
 
  使用資源階段:真正進行數(shù)據(jù)接收和發(fā)生。
 
  舉例說就是排隊和服務(wù)。
 
  在等待數(shù)據(jù)階段,IO分為阻塞IO和非阻塞IO。
 
  阻塞IO:資源不可用時,IO請求一直阻塞,直到反饋結(jié)果(有數(shù)據(jù)或超時)。
 
  非阻塞IO:資源不可用時,IO請求離開返回,返回數(shù)據(jù)標(biāo)識資源不可用
 
  在使用資源階段,IO分為同步IO和異步IO。
 
  同步IO:應(yīng)用阻塞在發(fā)送或接收數(shù)據(jù)的狀態(tài),直到數(shù)據(jù)成功傳輸或返回失敗。
 
  異步IO:應(yīng)用發(fā)送或接收數(shù)據(jù)后立刻返回,數(shù)據(jù)寫入OS緩存,由OS完成數(shù)據(jù)發(fā)送或接收,并返回成功或失敗的信息給應(yīng)用。
 
 
 
  按照Unix的5個IO模型劃分
 
  阻塞IO
 
  非阻塞IO
 
  IO復(fù)用
 
  信號驅(qū)動的IO
 
  異步IO
 
  從性能上看,異步IO的性能無疑是最好的。
 
  各種IO的特點
 
  阻塞IO:使用簡單,但隨之而來的問題就是會形成阻塞,需要獨立線程配合,而這些線程在大多數(shù)時候都是沒有進行運算的。
 
  非阻塞IO:采用輪詢方式,不會形成線程的阻塞。
 
  同步IO:同步IO保證一個IO操作結(jié)束之后才會返回,因此同步IO效率會低一些,但是對應(yīng)用來說,編程方式會簡單。
 
  異步IO:由于異步IO請求只是寫入了緩存,從緩存到硬盤是否成功不可知,因此異步IO相當(dāng)于把一個IO拆成了兩部分,一是發(fā)起請求,二是獲取處理結(jié)果。因此,對應(yīng)用來說增加了復(fù)雜性。但是異步IO的性能是所有很好的,而且異步的思想貫穿了IT系統(tǒng)放放面面。
 
  最重要的三個指標(biāo)
 
  IOPS
 
  IOPS,即每秒鐘處理的IO請求數(shù)量。IOPS是隨機訪問類型業(yè)務(wù)(OLTP類)很重要的一個參考指標(biāo)。
 
  一塊物理硬盤能提供多少IOPS?
 
  從磁盤上進行數(shù)據(jù)讀取時,比較重要的幾個時間是:尋址時間(找到數(shù)據(jù)塊的起始位置),旋轉(zhuǎn)時間(等待磁盤旋轉(zhuǎn)到數(shù)據(jù)塊的起始位置),傳輸時間(讀取數(shù)據(jù)的時間和返回的時間)。其中尋址時間是固定的(磁頭定位到數(shù)據(jù)的存儲的扇區(qū)即可),旋轉(zhuǎn)時間受磁盤轉(zhuǎn)速的影響,傳輸時間受數(shù)據(jù)量大小的影響和接口類型的影響(不用硬盤接口速度不同),但是在隨機訪問類業(yè)務(wù)中,他的時間也很少。因此,在硬盤接口相同的情況下,IOPS主要受限于尋址時間和傳輸時間。以一個15K的硬盤為例,尋址時間固定為4ms,傳輸時間為60s/15000*1/2=2ms,忽略傳輸時間。1000ms/6ms=167個IOPS。
 
  OS的一次IO請求對應(yīng)物理硬盤一個IO嗎?
 
  在沒有文件系統(tǒng)、沒有VM(卷管理)、沒有RAID、沒有存儲設(shè)備的情況下,這個答案還是成立的。但是當(dāng)這么多中間層加進去以后,這個答案就不是這樣了。物理硬盤提供的IO是有限的,也是整個IO系統(tǒng)存在瓶頸的最大根源。所以,如果一塊硬盤不能提供,那么多塊在一起并行處理,這不就行了嗎?確實是這樣的。可以看到,越是高端的存儲設(shè)備的cache越大,硬盤越多,一方面通過cache異步處理IO,另一方面通過盤數(shù)增加,盡可能把一個OS的IO分布到不同硬盤上,從而提高性能。文件系統(tǒng)則是在cache上會影響,而VM則可能是一個IO分布到多個不同設(shè)備上(Striping)。
 
  所以,一個OS的IO在經(jīng)過多個中間層以后,發(fā)生在物理磁盤上的IO是不確定的。可能是一對一個,也可能一個對應(yīng)多個。
 
  IOPS能算出來嗎?
 
  對單塊磁盤的IOPS的計算沒有沒問題,但是當(dāng)系統(tǒng)后面接的是一個存儲系統(tǒng)時、考慮不同讀寫比例,IOPS則很難計算,而需要根據(jù)實際情況進行測試。主要的因素有:存儲系統(tǒng)本身有自己的緩存。緩存大小直接影響IOPS,理論上說,緩存越大能cache的東西越多,在cache命中率保持的情況下,IOPS會越高。
 
  RAID級別。不同的RAID級別影響了物理IO的效率。
 
  讀寫混合比例。對讀操作,一般只要cache能足夠大,可以大大減少物理IO,而都在cache中進行;對寫操作,不論cache有多大,最終的寫還是會落到磁盤上。因此,100%寫的IOPS要越獄小于100%的讀的IOPS。同時,100%寫的IOPS大致等同于存儲設(shè)備能提供的物理的IOPS。
 
  一次IO請求數(shù)據(jù)量的多少。一次讀寫1KB和一次讀寫1MB,顯而易見,結(jié)果是完全不同的。
 
  當(dāng)時上面N多因素混合在一起以后,IOPS的值就變得撲朔迷離了。所以,一般需要通過實際應(yīng)用的測試才能獲得。
 
  IO Response Time
 
  即IO的響應(yīng)時間。IO響應(yīng)時間是從操作系統(tǒng)內(nèi)核發(fā)出一個IO請求到接收到IO響應(yīng)的時間。因此,IO Response time除了包括磁盤獲取數(shù)據(jù)的時間,還包括了操作系統(tǒng)以及在存儲系統(tǒng)內(nèi)部IO等待的時間。一般看,隨IOPS增加,因為IO出現(xiàn)等待,IO響應(yīng)時間也會隨之增加。對一個OLTP系統(tǒng),10ms以內(nèi)的響應(yīng)時間,是比較合理的。下面是一些IO性能示例:
 
  一個8K的IO會比一個64K的IO速度快,因為數(shù)據(jù)讀取的少些。
 
  一個64K的IO會比8個8K的IO速度快,因為前者只請求了一個IO而后者是8個IO。
 
  串行IO會比隨機IO快,因為串行IO相對隨機IO說,即便沒有Cache,串行IO在磁盤處理上也會少些操作。
 
  需要注意,IOPS與IO Response Time有著密切的聯(lián)系。一般情況下,IOPS增加,說明IO請求多了,IO Response Time會相應(yīng)增加。但是會出現(xiàn)IOPS一直增加,但是IO Response Time變得非常慢,超過20ms甚至幾十ms,這時候的IOPS雖然還在提高,但是意義已經(jīng)不大,因為整個IO系統(tǒng)的服務(wù)時間已經(jīng)不可取。
 
  Throughput
 
  為吞吐量。這個指標(biāo)衡量標(biāo)識了最大的數(shù)據(jù)傳輸量。如上說明,這個值在順序訪問或者大數(shù)據(jù)量訪問的情況下會比較重要。尤其在大數(shù)據(jù)量寫的時候。
 
  吞吐量不像IOPS影響因素很多,吞吐量一般受限于一些比較固定的因素,如:網(wǎng)絡(luò)帶寬、IO傳輸接口的帶寬、硬盤接口帶寬等。一般他的值就等于上面幾個地方中某一個的瓶頸。
 
  一些概念
 
  IO Chunk Size
 
  即單個IO操作請求數(shù)據(jù)的大小。一次IO操作是指從發(fā)出IO請求到返回數(shù)據(jù)的過程。IO Chunk Size與應(yīng)用或業(yè)務(wù)邏輯有著很密切的關(guān)系。比如像Oracle一類數(shù)據(jù)庫,由于其block size一般為8K,讀取、寫入時都此為單位,因此,8K為這個系統(tǒng)主要的IO Chunk Size。IO Chunk Size小,考驗的是IO系統(tǒng)的IOPS能力;IO Chunk Size大,考驗的時候IO系統(tǒng)的IO吞吐量。
 
  Queue Deep
 
  熟悉數(shù)據(jù)庫的人都知道,SQL是可以批量提交的,這樣可以大大提高操作效率。IO請求也是一樣,IO請求可以積累一定數(shù)據(jù),然后一次提交到存儲系統(tǒng),這樣一些相鄰的數(shù)據(jù)塊操作可以進行合并,減少物理IO數(shù)。而且Queue Deep如其名,就是設(shè)置一起提交的IO請求數(shù)量的。一般Queue Deep在IO驅(qū)動層面上進行配置。
 
  Queue Deep與IOPS有著密切關(guān)系。Queue Deep主要考慮批量提交IO請求,自然只有IOPS是瓶頸的時候才會有意義,如果IO都是大IO,磁盤已經(jīng)成瓶頸,Queue Deep意義也就不大了。一般來說,IOPS的峰值會隨著Queue Deep的增加而增加(不會非常顯著),Queue Deep一般小于256。
 
  隨機訪問(隨機IO)、順序訪問(順序IO)
 
  隨機訪問的特點是每次IO請求的數(shù)據(jù)在磁盤上的位置跨度很大(如:分布在不同的扇區(qū)),因此N個非常小的IO請求(如:1K),必須以N次IO請求才能獲取到相應(yīng)的數(shù)據(jù)。
 
  順序訪問的特點跟隨機訪問相反,它請求的數(shù)據(jù)在磁盤的位置是連續(xù)的。當(dāng)系統(tǒng)發(fā)起N個非常小的IO請求(如:1K)時,因為一次IO是有代價的,系統(tǒng)會取完整的一塊數(shù)據(jù)(如4K、8K),所以當(dāng)?shù)谝淮蜪O完成時,后續(xù)IO請求的數(shù)據(jù)可能已經(jīng)有了。這樣可以減少IO請求的次數(shù)。這也就是所謂的預(yù)取。
 
  隨機訪問和順序訪問同樣是有應(yīng)用決定的。如數(shù)據(jù)庫、小文件的存儲的業(yè)務(wù),大多是隨機IO。而視頻類業(yè)務(wù)、大文件存取,則大多為順序IO。
 
  選取合理的觀察指標(biāo):
 
  以上各指標(biāo)中,不用的應(yīng)用場景需要觀察不同的指標(biāo),因為應(yīng)用場景不同,有些指標(biāo)甚至是沒有意義的。
 
  隨機訪問和IOPS: 在隨機訪問場景下,IOPS往往會到達瓶頸,而這個時候去觀察Throughput,則往往遠低于理論值。
 
  順序訪問和Throughput:在順序訪問的場景下,Throughput往往會達到瓶頸(磁盤限制或者帶寬),而這時候去觀察IOPS,往往很小。
 
 
 
 
 
  文件系統(tǒng)各有不同,其最主要的目標(biāo)就是解決磁盤空間的管理問題,同時提供高效性、安全性。如果在分布式環(huán)境下,則有相應(yīng)的分布式文件系統(tǒng)。Linux上有ext系列,Windows上有Fat和NTFS。如圖為一個linux下文件系統(tǒng)的結(jié)構(gòu)。
 
  其中VFS(Virtual File System)是Linux Kernel文件系統(tǒng)的一個模塊,簡單看就是一個Adapter,對下屏蔽了下層不同文件系統(tǒng)之間的差異,對上為操作系統(tǒng)提供了統(tǒng)一的接口.
 
  中間部分為各個不同文件系統(tǒng)的實現(xiàn)。
 
  再往下是Buffer Cache和Driver。
 
 
 
  文件系統(tǒng)的結(jié)構(gòu)
 
  各種文件系統(tǒng)實現(xiàn)方式不同,因此性能、管理性、可靠性等也有所不同。下面為Linux Ext2(Ext3)的一個大致文件系統(tǒng)的結(jié)構(gòu)。
 
 
 
  Boot Block存放了引導(dǎo)程序。
 
  Super Block存放了整個文件系統(tǒng)的一些全局參數(shù),如:卷名、狀態(tài)、塊大小、塊總數(shù)。他在文件系統(tǒng)被mount時讀入內(nèi)存,在umount時被釋放。
 
 
 
  上圖描述了Ext2文件系統(tǒng)中很重要的三個數(shù)據(jù)結(jié)構(gòu)和他們之間的關(guān)系。
 
  Inode:Inode是文件系統(tǒng)中最重要的一個結(jié)構(gòu)。如圖,他里面記錄了文件相關(guān)的所有信息,也就是我們常說的meta信息。包括:文件類型、權(quán)限、所有者、大小、atime等。Inode里面也保存了指向?qū)嶋H文件內(nèi)容信息的索引。其中這種索引分幾類:
 
  直接索引:直接指向?qū)嶋H內(nèi)容信息,公有12個。因此如果,一個文件系統(tǒng)block size為1k,那么直接索引到的內(nèi)容最大為12k
 
  間接索引
 
  兩級間接索引
 
  三級間接索引
 
  如圖:
 
 
 
  Directory代表了文件系統(tǒng)中的目錄,包括了當(dāng)前目錄中的所有Inode信息。其中每行只有兩個信息,一個是文件名,一個是其對應(yīng)的Inode。需要注意,Directory不是文件系統(tǒng)中的一個特殊結(jié)構(gòu),他實際上也是一個文件,有自己的Inode,而它的文件內(nèi)容信息里面,包括了上面看到的那些文件名和Inode的對應(yīng)關(guān)系。如下圖:
 
 
 
  Data Block即存放文件的時間內(nèi)容塊。Data Block大小必須為磁盤的數(shù)據(jù)塊大小的整數(shù)倍,磁盤一般為512字節(jié),因此Data Block一般為1K、2K、4K。
 
  Buffer Cache
 
  Buffer & Cache
 
  雖然Buffer和Cache放在一起了,但是在實際過程中Buffer和Cache是完全不同了。Buffer一般對于寫而言,也叫“緩沖區(qū)”,緩沖使得多個小的數(shù)據(jù)塊能夠合并成一個大數(shù)據(jù)塊,一次性寫入;Cache一般對于讀而且,也叫“緩存”,避免頻繁的磁盤讀取。如圖為Linux的free命令,其中也是把Buffer和Cache進行區(qū)分,這兩部分都算在了free的內(nèi)存。
 
 
 
  Buffer Cache
 
  Buffer Cache中的緩存,本質(zhì)與所有的緩存都是一樣,數(shù)據(jù)結(jié)構(gòu)也是類似,下圖為VxSF的一個Buffer Cache結(jié)構(gòu)。
 
 
 
  這個數(shù)據(jù)結(jié)構(gòu)與memcached和Oracle SGA的buffer何等相似。左側(cè)的hash chain完成數(shù)據(jù)塊的尋址,上方的的鏈表記錄了數(shù)據(jù)塊的狀態(tài)。
 
  Buffer vs Direct I/O
 
  文件系統(tǒng)的Buffer和Cache在某些情況下確實提高了速度,但是反之也會帶來一些負面影響。一方面文件系統(tǒng)增加了一個中間層,另外一方面,當(dāng)Cache使用不當(dāng)、配置不好或者有些業(yè)務(wù)無法獲取cache帶來的好處時,cache則成為了一種負擔(dān)。
 
  適合Cache的業(yè)務(wù):串行的大數(shù)據(jù)量業(yè)務(wù),如:NFS、FTP。
 
  不適合Cache的業(yè)務(wù):隨機IO的業(yè)務(wù)。如:Oracle,小文件讀取。
 
  塊設(shè)備、字符設(shè)備、裸設(shè)備
 
  這幾個東西看得很暈,找了一些資料也沒有找到很準(zhǔn)確的說明。
 
  從硬件設(shè)備的角度來看,
 
  塊設(shè)備就是以塊(比如磁盤扇區(qū))為單位收發(fā)數(shù)據(jù)的設(shè)備,它們支持緩沖和隨機訪問(不必順序讀取塊,而是可以在任何時候訪問任何塊)等特性。塊設(shè)備包括硬盤、CD-ROM 和 RAM 盤。

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳山县| 灵寿县| 拜城县| 共和县| 习水县| 建始县| 明水县| 利川市| 佛坪县| 泊头市| 和林格尔县| 阿拉尔市| 龙泉市| 洛南县| 田阳县| 宜都市| 陇西县| 玉林市| 卓资县| 夹江县| 巴彦淖尔市| 开原市| 大田县| 浦城县| 射阳县| 广丰县| 沙雅县| 时尚| 工布江达县| 新建县| 湘潭县| 辉县市| 上饶市| 牡丹江市| 文山县| 隆子县| 阜新| 资溪县| 大同市| 博客| 酒泉市|