• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Linux IO系統(tǒng)的架構(gòu)圖


             

            一.設(shè)備-------- 影響磁盤性能的因素

            硬盤的轉(zhuǎn)速影響硬盤的整體性能。一般情況下轉(zhuǎn)速越大,性能會(huì)越好。

            硬盤的性能因素主要包括兩個(gè):1.平均訪問時(shí)間2傳輸速率。

             

            平均訪問時(shí)間包括兩方面因素:

            平均尋道時(shí)間(Average Seek Time)是指硬盤的磁頭移動(dòng)到盤面指定磁道所需的時(shí)間。一般在3ms至15ms之間。

            平均旋轉(zhuǎn)等待時(shí)間(Latency)是指磁頭已處于要訪問的磁道,等待所要訪問的扇區(qū)旋轉(zhuǎn)至磁頭下方的時(shí)間。一般在2ms至6ms之間。

             

            傳輸速率(Data Transfer Rate) 硬盤的數(shù)據(jù)傳輸率是指硬盤讀寫數(shù)據(jù)的速度,單位為兆字節(jié)每秒(MB/s)。磁盤每秒能傳輸80M~320M字節(jié)。

             

            傳輸速率包括內(nèi)部傳輸速率和外部傳輸速率。

            內(nèi)部傳輸率(Internal Transfer Rate) 也稱為持續(xù)傳輸率(Sustained Transfer Rate),它反映了硬盤緩沖區(qū)未用時(shí)的性能。內(nèi)部傳輸率主要依賴于硬盤的旋轉(zhuǎn)速度。

            外部傳輸率(External Transfer Rate)也稱為突發(fā)數(shù)據(jù)傳輸率Burst Data Transfer Rate)或接口傳輸率,它標(biāo)稱的是系統(tǒng)總線與硬盤緩沖區(qū)之間的數(shù)據(jù)傳輸率,外部數(shù)據(jù)傳輸率與硬盤接口類型硬盤緩存的大小有關(guān)。STAT2 的傳輸速率在300MB/s級(jí)別。

             

            因此在硬件級(jí)上,提高磁盤性能的關(guān)鍵主要是降低平均訪問時(shí)間。

            二.設(shè)備驅(qū)動(dòng)

            內(nèi)存到硬盤的傳輸方式:poll,中斷,DMA

             

            DMA:當(dāng) CPU 初始化這個(gè)傳輸動(dòng)作,傳輸動(dòng)作本身是由 DMA 控制器 來實(shí)行和完成。

            DMA控制器獲得總線控制權(quán)后,CPU即刻掛起或只執(zhí)行內(nèi)部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O接口進(jìn)行DMA傳輸。DMA每次傳送的是磁盤上相鄰的扇區(qū)。Scatter-gather DMA允許傳送不相鄰的扇區(qū)。

             

            CPU性能與硬盤與內(nèi)存的數(shù)據(jù)傳輸速率關(guān)系不大。

             

            設(shè)備驅(qū)動(dòng)內(nèi)有一個(gè)結(jié)構(gòu)管理著IO的請(qǐng)求隊(duì)列

            structrequest_queue(include/linux/Blkdev.h

            這里不僅僅有讀寫請(qǐng)求的數(shù)據(jù)塊,還有用于IO調(diào)度的回調(diào)函數(shù)結(jié)構(gòu)。每次需要傳輸?shù)臅r(shí)候,就從隊(duì)列中選出一個(gè)數(shù)據(jù)塊交給DMA進(jìn)行傳輸。

             

            所以IO調(diào)度的回調(diào)函數(shù)這是降低平均訪問的時(shí)間的關(guān)鍵。

             

            三.OS

            IO調(diào)度器

            Linux kernel提供了四個(gè)調(diào)度器供用戶選擇。他們是noop,cfq,deadline,as。可以在系統(tǒng)啟動(dòng)時(shí)設(shè)置內(nèi)核參數(shù)elevator=<name>來指定默認(rèn)的調(diào)度器。也可以在運(yùn)行時(shí)為某個(gè)塊設(shè)備設(shè)置IO調(diào)度程序。

             

            下面來簡(jiǎn)要介紹這四個(gè)調(diào)度器的電梯調(diào)度算法。

            Noop:最簡(jiǎn)單的調(diào)度算法。新的請(qǐng)求總是被添加到隊(duì)頭或者隊(duì)尾,然后總是從隊(duì)頭中選出將要被處理的請(qǐng)求。

             

            CFQ:(Complete FarinessQueueing)它的目標(biāo)是在所有請(qǐng)求的進(jìn)程中平均分配IO的帶寬。因此,它會(huì)根據(jù)進(jìn)程創(chuàng)建自己的請(qǐng)求隊(duì)列,然后將IO請(qǐng)求放入相應(yīng)的隊(duì)列中。在使用輪轉(zhuǎn)法從每個(gè)非空的隊(duì)列中取出IO請(qǐng)求。

             

            Deadline:使用了四個(gè)隊(duì)列,兩個(gè)以磁盤塊序號(hào)排序的讀寫隊(duì)列,兩個(gè)以最后期限時(shí)間排序的讀寫隊(duì)列。算法首先確定下一個(gè)讀寫的方向,讀的優(yōu)先級(jí)高于寫。然后檢查被選方向的最后期限隊(duì)列:如果最后期限時(shí)間的隊(duì)列中有超時(shí)的請(qǐng)求,則將剛才的請(qǐng)求移動(dòng)至隊(duì)尾,然后在磁盤號(hào)排序隊(duì)列中從超時(shí)請(qǐng)求開始處理。當(dāng)處理完一個(gè)方向的請(qǐng)求后,在處理另一個(gè)方向的請(qǐng)求。(讀請(qǐng)求的超時(shí)時(shí)間是500ms,寫請(qǐng)求的超時(shí)時(shí)間是5s

             

            Anticipatory:它是最復(fù)雜的IO調(diào)度算法。和deadline算法一樣有四個(gè)隊(duì)列。還附帶了一些啟發(fā)式策略。它會(huì)從當(dāng)前的磁頭位置后的磁盤號(hào)中選擇請(qǐng)求。在調(diào)度了一個(gè)由P進(jìn)程的IO請(qǐng)求后,會(huì)檢查下一個(gè)請(qǐng)求,如果還是P進(jìn)程的請(qǐng)求,則立即調(diào)度,如果不是,同時(shí)預(yù)測(cè)P進(jìn)程很快會(huì)發(fā)出請(qǐng)求,則還延長(zhǎng)大約7ms的時(shí)間等待P進(jìn)程的IO請(qǐng)求。

             

             

             

            Write/Read函數(shù)

            以ext3的write為例:

            系統(tǒng)調(diào)用write()的作用就是修改頁(yè)高速緩存內(nèi)的一些頁(yè)的內(nèi)容,如果頁(yè)高速緩存內(nèi)沒有所要的頁(yè)則分配并追加這些頁(yè)。

            當(dāng)臟頁(yè)達(dá)到一定數(shù)量或者超時(shí)后,將臟頁(yè)刷回硬盤。也可以執(zhí)行相關(guān)系統(tǒng)調(diào)用。

             

            為什么要達(dá)到一定數(shù)量,是因?yàn)檠舆t寫能在一定層度上提高系統(tǒng)的性能,這也使得塊設(shè)備的平均讀請(qǐng)求會(huì)多于寫請(qǐng)求。

             

            在程序中調(diào)用write函數(shù),將進(jìn)入系統(tǒng)調(diào)用f_op->write。這個(gè)函數(shù)將調(diào)用ext3的do_sync_write。這個(gè)函數(shù)將參數(shù)封裝后調(diào)用generic_file_aio_write。由參數(shù)名可以看出同步寫變成了異步寫。如果沒有標(biāo)記O_DIRECT,將調(diào)用函數(shù)generic_file_buffered_write將寫的內(nèi)容寫進(jìn)kernel的高速頁(yè)緩存中。Buffer是以page為單位即4k。之后當(dāng)調(diào)用cond_resched()進(jìn)行進(jìn)程的調(diào)度,DMA會(huì)將buffer中的內(nèi)容寫進(jìn)硬盤。

            所以當(dāng)每次以4k為單位寫入硬盤時(shí)效率會(huì)達(dá)到最高。下面是UNIX環(huán)境高級(jí)編程的實(shí)驗(yàn)結(jié)果:


            下圖是linux 的塊設(shè)備的數(shù)據(jù)操作層次:

            Sector扇區(qū):是設(shè)備驅(qū)動(dòng)和IO調(diào)度程序處理數(shù)據(jù)粒度。

            Block塊:是VFS和文件系統(tǒng)處理數(shù)據(jù)的粒度。其大小不唯一,可以是512,1024,2048,4096字節(jié)。內(nèi)核操作的塊大小是4096字節(jié)。

            Segment段:是DMA傳送的單位。每一個(gè)段包含了相鄰的扇區(qū),它能使DMA傳送不相鄰的扇區(qū)。


             

            四.用戶程序

            根據(jù)以上的分析,我們的write buffer一般設(shè)置為4K的倍數(shù)。

             

            在程序中有意識(shí)的延遲寫。這個(gè)是os的策略,當(dāng)然也可以應(yīng)用到程序的設(shè)計(jì)中。當(dāng)然也會(huì)有缺點(diǎn):1.如果硬件錯(cuò)誤或掉電,則會(huì)丟失內(nèi)容(做額外的備份)2.需要額外的內(nèi)存空間。(犧牲內(nèi)存來提高IO的效率)

             

            我們還需根據(jù)系統(tǒng)的IO調(diào)度器的調(diào)度策略,設(shè)計(jì)出不同的IO策略。盡量降低磁盤的平均訪問時(shí)間,降低請(qǐng)求隊(duì)列,提高數(shù)據(jù)傳輸?shù)乃俾省?/span>

             

             

             

            五.監(jiān)控硬盤的工具和指標(biāo)

            Iostat–x –k 1

             -x顯示更多的消息 -k數(shù)據(jù)以KB為單位 1每秒顯示一次

            輸出顯示的信息

            Iowait:cpu等待未完成的IO請(qǐng)求而空閑的時(shí)間的比例。

            Idle:cpu空閑且無IO請(qǐng)求的比例。

            rrqm/s:每秒這個(gè)設(shè)備相關(guān)的讀取請(qǐng)求有多少被Merge了。

            wrqm/s:每秒這個(gè)設(shè)備相關(guān)的寫入請(qǐng)求有多少被Merge了。

            rsec/s:每秒讀取的扇區(qū)數(shù);

            wsec/:每秒寫入的扇區(qū)數(shù)。

            r/s:每秒完成的讀 I/O 設(shè)備次數(shù)。即 delta(rio)/s

            w/s:每秒完成的寫 I/O 設(shè)備次數(shù)。即 delta(wio)/s

            await:每一個(gè)IO請(qǐng)求的處理的平均時(shí)間(單位是毫秒)。包括加入請(qǐng)求隊(duì)列和服務(wù)的時(shí)間。

            svctm:   平均每次設(shè)備I/O操作的服務(wù)時(shí)間。

            avgrq-sz: 平均每次設(shè)備I/O操作的數(shù)據(jù)大小 (扇區(qū))。即 delta(rsect+wsect)/delta(rio+wio)
            avgqu-sz:
            平均I/O隊(duì)列長(zhǎng)度。即 delta(aveq)/s/1000 (因?yàn)閍veq的單位為毫秒)

            %util:在統(tǒng)計(jì)時(shí)間內(nèi)所有處理IO時(shí)間,除以總共統(tǒng)計(jì)時(shí)間。例如,如果統(tǒng)計(jì)間隔1秒,該設(shè)備有0.8秒在處理IO,而0.2秒閑置,那么該設(shè)備的%util = 0.8/1 = 80%,所以該參數(shù)暗示了設(shè)備的繁忙程度。一般地,如果該參數(shù)是100%表示設(shè)備已經(jīng)接近滿負(fù)荷運(yùn)行了(當(dāng)然如果是多磁盤,即使%util是100%,因?yàn)榇疟P的并發(fā)能力,所以磁盤使用未必就到了瓶頸)。

             

            下面我們做一個(gè)實(shí)驗(yàn)來分析一下

            我們使用命令

            time dd if=/dev/zero of=/home/zhouyuan/mytest bs=1M count=3000

            向mytest寫入數(shù)據(jù),寫入3G

            截取部分的狀態(tài)監(jiān)控:




             

            如圖2,當(dāng)兩條數(shù)據(jù) iowait 達(dá)到了 99% 以上,寫入的數(shù)據(jù)是0,這是因?yàn)镈MA將內(nèi)存的中的數(shù)據(jù)傳輸給設(shè)備。結(jié)合圖1的前兩條數(shù)據(jù),利用率達(dá)到了99%+卻沒有寫入的磁盤塊。

            如圖3,iowait下降,說明cpu開始執(zhí)行相關(guān)程序,而此時(shí)塊設(shè)備開始寫入的數(shù)據(jù)。這兩個(gè)操作是異步進(jìn)行的。

             

            Vmstat–k –n 1

            Swap

              si: 從磁盤交換到內(nèi)存的交換頁(yè)數(shù)量,單位:KB/

              so: 從內(nèi)存交換到磁盤的交換頁(yè)數(shù)量,單位:KB/

            IO

              bi: 從塊設(shè)備接受的塊數(shù),單位:塊/

              bo: 發(fā)送到塊設(shè)備的塊數(shù),單位:塊/



            從圖中我們可以看出系統(tǒng)的延遲寫。

            posted on 2011-08-26 20:04 Range 閱讀(17182) 評(píng)論(2)  編輯 收藏 引用
            評(píng)論

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            統(tǒng)計(jì)

            日韩久久无码免费毛片软件| 久久无码av三级| av无码久久久久久不卡网站| 伊人久久国产免费观看视频 | 无码任你躁久久久久久老妇| 91精品观看91久久久久久 | 久久超碰97人人做人人爱| 精品国产乱码久久久久久人妻 | 国产三级精品久久| 亚洲国产成人久久精品99| 久久99九九国产免费看小说| 亚洲欧美伊人久久综合一区二区 | 欧美粉嫩小泬久久久久久久| 久久午夜夜伦鲁鲁片免费无码影视| 欧美久久一级内射wwwwww.| 婷婷久久综合| 九九精品99久久久香蕉| 久久久久久av无码免费看大片| 亚洲成色WWW久久网站| 欧美一区二区精品久久| 亚洲精品乱码久久久久久蜜桃不卡 | 国产精品久久久久久久久| 国产真实乱对白精彩久久| 久久久久久精品无码人妻| 久久九九全国免费| 亚洲中文字幕久久精品无码喷水| 亚洲国产精品热久久| 天堂久久天堂AV色综合| 成人午夜精品无码区久久| 中文字幕精品久久| 色偷偷久久一区二区三区| 久久综合综合久久综合| 18岁日韩内射颜射午夜久久成人| 婷婷久久综合| 综合久久一区二区三区| 精品伊人久久大线蕉色首页| 亚洲中文字幕无码久久2020| 亚洲AV乱码久久精品蜜桃| 2020最新久久久视精品爱| 久久只这里是精品66| 欧美日韩精品久久久久|