• <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系統的架構圖


             

            一.設備-------- 影響磁盤性能的因素

            硬盤的轉速影響硬盤的整體性能。一般情況下轉速越大,性能會越好。

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

             

            平均訪問時間包括兩方面因素:

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

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

             

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

             

            傳輸速率包括內部傳輸速率和外部傳輸速率。

            內部傳輸率(Internal Transfer Rate) 也稱為持續傳輸率(Sustained Transfer Rate),它反映了硬盤緩沖區未用時的性能。內部傳輸率主要依賴于硬盤的旋轉速度。

            外部傳輸率(External Transfer Rate)也稱為突發數據傳輸率Burst Data Transfer Rate)或接口傳輸率,它標稱的是系統總線與硬盤緩沖區之間的數據傳輸率,外部數據傳輸率與硬盤接口類型硬盤緩存的大小有關。STAT2 的傳輸速率在300MB/s級別。

             

            因此在硬件級上,提高磁盤性能的關鍵主要是降低平均訪問時間。

            二.設備驅動

            內存到硬盤的傳輸方式:poll,中斷,DMA

             

            DMA:當 CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。

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

             

            CPU性能與硬盤與內存的數據傳輸速率關系不大。

             

            設備驅動內有一個結構管理著IO的請求隊列

            structrequest_queue(include/linux/Blkdev.h

            這里不僅僅有讀寫請求的數據塊,還有用于IO調度的回調函數結構。每次需要傳輸的時候,就從隊列中選出一個數據塊交給DMA進行傳輸。

             

            所以IO調度的回調函數這是降低平均訪問的時間的關鍵。

             

            三.OS

            IO調度器

            Linux kernel提供了四個調度器供用戶選擇。他們是noop,cfq,deadline,as。可以在系統啟動時設置內核參數elevator=<name>來指定默認的調度器。也可以在運行時為某個塊設備設置IO調度程序。

             

            下面來簡要介紹這四個調度器的電梯調度算法。

            Noop:最簡單的調度算法。新的請求總是被添加到隊頭或者隊尾,然后總是從隊頭中選出將要被處理的請求。

             

            CFQ:(Complete FarinessQueueing)它的目標是在所有請求的進程中平均分配IO的帶寬。因此,它會根據進程創建自己的請求隊列,然后將IO請求放入相應的隊列中。在使用輪轉法從每個非空的隊列中取出IO請求。

             

            Deadline:使用了四個隊列,兩個以磁盤塊序號排序的讀寫隊列,兩個以最后期限時間排序的讀寫隊列。算法首先確定下一個讀寫的方向,讀的優先級高于寫。然后檢查被選方向的最后期限隊列:如果最后期限時間的隊列中有超時的請求,則將剛才的請求移動至隊尾,然后在磁盤號排序隊列中從超時請求開始處理。當處理完一個方向的請求后,在處理另一個方向的請求。(讀請求的超時時間是500ms,寫請求的超時時間是5s

             

            Anticipatory:它是最復雜的IO調度算法。和deadline算法一樣有四個隊列。還附帶了一些啟發式策略。它會從當前的磁頭位置后的磁盤號中選擇請求。在調度了一個由P進程的IO請求后,會檢查下一個請求,如果還是P進程的請求,則立即調度,如果不是,同時預測P進程很快會發出請求,則還延長大約7ms的時間等待P進程的IO請求。

             

             

             

            Write/Read函數

            以ext3的write為例:

            系統調用write()的作用就是修改頁高速緩存內的一些頁的內容,如果頁高速緩存內沒有所要的頁則分配并追加這些頁。

            當臟頁達到一定數量或者超時后,將臟頁刷回硬盤。也可以執行相關系統調用。

             

            為什么要達到一定數量,是因為延遲寫能在一定層度上提高系統的性能,這也使得塊設備的平均讀請求會多于寫請求。

             

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

            所以當每次以4k為單位寫入硬盤時效率會達到最高。下面是UNIX環境高級編程的實驗結果:


            下圖是linux 的塊設備的數據操作層次:

            Sector扇區:是設備驅動和IO調度程序處理數據粒度。

            Block塊:是VFS和文件系統處理數據的粒度。其大小不唯一,可以是512,1024,2048,4096字節。內核操作的塊大小是4096字節。

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


             

            四.用戶程序

            根據以上的分析,我們的write buffer一般設置為4K的倍數。

             

            在程序中有意識的延遲寫。這個是os的策略,當然也可以應用到程序的設計中。當然也會有缺點:1.如果硬件錯誤或掉電,則會丟失內容(做額外的備份)2.需要額外的內存空間。(犧牲內存來提高IO的效率)

             

            我們還需根據系統的IO調度器的調度策略,設計出不同的IO策略。盡量降低磁盤的平均訪問時間,降低請求隊列,提高數據傳輸的速率。

             

             

             

            五.監控硬盤的工具和指標

            Iostat–x –k 1

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

            輸出顯示的信息

            Iowait:cpu等待未完成的IO請求而空閑的時間的比例。

            Idle:cpu空閑且無IO請求的比例。

            rrqm/s:每秒這個設備相關的讀取請求有多少被Merge了。

            wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。

            rsec/s:每秒讀取的扇區數;

            wsec/:每秒寫入的扇區數。

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

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

            await:每一個IO請求的處理的平均時間(單位是毫秒)。包括加入請求隊列和服務的時間。

            svctm:   平均每次設備I/O操作的服務時間。

            avgrq-sz: 平均每次設備I/O操作的數據大小 (扇區)。即 delta(rsect+wsect)/delta(rio+wio)
            avgqu-sz:
            平均I/O隊列長度。即 delta(aveq)/s/1000 (因為aveq的單位為毫秒)

            %util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該設備有0.8秒在處理IO,而0.2秒閑置,那么該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即使%util是100%,因為磁盤的并發能力,所以磁盤使用未必就到了瓶頸)。

             

            下面我們做一個實驗來分析一下

            我們使用命令

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

            向mytest寫入數據,寫入3G

            截取部分的狀態監控:




             

            如圖2,當兩條數據 iowait 達到了 99% 以上,寫入的數據是0,這是因為DMA將內存的中的數據傳輸給設備。結合圖1的前兩條數據,利用率達到了99%+卻沒有寫入的磁盤塊。

            如圖3,iowait下降,說明cpu開始執行相關程序,而此時塊設備開始寫入的數據。這兩個操作是異步進行的。

             

            Vmstat–k –n 1

            Swap

              si: 從磁盤交換到內存的交換頁數量,單位:KB/

              so: 從內存交換到磁盤的交換頁數量,單位:KB/

            IO

              bi: 從塊設備接受的塊數,單位:塊/

              bo: 發送到塊設備的塊數,單位:塊/



            從圖中我們可以看出系統的延遲寫。

            posted on 2011-08-26 20:04 Range 閱讀(17173) 評論(2)  編輯 收藏 引用
            評論
            • # re: 服務器高性能程序 磁盤I/O篇
              糯米
              Posted @ 2011-08-26 22:23
              不錯,贊一個!  回復  更多評論   
            • # re: 服務器高性能程序 磁盤I/O篇
              飯中淹
              Posted @ 2011-08-26 23:29
              支持,以前從未關注過高性能磁盤IO。
                回復  更多評論   

            統計

            国产成人精品久久一区二区三区 | 久久综合色区| 国产精品久久婷婷六月丁香| 国内精品九九久久精品 | 无码人妻少妇久久中文字幕蜜桃 | 久久综合给合久久狠狠狠97色69| 99麻豆久久久国产精品免费| 思思久久99热免费精品6| MM131亚洲国产美女久久| 精品国产乱码久久久久久人妻 | 国产精品九九久久免费视频 | 99re久久精品国产首页2020| 久久经典免费视频| 久久精品亚洲福利| 国产精品久久国产精品99盘| 99久久国产综合精品网成人影院| 伊人久久综合无码成人网| 久久夜色精品国产噜噜亚洲a| 狠狠色丁香婷婷久久综合五月| 国产成人综合久久精品红| 久久久久亚洲国产| 国产精品美女久久久久| 久久99精品国产麻豆不卡| 久久人人添人人爽添人人片牛牛| 久久精品国产亚洲av麻豆色欲| 久久99精品久久久久久齐齐| 91精品国产91热久久久久福利 | 久久er国产精品免费观看2| 伊人久久精品无码av一区| 偷窥少妇久久久久久久久| 久久精品国产一区二区| 久久最新免费视频| 久久99精品久久久久久久久久| 久久久久久久亚洲精品| 久久激情亚洲精品无码?V| 久久99热这里只有精品国产| 97久久天天综合色天天综合色hd| 久久九九青青国产精品| 国内精品久久久久影院免费| 久久WWW免费人成—看片| 亚洲国产日韩综合久久精品|