計算機磁盤性能分析Disk參考范本_第1頁
計算機磁盤性能分析Disk參考范本_第2頁
計算機磁盤性能分析Disk參考范本_第3頁
計算機磁盤性能分析Disk參考范本_第4頁
計算機磁盤性能分析Disk參考范本_第5頁
已閱讀5頁,還剩47頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

精品文檔交流精品文檔交流Windows性能計數器-- 磁盤性能分析 DiskPhysicalDisk :單次IO大小Avg.DiskBytes/ReadAvg.DiskBytes/WriteIO響應時間Avg.Disksec/Read 磁盤每次讀取需要的時間,一般不超過一般不要超過11~15ms。Avg.Disksec/Write 一般小于每秒讀/寫的IO數)理論情況下,磁盤的隨機讀計數為 、 順序讀計數為 實際測試值與理論值對比,從而判斷磁盤是否為瓶頸DiskReads/secDiskWrites/secDiskTransfers/secIO吞吐率(磁盤每秒讀 /寫字節數)DiskBytes/secDiskReadBytes/secDiskWriteBytes/sec磁盤隊列長度Avg.DiskQueueLength :磁盤平均隊列長度不應超過 2,即:隊列長度/磁盤數磁盤有兩個重要的參數: Seektime、Rotational latency 。正常的I/O計數為:①1000/(Seektime+Rotationallatency)*0.75,在此范圍內屬正常。當達到%的I/O計數以上時則基本認為已經存在I/O瓶頸。理論、順序讀計數為。對于數據文件而言是隨機讀寫,日志文件是順序讀寫。因此,數據文件建議存放于RAID5件存放于RAID10或RAID1中。附:00IOPS00IOPS0:0IOPS下面假設在有 4塊硬盤的RAID5中觀察到的 PhysicalDisk 性能對象的部值:Avg.DiskQueueLength12 隊列長度Avg.DiskSec/Read.035 讀數據所用時間 msAvg.DiskSec/Write.045 寫數據所用時間 DiskReads/sec320 每秒讀數據量DiskWrites/sec100 每秒寫數據量Avg.DiskQueueLength ,12/4=3,每塊磁盤的平均隊列建議不超過 2Avg.DiskSec/Read 一般不要超過 。Avg.DiskSec/Write 一般建議小于 。從上面的結果,我們看到磁盤本身的 I/O 能力是滿足我們的要求的, 原因是因有大量的請求才導致隊列等待, 這很可能是因為你的 語句導致大量的表掃描所致。在進行優化后,如果還是不能達到要求, 下面的公式可以幫助你計算使用幾塊硬盤可以滿足這樣的并發要求 :Raid0--I/Osperdisk=(reads+writes)/numberofdisksRaid1--I/Osperdisk=[reads+(2*writes)]/2Raid5--I/Osperdisk=[reads+(4*writes)]/numberofdisksRaid10--I/Osperdisk=[reads+(2*writes)]/numberofdisks我們得到的結果是: (320+400)/4=180,這時你可以根據公式①來得到磁盤的正常I/O值。假設現在正常 I/O計數為為了達到這個結果: 720/125=5.76。就是說要用 6塊磁盤才能達到這樣的要求。但是上面的 DiskReads/sec 和DiskWrites/sec 是個很難正確估算的值。因此只能在系統比較忙時,大概估算一個平均值, 作為計算公式的依據。 另一個是很難從客戶那里得到 Seektime、Rotationallatency 參數的值,這也只能用理論值125進行計算。前言作為一個數據庫管理員,關注系統的性能是日常最重要的工作之一, 而在所關的各方面的性能只能 IO性能卻是最令人頭痛的一塊,面對著各種生澀的參數和令人眼花繚亂的新奇的術語, 再加上存儲廠商的忽悠,總是讓我們有種云里霧里的感覺本系列文章試圖從基本概念開始對磁盤存儲相關的各種概念進行綜合歸納,讓大家能夠對 IO性能相關的基本概念, IO性能的監控和調整有個比較全面的了解。在這一部分里我們先舍棄各種結構復雜的存儲系統, 直接研究一個單獨的磁盤性能問題,藉此了解各個衡量 IO系統系能的各個指標以及之間的關系。幾個基本的概念在研究磁盤性能之前我們必須先了解磁盤的結構, 以及工作原理。不過在這里不再重復說明了,關系硬盤結構和工作原理的信息可以參考維基百科上面的相關詞條——Harddiskdrive (英文)和硬盤驅動器(中文)。讀寫 IO(Read/WriteIO) 操作磁盤是用來給我們存取數據用的,因此當說到 IO操作的時候,就會存在兩種相對應的操作,存數據時候對應的是寫 IO操作,取數據的時候對應的是讀 IO作。單個 IO操作當控制磁盤的控制器接到操作系統的讀 IO操作指令的時候,控制器就會給磁盤發出一個讀數據的指令,并同時將要讀取的數據塊的地址傳遞給磁盤, 然后磁盤會將讀取到的數據傳給控制器,并由控制器返回給操作系統,完成一個寫 IO操作;同樣的,一個寫IO的操作也類似,控制器接到寫的 IO操作的指令和要寫入的數據,并將其傳遞給磁盤,磁盤在數據寫入完成之后將操作結果傳遞回控制器,再由控制器返回給操作系統, 完成一個寫IO的操作。單個IO操作指的就是完成一個寫 IO或者是讀IO的操作。隨機訪問(RandomAccess)與連續訪問 Access)隨機訪問指的是本次 IO所給出的扇區地址和上次 IO給出扇區地址相差比較大這樣的話磁頭在兩次 IO操作之間需要作比較大的移動動作才能重新開始讀 /寫數據。相反的,如果當次 IO給出的扇區地址與上次 IO結束的扇區地址一致或者是接近的話,那磁頭就能很快的開始這次 IO操作這樣的多個 IO操作稱為連訪問。因此盡管相鄰的兩次 IO操作在同一時刻發出,但如果它們的請求的扇區地址相差很大的話也只能稱為隨機訪問,而非連續訪問。順序 IO模式(QueueMode)/并發 IO模式(BurstMode)磁盤控制器可能會一次對磁盤組發出一連串的 IO命令,如果磁盤組一次只能執行一個IO命令時稱為順序 IO;當磁盤組能同時執行多個 IO命令時,稱為并IO。并發IO只能發生在由多個磁盤組成的磁盤組上,單塊磁盤只能一次處理一個IO命令。單個 IO的大小(IOChunkSize)熟悉數據庫的人都會有這么一個概念,那就是數據庫存儲有個基本的塊大小(BlockSize) ,不管是SQLServer還是Oracle,默認的塊大小都是 就是數據庫每次讀寫都是以 8k為單位的那么對于數據庫應用發出的固定 8k大小的單次讀寫到了寫磁盤這個層面會是怎么樣的呢,就是對于讀寫磁盤來說單個 IO操作操作數據的大小是多少呢, 是不是也是一個固定的值?答案是不確定。 首先操作系統為了提高 IO的性能而引入了文件系統緩存 (FileSystemCache) ,系統會根據請求數據的情況將多個來自 IO的請求先放在緩存里面,然后再一次性的提交給磁盤,也就是說對于數據庫發出的多個 8K數據塊的讀操作有可能放在一個磁盤讀 IO里就處理了。還有對于有些存儲系統也是提供了緩存 的接收到操作系統的 IO請求之后也是會將多個操作系統的 IO請求合并成一個來處理不管是操作系統層面的緩存還是磁盤控制器層面的緩存, 目的都只有一個提高數據讀寫的效率。因此每次單獨的 IO操作大小都是不一樣的,它主要取決于系統對于數據讀寫效率的判斷。當一次IO操作大小比較小的時候我們成為小的IO操作,比如說8K這樣的;當一次IO操作的數據量比較的的時候稱為大IO操作,比如說甚至更大。在我們說到塊大小( BlockSize)的時候通常我們會接觸到多個類似的概念,像我們上面提到的那個在數據庫里面的數據最小的管理單位, Oralce稱之為塊(Block) ,大小一般為 SQLServer稱之為頁(Page),一般大小也為 8k。在文件系統里面我們也能碰到一個文件系統的塊, 在現在很多的 Linux 系統中都是通過 /usr/bin/time -v 可以看到),它的作用其實跟數據庫里面的塊 /是一樣的,都是為了方便數據的管理。但是說到單次 IO的大小,跟這些塊的大小都是沒有直接關系的,在英文里單次 IO大小通常被稱為是 IOChunkSize,不會說成是 IOBlockSize 的。IOPS(IOperSecond)系統每秒所執行 IO操作的次數,是一個重要的用來衡量系統 IO能的一個參數。對于單個磁盤組成的 IO系統來說,計算它的 不是一件很難的事情,只要我們知道了系統完成一次 IO所需要的時間的話我們就能推算出系統IOPS來。現在我們就來推算一下磁盤的 假設磁盤的轉速(Rotational Speed)為平均尋道時間為 最大傳輸速率為 (這里將讀寫速度視為一樣,實際會差別比較大)。對于磁盤來說一個完整的 IO操作是這樣進行的:當控制器對磁盤發出一個 IO操作命令的時候,磁盤的驅動臂 (ActuatorArm) 帶讀寫磁頭(Head)離開著陸區(LandingZone,位于內圈沒有數據的區域 ),移動到要操作的初始數據塊所在的磁道(Track) 的正上方,這個過程被稱為尋址(Seeking)對應消耗的時間被稱為尋址時間(SeekTime)但是找到對應磁道還不能馬上讀取數據, 這時候磁頭要等到磁盤盤片(Platter) 旋轉到初始數據塊所在的扇區 (Sector) 落在讀寫磁頭正上方的之后才能開始讀取數據,在這個等待盤片旋轉到可操作扇區的過程中消耗的時間稱為旋轉延時(RotationalDelay) ;接下來就隨著盤片的旋轉,磁頭不斷的讀/寫相應的數據塊,直到完成這次 IO所需要操作的全部數據,這個過程稱為據傳送(DataTransfer) 對應的時間稱為傳送時間 (TransferTime) 完成這三個步驟之后一次IO操作也就完成了。在我們看硬盤廠商的宣傳單的時候我們經常能看到 3個參數分別是平均尋址間盤片旋轉速度以及最大傳送速度, 這三個參數就可以提供給我們計算上述三個步驟的時間。第一個尋址時間考慮到被讀寫的數據可能在磁盤的任意一個磁道, 既有可能磁盤的最內圈(尋址時間最短),也可能在磁盤的最外圈(尋址時間最長),所以在計算中我們只考慮平均尋址時間, 也就是磁盤參數中標明的那個平均尋址時間,這里就采用當前最多的 10krmp硬盤的。第二個旋轉延時和尋址一樣,當磁頭定位到磁道之后有可能正好在要讀寫扇區之上,這時候是不需要額外額延時就可以立刻讀寫到數據, 但是最壞的情況確要磁盤旋轉整整一圈之后磁頭才能讀取到數據, 所以這里我們也考慮的是平均旋轉延時,對于 10krpm的磁盤就是(60s/15k)*(1/2)=2ms 。第三個傳送時間磁盤參數提供我們的最大的傳輸速度, 當然要達到這種速度很有難度的,但是這個速度卻是磁盤純讀寫磁盤的速度,因此只要給定了單次IO的大小,我們就知道磁盤需要花費多少時間在數據傳送上,這個時間就是IOChunkSize/MaxTransferRate 。現在我們就可以得出這樣的計算 單次IO時間的公式:IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Size/Transfer Rate于是我們可以這樣計算出 IOPSIOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2+ IOChunk Size/Transfer Rate)對于給定不同的 IO大小我們可以得出下面的一系列的數據4K (1/7.1 ms = 140 IOPS)5ms + (60sec/15000RPM/2) + 4K/40MB = 5 + 2 + 0.1 =7.18k (1/7.2 ms = 139 IOPS)5ms + (60sec/15000RPM/2) + 8K/40MB = 5 + 2 + 0.2 =7.216K (1/7.4 ms = 135 IOPS)+16K/40MB=5+2+16K/40MB=5+2+0.4=+32K/40MB=5+2+0.8=+64K/40MB=5+2+1.6=7.432K (1/7.8 ms = 128 IOPS)5ms + (60sec/15000RPM/2)7.864K (1/8.6 ms = 116 IOPS)5ms + (60sec/15000RPM/2)8.6從上面的數據可以看出, 當單次IO越小的時候,單次 IO所耗費的時間也越少相應的IOPS也就越大。上面我們的數據都是在一個比較理想的假設下得出來的, 這里的理想的情況就是磁盤要花費平均大小的尋址時間和平均的旋轉延時, 這個假設其實是比較符合我們實際情況中的隨機讀寫,在隨機讀寫中,每次 IO操作的尋址時間和旋轉延時都不能忽略不計,有了這兩個時間的存在也就限制了 IOPS的大小。現在我們考慮一種相對極端的順序讀寫操作, 比如說在讀取一個很大的存儲連續分布在磁盤的文件,因為文件的存儲的分布是連續的,磁頭在完成一個讀 IO操作之后,不需要從新的尋址,也不需要旋轉延時,在這種情況下我們能到一個很大的 值,如下4K(1/0.1ms=10000 IOPS)0ms+0ms+ 4K/40MB =0.18k(1/0.2ms=5000 IOPS)0ms+0ms+ 8K/40MB =0.216K(1/0.4ms =2500 IOPS)0ms+ 0ms+ 16K/40MB=0.432K(1/0.8ms =1250 IOPS)0ms+ 0ms+ 32K/40MB=0.864K(1/1.6ms =625 IOPS)0ms+ 0ms+ 64K/40MB=1.6相比第一組數據來說差距是非常的大的,因此當我們要用 IOPS來衡量一個 IO系統的系能的時候我們一定要說清楚是在什么情況的 也就是要說明讀寫的方式以及單次 IO的大小,當然在實際當中,特別是在的系統的,隨機小IO的讀寫是最有說服力的。傳輸速度(TransferRate)/ 吞吐率(Throughput)現在我們要說的傳輸速度(另一個常見的說法是吞吐率) 不是磁盤上所表明的大傳輸速度或者說理想傳輸速度, 而是磁盤在實際使用的時候從磁盤系統總線上流過的數據量。有了 IOPS數據之后我們是很容易就能計算出對應的傳輸速度來的Transfer Rate = IOPS * IO Chunk Size8K:139* 8K=1112K/40M=2.71%16K:135* 16K=2160K/40M=5.27%32K:116* 32K8K:139* 8K=1112K/40M=2.71%16K:135* 16K=2160K/40M=5.27%32K:116* 32K=3712K/40M=9.06%可以看出實際上的傳輸速度是很小的,對總線的利用率也是非常的小。這里一定要明確一個概念,那就是盡管上面我們使用 IOPS來計算傳輸速度,但是實際上傳輸速度和 IOPS是沒有直接關系,在沒有緩存的情況下它們共同的決定因素都是對磁盤系統的訪問方式以及單個 IO的大小。對磁盤進行隨機訪問時候我們可以利用 IOPS來衡量一個磁盤系統的性能,此時的傳輸速度不會太大;但是當對磁盤進行連續訪問時,此時的 IOPS已經沒有了參考的價值,這個時候限制實際傳輸速度卻是磁盤的最大傳輸速度。因此在實際的應用當中,只會用IOPS 來衡量小IO的隨機讀寫的性能,而當要衡量大 IO連續讀寫的性能的時就要采用傳輸速度而不能是 IOPS了。IO響應時間(IOResponseTime)最后來關注一下能直接描述 IO性能的IO響應時間。IO響應時間也被稱為 IO時(IOLatency) ,IO響應時間就是從操作系統內核發出的一個讀或者寫的 IO命令到操作系統內核接收到 IO回應的時間,注意不要和單個 IO時間混淆了,單個IO時間僅僅指的是 IO操作在磁盤內部處理的時間,而 IO響應時間還要包括 IO操作在IO等待隊列中所花費的等待時間。計算IO操作在等待隊列里面消耗的時間有一個衍生于利托氏定理(Little’sLaw)的排隊模型M/M/1模型可以遵循,由于排隊模型算法比較復雜,到現在還沒有搞太明白(如果有誰對M/M/1模型比較精通的話歡迎給予指導這里就羅列一下最后的結果,還是那上面計算的IOPS數據來說:8K IO Chunk Size (135 IOPS, 7.2 135 => 240.0 ms105 => 29.5 ms75 => 15.7 ms45 => 10.6 ms64KIOChunkSize(116IOPS,8.6ms)135 => 沒響應了??105 => 88.6 ms75 => 24.6 ms45 => 14.6 ms從上面的數據可以看出,隨著系統實際 IOPS越接近理論的最大值, IO的響應間會成非線性的增長,越是接近最大值,響應時間就變得越大, 而且會比預期超出很多。一般來說在實際的應用中有一個 的指導值,也就是說在 IO讀寫的隊列中,當隊列大小小于最大 IOPS的的時候,IO的響應時間增加會很小,相對來說讓人比較能接受的,一旦超過 響應時間就會戲劇性的暴增,所以當一個系統的 IO壓力超出最大可承受壓力的 的時候就是必須要考慮調整或升級了。另外補充說一下這個的指導值也適用于過的,一旦超過精品文檔交流精品文檔交流從上一篇文章的計算中我們可以看到一個 15k轉速的磁盤在隨機讀寫訪問的情況下IOPS竟然只有140左右,但在實際應用中我們卻能看到很多標有 甚至更高的存儲系統,有這么大 IOPS的存儲系統怎么來的呢?這就要歸結于各種存儲技術的使用了,在這些存儲技術中使用最廣的就是高速緩存 (Cache)和磁盤冗余陣列(RAID)了,本文就將探討緩存和磁盤陣列提高存儲 IO性能的方法。高速緩存(Cache)在當下的各種存儲產品中,按照速度從快到慢應該就是內存 閃存磁盤磁帶了然而速度越快也就意味著價格越高, 閃存雖然說是發展勢頭很好, 但目前來說卻還是因為價格問題無法普及, 因此現在還是一個磁盤作霸王的時代。 與和內存速度相比,磁盤的速度無疑是計算機系統中最大的瓶頸了, 所以在必須使用磁盤而又想提高性能的情況下,人們想出了在磁盤中嵌入一塊高速的內存 用來保存經常訪問的數據從而提高讀寫效率的方法來折中的解決, 這塊嵌入的內存就被稱為高速緩存。說到緩存,這東西應用現在已經是無處不在, 從處于上層的應用,到操作系統層再到磁盤控制器,還有內部,單個磁盤的內部也都存在緩存, 所有這些緩存存在的目的都是相同的,就是提高系統執行的效率。當然在這里我們只關心跟IO性能相關的緩存,與 IO性能直接相關的幾個緩存分別是 文件系統緩存(FileSystemCache) 、磁盤控制器緩存(DiskControllerCache) 和磁盤緩存(DiskCache,也稱為DiskBuffer) ,不過當在計算一個磁盤系統性能的時候文件系統緩存也是不會考慮在內的, 因此我們重點考察的就是磁盤控制器緩存和磁緩存。不管是控制器緩存還是磁盤緩存,他們所起的作用主要是分為三部分: 緩存數據預讀(Read-ahead)和回寫(Write-back) 。緩存數據首先是系統讀取過的數據會被緩存在高速緩存中, 這樣下次再次需要讀取相同的數據的時候就不用在訪問磁盤, 直接從緩存中取數據就可以了。 當然使用過的據也不可能在緩存中永久保留的,緩存的數據一般那是采取 算法來進行管理目的是將長時間不用的數據清除出緩存, 那些經常被訪問的卻能一直保留在緩存中,直到緩存被清空。預讀預讀是指采用預讀算法在沒有系統的IO請求的時候事先將數據從磁盤中讀入到緩存中,然后在系統發出讀IO請求的時候,就會實現去檢查看看緩存里面是否存在要讀取的數據,如果存在(即命中)的話就直接將結果返回,這時候的磁盤精品文檔交流精品文檔交流不再需要尋址、旋轉等待、讀取數據這一序列的操作了, 這樣是能節省很多時的;如果沒有命中則再發出真正的讀取磁盤的命令去取所需要的數據。緩存的命中率跟緩存的大小有很大的關系, 理論上是緩存越大的話,所能緩存的數據也就越多,這樣命中率也自然越高, 當然緩存不可能太大, 畢竟成本在那兒呢如果一個容量很大的存儲系統配備了一個很小的讀緩存的話, 這時候問題會比較大的,因為小緩存的數據量非常小, 相比整個存儲系統來說比例非常低, 樣隨機讀取(數據庫系統的大多數情況) 的時候命中率也自然就很低, 這樣的緩存不但不能提高效率(因為絕大部分讀 IO都還要讀取磁盤),反而會因為每次去匹配緩存而浪費時間。執行讀IO操作是讀取數據存在于緩存中的數量與全部要讀取數據的比值稱為緩存命中率(ReadCacheHitRadio) ,假設一個存儲系統在不使用緩存的情況下機小IO讀取能達到 而它的緩存能提供 的緩存命中率的話,那么際上它的IOPS可以達到150/(1-10%)=166。回寫首先說一下,用于回寫功能的那部分緩存被稱為寫緩存 (WriteCache)在一套緩存打開的存儲中,操作系統所發出的一系列寫 IO命令并不會被挨個的執行,這些寫IO的命令會先寫入緩存中,然后再一次性的將緩存中的修改推到磁盤中,這就相當于將那些相同的多個 IO合并成一個,多個連續操作的小 IO合并成一大的還有就是將多個隨機的寫 IO變成一組連續的寫 這樣就能減少磁盤尋址等操作所消耗的時間,大大的提高磁盤寫入的效率。讀緩存雖然對效率提高是很明顯的, 但是它所帶來的問題也比較嚴重, 因為緩存和普通內存一樣,掉點以后數據會全部丟失,當操作系統發出的寫 IO命令寫入到緩存中后即被認為是寫入成功, 而實際上數據是沒有被真正寫入磁盤的, 此時如果掉電,緩存中的數據就會永遠的丟失了, 這個對應用來說是災難性的, 目解決這個問題最好的方法就是給緩存配備電池了, 保證存儲掉電之后緩存數據能如數保存下來。和讀一樣,寫緩存也存在一個寫緩存命中率(WriteCacheHitRadio)緩存命中情況不一樣的是,盡管緩存命中,也不能將實際的IO操作免掉,只是被合并了而已。控制器緩存和磁盤緩存除了上面的作用之外還承當著其他的作用,比如磁盤緩存有保存IO命令隊列的功能,單個的磁盤一次只能處理一個IO命令,但卻能接收多個IO命令,這些進入到磁盤而未被處理的命令就保存在緩存中的IO隊列中。RAID(RedundantArrayOfInexpensiveDisks)如果你是一位數據庫管理員或者經常接觸服務器,那對 RAID應該很熟悉了,作為最廉價的存儲解決方案, RAID早已在服務器存儲中得到了普及。在 RAID的各個級別中,應當以和(不過已經基本走到頭了,6正在崛起中,看看這里了解下原因)應用最廣了。下面將就 這幾種級別的 RAID展開說一下磁盤陣列對于磁盤性能的影響,當然在閱讀下面的內容之前你必須對各個級別的 RAID的結構和工作原理要熟悉才行,這樣才不至于滿頭霧水,推薦查看 wikipedia 上面的如下條目: StandardRAIDlevels ,NestedRAIDlevels 。RAID0RAID0將數據條帶化(striping) 將連續的數據分散在多個磁盤上進行存取, 系發出的IO命令(不管讀 IO和寫IO都一樣)就可以在磁盤上被并行的執行,每個磁盤單獨執行自己的那一部分請求,這樣的并行的 IO操作能大大的增強整個存儲系統的性能。假設一個 RAID0陣列有n(n>=2)個磁盤組成,每個磁盤的隨機讀寫的IO能力都達到 140的話,那么整個磁盤陣列的 IO能力將是 140*n。同如果在陣列總線的傳輸能力允許的話 RAID0的吞吐率也將是單個磁盤的 n倍。RAID1RAID1在容量上相當于是將兩個磁盤合并成一個磁盤來使用了,互為鏡像的兩個磁盤里面保存的數據是完全一樣的,因此在并行讀取的時候速度將是n個磁盤速寫入速度只有n/2。RAID5我們那一個有 n(n>=3)個磁盤的 陣列來看,首先看看 RAID5陣列的讀 RAID5是支持并行 IO的,而磁盤上的數據呈條帶狀的分布在所有的磁盤上,因此讀IO的速度相當于所有磁盤速度的總和。 不過這是在沒有磁盤損壞的情況下,當有一個磁盤故障的時候讀取速度也是會下降的, 因為中間需要花時間來計算失磁盤上面的數據。讀取數據的情況相對就要復雜的多了,先來看下 RAID5奇偶校驗數據寫入的過程,我們把寫入的數據稱為 當磁盤拿到一個寫 IO的命令的時候,它首先會讀取一次要寫入的地址的數據塊中修改之前的數據 然后再讀取到當前條帶中的校驗信息 接下來就根據 這三組數據計算出數據寫入之后的條帶的奇偶校驗信息 最后發出兩個寫 IO的命令,一個寫入 另一個寫奇偶校驗信息 。可以看出陣列在實際操作的時候需要讀、讀、寫、寫一共 4個 IO才能完成一次寫 IO操作,也就是實際上的寫入速度只有所有磁盤速度總和的1/4從這點可以看出 RAID5是非常不適合用在要大批量寫入數據的系統的。RAID6RAID6和很類似,差別就在于 RAID6多了一個用于校驗的磁盤。就讀 IO速度上來說這兩個是完全一樣的,都是所有磁盤 IO速度的總和。在寫IO上也很是類似,不同的是 將一個命令分成了三次讀、三次寫一共 次IO命令才能完成,也就是 RAID6實際寫入磁盤的速度是全部磁盤速度之和的1/6。可以看出從寫 IO看RAID6比RAID5差別是很大的。RAID10RAID0 讀寫速度都很好,卻沒有冗余保護; 和RAID6都有同樣的毛病就是寫入的時候慢,讀取的時候快。那么 RAID1呢?嗯,這里要說的就是 其實不管是 RAID10還是其實都是組合大于 2塊磁盤時候的 當先鏡像后條帶時候就稱為 先條帶后鏡像的時候稱為 。從性能上看RAID01和RAID10都是一樣的,都是 RAID1嘛,但是RAID10在重建故障磁盤的時候性能比 RAID01 要快。因為 其實就是所以它的性能與RAID1也就是一樣的了,這里不需要再做過多的討論。四個性能指標的變化IO響應時間(IOResponseTime)在任何時候 IO響應時間值得都是單個 IO的響應時間,因此,不管磁盤是否組成了磁盤陣列,它的IO響應時間應該都是一樣的。 從前面的計算中我們可以看到如果IO響應時間在 10ms左右的話是很正常的,但是當 IO響應時間比這個值超出太多的時候,你就要開始注意了,很可能就意味著此時你的磁盤系統已經成為了一個瓶頸。IOPS綜合上面兩個部分的討論我們來估算一下陣列下的磁盤總體 在這里我們先假設組成陣列的單個磁盤的隨機讀寫的 IOP為讀寫緩存命中率都為 組成陣列的磁盤個數為 。因為不管是那種陣列,磁盤的讀取性能都是所有磁盤之和, 所以可以得出下面讀取精品文檔交流精品文檔交流read IOPS = disk_IOPS/(1-read_cache_hit_ratio)*disk_num 0%)*4 = 622而寫入性能就完全不一樣了,根據上面的討論我們可以得出下面結論:RAID0:1IOrequest=>need1actualIOondiskRAID1:1IOrequest=>need2actualIOondiskRAID5:1IOrequest=>need4actualIOondiskRAID6:1IOrequest=>need6actualIOondisk由此我們也可以計算出寫入 IOPS估算公式:RAID0 write IOPS ure_IO_num =140/(1-10%)*4/1 = 622RAID1 write IOPS =disk_IOPS/(1-write_cache_hit_ratio)*disk_num/acture_IO_num =140/(1-10%)*4/2 = 311RAID5 write IOPS ure_IO_num =140/(1-10%)*4/4 = 155RAID6 write IOPS ure_IO_num =140/(1-10%)*4/6 = 103實際上從通過上面的計算方法我們還可以估算當給定一個要求的 IOPS的情況下估計下使用各個陣列級別所需要的磁盤的數量。 當然我們上面的計算方法只是一個估算,我們忽略很多其他的因素, 得出的只是一個大概的數值, 不過在際的應用還是有一定的參考作用的。本篇最后附送一個計算磁盤系統 IOPS的網站――’sk&kcalculator 這個網站提供的計算公式還考慮了諸如陣列條帶大小以及主機方面的因素,很有參考價值,至于怎么選擇合適的條帶大小,請參考【延伸閱讀】部分。傳輸速度(TransferRate)/ 吞吐率(Throughput)實際上估算除了隨機讀寫的 IOPS也就知道了隨機讀寫的吞吐率。對于順序讀寫的呢,還是跟前一篇所講的一樣,主要受限于磁盤的限制,不能再拿 IOPS來量了。random_throughtput = random_IOPS * IO_chunk_size能部室由企管部統一考核)。不符合衛生標準的,超市內每處扣0.5分,超市外每處扣1分。衛生管理制度1 總則1.1 為了加強公司的環境衛生管理,創造一個整潔、文明、溫馨的購物、辦公環境,根據《公共場所衛生管理條例》的要求,特制定本制度。1.2 集團公司的衛生管理部門設在企管部,并負責將集團公司的衛生區域詳細劃分到各部室,各分公司所轄區域衛生由分公司客服部負責劃分,確保無遺漏。2 衛生標準2.1 室內衛生標準2.1.1 地面、墻面:無灰塵、無紙屑、無痰跡、無泡泡糖等粘合物、無積水,墻角無灰吊、無蜘蛛網。2.1.2 門、窗、玻璃、鏡子、柱子、電梯、樓梯、燈具等,做到明亮、無灰塵、無污跡、無粘合物,特別是玻璃,要求兩面明亮。2.1.3 柜臺、貨架:清潔干凈,貨架、柜臺底層及周圍無亂堆亂放現象、無灰塵、無粘合物,貨架頂部、背部和底部干凈,不存放雜物和私人物品。2.1.4 購物車(筐)、直接接觸食品的售貨工具(包括刀、叉等):做到內外潔凈,無污垢和粘合物等。購物車(筐)要求每天營業前簡單清理,周五全面清理消毒;售貨工具要求每天消毒,并做好記錄。2.1.5 商品及包裝:商品及外包裝清潔無灰塵(外包裝破損的或破舊的不得陳列)。2.1.6 收款臺、服務臺、辦公櫥、存包柜:保持清潔、無灰塵,臺面和側面無灰塵、無灰吊和蜘蛛網。桌面上不得亂貼、亂畫、亂堆放物品,用具擺放有序且干凈,除當班的購物小票收款聯外,其它單據不得存放在桌面上。2.1.7 垃圾桶:桶內外干凈,要求營業時間隨時清理,不得溢出,每天下班前徹底清理,不得留有垃圾過夜。2.1.8 窗簾:定期進行清理,要求干凈、無污漬。2.1.9 吊飾:屋頂的吊飾要求無灰塵、無蜘蛛網,短期內不適用的吊飾及時清理徹底。2.1.10 內、外倉庫:半年徹底清理一次,無垃圾、無積塵、無蜘蛛網等。2.1.11 室內其他附屬物及工作用具均以整潔為準,要求無灰塵、無粘合物等污垢。2.2 室外衛生標準Windows性能計數器-- 磁盤性能分析 DiskPhysicalDisk :單次IO大小Avg.DiskBytes/ReadAvg.DiskBytes/WriteIO響應時間Avg.Disksec/Read 磁盤每次讀取需要的時間,一般不超過一般不要超過11~15ms。Avg.Disksec/Write 一般小于每秒讀/寫的IO數)理論情況下,磁盤的隨機讀計數為 、 順序讀計數為 實際測試值與理論值對比,從而判斷磁盤是否為瓶頸DiskReads/secDiskWrites/secDiskTransfers/secIO吞吐率(磁盤每秒讀 /寫字節數)DiskBytes/secDiskReadBytes/secDiskWriteBytes/sec磁盤隊列長度Avg.DiskQueueLength :磁盤平均隊列長度不應超過 2,即:隊列長度/磁盤數磁盤有兩個重要的參數: Seektime、Rotational latency 。正常的I/O計數為:①1000/(Seektime+Rotationallatency)*0.75,在此范圍內屬正常。當達到%的I/O計數以上時則基本認為已經存在I/O瓶頸。理論、順序讀計數為。對于數據文件而言是隨機讀寫,日志文件是順序讀寫。因此,數據文件建議存放于RAID5件存放于RAID10或RAID1中。附:00IOPS00IOPS0:0IOPS下面假設在有 4塊硬盤的RAID5中觀察到的 PhysicalDisk 性能對象的部值:Avg.DiskQueueLength12 隊列長度Avg.DiskSec/Read.035 讀數據所用時間 msAvg.DiskSec/Write.045 寫數據所用時間 DiskReads/sec320 每秒讀數據量DiskWrites/sec100 每秒寫數據量Avg.DiskQueueLength ,12/4=3,每塊磁盤的平均隊列建議不超過 2Avg.DiskSec/Read 一般不要超過 。Avg.DiskSec/Write 一般建議小于 。從上面的結果,我們看到磁盤本身的 I/O 能力是滿足我們的要求的, 原因是因有大量的請求才導致隊列等待, 這很可能是因為你的 語句導致大量的表掃描所致。在進行優化后,如果還是不能達到要求, 下面的公式可以幫助你計算使用幾塊硬盤可以滿足這樣的并發要求 :Raid0--I/Osperdisk=(reads+writes)/numberofdisksRaid1--I/Osperdisk=[reads+(2*writes)]/2Raid5--I/Osperdisk=[reads+(4*writes)]/numberofdisksRaid10--I/Osperdisk=[reads+(2*writes)]/numberofdisks我們得到的結果是: (320+400)/4=180,這時你可以根據公式①來得到磁盤的正常I/O值。假設現在正常 I/O計數為為了達到這個結果: 720/125=5.76。就是說要用 6塊磁盤才能達到這樣的要求。但是上面的 DiskReads/sec 和DiskWrites/sec 是個很難正確估算的值。因此只能在系統比較忙時,大概估算一個平均值, 作為計算公式的依據。 另一個是很難從客戶那里得到 Seektime、Rotationallatency 參數的值,這也只能用理論值125進行計算。前言作為一個數據庫管理員,關注系統的性能是日常最重要的工作之一, 而在所關的各方面的性能只能 IO性能卻是最令人頭痛的一塊,面對著各種生澀的參數和令人眼花繚亂的新奇的術語, 再加上存儲廠商的忽悠,總是讓我們有種云里霧里的感覺本系列文章試圖從基本概念開始對磁盤存儲相關的各種概念進行綜合歸納,讓大家能夠對 IO性能相關的基本概念, IO性能的監控和調整有個比較全面的了解。在這一部分里我們先舍棄各種結構復雜的存儲系統, 直接研究一個單獨的磁盤性能問題,藉此了解各個衡量 IO系統系能的各個指標以及之間的關系。幾個基本的概念在研究磁盤性能之前我們必須先了解磁盤的結構, 以及工作原理。不過在這里不再重復說明了,關系硬盤結構和工作原理的信息可以參考維基百科上面的相關詞條——Harddiskdrive (英文)和硬盤驅動器(中文)。讀寫 IO(Read/WriteIO) 操作磁盤是用來給我們存取數據用的,因此當說到 IO操作的時候,就會存在兩種相對應的操作,存數據時候對應的是寫 IO操作,取數據的時候對應的是讀 IO作。單個 IO操作當控制磁盤的控制器接到操作系統的讀 IO操作指令的時候,控制器就會給磁盤發出一個讀數據的指令,并同時將要讀取的數據塊的地址傳遞給磁盤, 然后磁盤會將讀取到的數據傳給控制器,并由控制器返回給操作系統,完成一個寫 IO操作;同樣的,一個寫IO的操作也類似,控制器接到寫的 IO操作的指令和要寫入的數據,并將其傳遞給磁盤,磁盤在數據寫入完成之后將操作結果傳遞回控制器,再由控制器返回給操作系統, 完成一個寫IO的操作。單個IO操作指的就是完成一個寫 IO或者是讀IO的操作。隨機訪問(RandomAccess)與連續訪問 Access)隨機訪問指的是本次 IO所給出的扇區地址和上次 IO給出扇區地址相差比較大這樣的話磁頭在兩次 IO操作之間需要作比較大的移動動作才能重新開始讀 /寫數據。相反的,如果當次 IO給出的扇區地址與上次 IO結束的扇區地址一致或者是接近的話,那磁頭就能很快的開始這次 IO操作這樣的多個 IO操作稱為連訪問。因此盡管相鄰的兩次 IO操作在同一時刻發出,但如果它們的請求的扇區地址相差很大的話也只能稱為隨機訪問,而非連續訪問。順序 IO模式(QueueMode)/并發 IO模式(BurstMode)磁盤控制器可能會一次對磁盤組發出一連串的 IO命令,如果磁盤組一次只能執行一個IO命令時稱為順序 IO;當磁盤組能同時執行多個 IO命令時,稱為并IO。并發IO只能發生在由多個磁盤組成的磁盤組上,單塊磁盤只能一次處理一個IO命令。單個 IO的大小(IOChunkSize)熟悉數據庫的人都會有這么一個概念,那就是數據庫存儲有個基本的塊大小(BlockSize) ,不管是SQLServer還是Oracle,默認的塊大小都是 就是數據庫每次讀寫都是以 8k為單位的那么對于數據庫應用發出的固定 8k大小的單次讀寫到了寫磁盤這個層面會是怎么樣的呢,就是對于讀寫磁盤來說單個 IO操作操作數據的大小是多少呢, 是不是也是一個固定的值?答案是不確定。 首先操作系統為了提高 IO的性能而引入了文件系統緩存 (FileSystemCache) ,系統會根據請求數據的情況將多個來自 IO的請求先放在緩存里面,然后再一次性的提交給磁盤,也就是說對于數據庫發出的多個 8K數據塊的讀操作有可能放在一個磁盤讀 IO里就處理了。還有對于有些存儲系統也是提供了緩存 的接收到操作系統的 IO請求之后也是會將多個操作系統的 IO請求合并成一個來處理不管是操作系統層面的緩存還是磁盤控制器層面的緩存, 目的都只有一個提高數據讀寫的效率。因此每次單獨的 IO操作大小都是不一樣的,它主要取決于系統對于數據讀寫效率的判斷。當一次IO操作大小比較小的時候我們成為小的IO操作,比如說8K這樣的;當一次IO操作的數據量比較的的時候稱為大IO操作,比如說甚至更大。在我們說到塊大小( BlockSize)的時候通常我們會接觸到多個類似的概念,像我們上面提到的那個在數據庫里面的數據最小的管理單位, Oralce稱之為塊(Block) ,大小一般為 SQLServer稱之為頁(Page),一般大小也為 8k。在文件系統里面我們也能碰到一個文件系統的塊, 在現在很多的 Linux 系統中都是通過 /usr/bin/time -v 可以看到),它的作用其實跟數據庫里面的塊 /是一樣的,都是為了方便數據的管理。但是說到單次 IO的大小,跟這些塊的大小都是沒有直接關系的,在英文里單次 IO大小通常被稱為是 IOChunkSize,不會說成是 IOBlockSize 的。IOPS(IOperSecond)系統每秒所執行 IO操作的次數,是一個重要的用來衡量系統 IO能的一個參數。對于單個磁盤組成的 IO系統來說,計算它的 不是一件很難的事情,只要我們知道了系統完成一次 IO所需要的時間的話我們就能推算出系統IOPS來。現在我們就來推算一下磁盤的 假設磁盤的轉速(Rotational Speed)為平均尋道時間為 最大傳輸速率為 (這里將讀寫速度視為一樣,實際會差別比較大)。對于磁盤來說一個完整的 IO操作是這樣進行的:當控制器對磁盤發出一個 IO操作命令的時候,磁盤的驅動臂 (ActuatorArm) 帶讀寫磁頭(Head)離開著陸區(LandingZone,位于內圈沒有數據的區域 ),移動到要操作的初始數據塊所在的磁道(Track) 的正上方,這個過程被稱為尋址(Seeking)對應消耗的時間被稱為尋址時間(SeekTime)但是找到對應磁道還不能馬上讀取數據, 這時候磁頭要等到磁盤盤片(Platter) 旋轉到初始數據塊所在的扇區 (Sector) 落在讀寫磁頭正上方的之后才能開始讀取數據,在這個等待盤片旋轉到可操作扇區的過程中消耗的時間稱為旋轉延時(RotationalDelay) ;接下來就隨著盤片的旋轉,磁頭不斷的讀/寫相應的數據塊,直到完成這次 IO所需要操作的全部數據,這個過程稱為據傳送(DataTransfer) 對應的時間稱為傳送時間 (TransferTime) 完成這三個步驟之后一次IO操作也就完成了。在我們看硬盤廠商的宣傳單的時候我們經常能看到 3個參數分別是平均尋址間盤片旋轉速度以及最大傳送速度, 這三個參數就可以提供給我們計算上述三個步驟的時間。第一個尋址時間考慮到被讀寫的數據可能在磁盤的任意一個磁道, 既有可能磁盤的最內圈(尋址時間最短),也可能在磁盤的最外圈(尋址時間最長),所以在計算中我們只考慮平均尋址時間, 也就是磁盤參數中標明的那個平均尋址時間,這里就采用當前最多的 10krmp硬盤的。第二個旋轉延時和尋址一樣,當磁頭定位到磁道之后有可能正好在要讀寫扇區之上,這時候是不需要額外額延時就可以立刻讀寫到數據, 但是最壞的情況確要磁盤旋轉整整一圈之后磁頭才能讀取到數據, 所以這里我們也考慮的是平均旋轉延時,對于 10krpm的磁盤就是(60s/15k)*(1/2)=2ms 。第三個傳送時間磁盤參數提供我們的最大的傳輸速度, 當然要達到這種速度很有難度的,但是這個速度卻是磁盤純讀寫磁盤的速度,因此只要給定了單次IO的大小,我們就知道磁盤需要花費多少時間在數據傳送上,這個時間就是IOChunkSize/MaxTransferRate 。現在我們就可以得出這樣的計算 單次IO時間的公式:IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Size/Transfer Rate于是我們可以這樣計算出 IOPSIOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2+ IOChunk Size/Transfer Rate)對于給定不同的 IO大小我們可以得出下面的一系列的數據4K (1/7.1 ms = 140 IOPS)5ms + (60sec/15000RPM/2) + 4K/40MB = 5 + 2 + 0.1 =7.18k (1/7.2 ms = 139 IOPS)5ms + (60sec/15000RPM/2) + 8K/40MB = 5 + 2 + 0.2 =7.216K (1/7.4 ms = 135 IOPS)+16K/40MB=5+2+16K/40MB=5+2+0.4=+32K/40MB=5+2+0.8=+64K/40MB=5+2+1.6=7.432K (1/7.8 ms = 128 IOPS)5ms + (60sec/15000RPM/2)7.864K (1/8.6 ms = 116 IOPS)5ms + (60sec/15000RPM/2)8.6從上面的數據可以看出, 當單次IO越小的時候,單次 IO所耗費的時間也越少相應的IOPS也就越大。上面我們的數據都是在一個比較理想的假設下得出來的, 這里的理想的情況就是磁盤要花費平均大小的尋址時間和平均的旋轉延時, 這個假設其實是比較符合我們實際情況中的隨機讀寫,在隨機讀寫中,每次 IO操作的尋址時間和旋轉延時都不能忽略不計,有了這兩個時間的存在也就限制了 IOPS的大小。現在我們考慮一種相對極端的順序讀寫操作, 比如說在讀取一個很大的存儲連續分布在磁盤的文件,因為文件的存儲的分布是連續的,磁頭在完成一個讀 IO操作之后,不需要從新的尋址,也不需要旋轉延時,在這種情況下我們能到一個很大的 值,如下4K(1/0.1ms=10000 IOPS)0ms+0ms+ 4K/40MB =0.18k(1/0.2ms=5000 IOPS)0ms+0ms+ 8K/40MB =0.216K(1/0.4ms =2500 IOPS)0ms+ 0ms+ 16K/40MB=0.432K(1/0.8ms =1250 IOPS)0ms+ 0ms+ 32K/40MB=0.864K(1/1.6ms =625 IOPS)0ms+ 0ms+ 64K/40MB=1.6相比第一組數據來說差距是非常的大的,因此當我們要用 IOPS來衡量一個 IO系統的系能的時候我們一定要說清楚是在什么情況的 也就是要說明讀寫的方式以及單次 IO的大小,當然在實際當中,特別是在的系統的,隨機小IO的讀寫是最有說服力的。傳輸速度(TransferRate)/ 吞吐率(Throughput)現在我們要說的傳輸速度(另一個常見的說法是吞吐率) 不是磁盤上所表明的大傳輸速度或者說理想傳輸速度, 而是磁盤在實際使用的時候從磁盤系統總線上流過的數據量。有了 IOPS數據之后我們是很容易就能計算出對應的傳輸速度來的Transfer Rate = IOPS * IO Chunk Size8K:139* 8K=1112K/40M=2.71%16K:135* 16K=2160K/40M=5.27%32K:116* 32K8K:139* 8K=1112K/40M=2.71%16K:135* 16K=2160K/40M=5.27%32K:116* 32K=3712K/40M=9.06%可以看出實際上的傳輸速度是很小的,對總線的利用率也是非常的小。這里一定要明確一個概念,那就是盡管上面我們使用 IOPS來計算傳輸速度,但是實際上傳輸速度和 IOPS是沒有直接關系,在沒有緩存的情況下它們共同的決定因素都是對磁盤系統的訪問方式以及單個 IO的大小。對磁盤進行隨機訪問時候我們可以利用 IOPS來衡量一個磁盤系統的性能,此時的傳輸速度不會太大;但是當對磁盤進行連續訪問時,此時的 IOPS已經沒有了參考的價值,這個時候限制實際傳輸速度卻是磁盤的最大傳輸速度。因此在實際的應用當中,只會用IOPS 來衡量小IO的隨機讀寫的性能,而當要衡量大 IO連續讀寫的性能的時就要采用傳輸速度而不能是 IOPS了。IO響應時間(IOResponseTime)最后來關注一下能直接描述 IO性能的IO響應時間。IO響應時間也被稱為 IO時(IOLatency) ,IO響應時間就是從操作系統內核發出的一個讀或者寫的 IO命令到操作系統內核接收到 IO回應的時間,注意不要和單個 IO時間混淆了,單個IO時間僅僅指的是 IO操作在磁盤內部處理的時間,而 IO響應時間還要包括 IO操作在IO等待隊列中所花費的等待時間。計算IO操作在等待隊列里面消耗的時間有一個衍生于利托氏定理(Little’sLaw)的排隊模型M/M/1模型可以遵循,由于排隊模型算法比較復雜,到現在還沒有搞太明白(如果有誰對M/M/1模型比較精通的話歡迎給予指導這里就羅列一下最后的結果,還是那上面計算的IOPS數據來說:8K IO Chunk Size (135 IOPS, 7.2 135 => 240.0 ms105 => 29.5 ms75 => 15.7 ms45 => 10.6 ms64KIOChunkSize(116IOPS,8.6ms)135 => 沒響應了??105 => 88.6 ms75 => 24.6 ms45 => 14.6 ms從上面的數據可以看出,隨著系統實際 IOPS越接近理論的最大值, IO的響應間會成非線性的增長,越是接近最大值,響應時間就變得越大, 而且會比預期超出很多。一般來說在實際的應用中有一個 的指導值,也就是說在 IO讀寫的隊列中,當隊列大小小于最大 IOPS的的時候,IO的響應時間增加會很小,相對來說讓人比較能接受的,一旦超過 響應時間就會戲劇性的暴增,所以當一個系統的 IO壓力超出最大可承受壓力的 的時候就是必須要考慮調整或升級了。另外補充說一下這個的指導值也適用于過的,一旦超過精品文檔交流精品文檔交流從上一篇文章的計算中我們可以看到一個 15k轉速的磁盤在隨機讀寫訪問的情況下IOPS竟然只有140左右,但在實際應用中我們卻能看到很多標有 甚至更高的存儲系統,有這么大 IOPS的存儲系統怎么來的呢?這就要歸結于各種存儲技術的使用了,在這些存儲技術中使用最廣的就是高速緩存 (Cache)和磁盤冗余陣列(RAID)了,本文就將探討緩存和磁盤陣列提高存儲 IO性能的方法。高速緩存(Cache)在當下的各種存儲產品中,按照速度從快到慢應該就是內存 閃存磁盤磁帶了然而速度越快也就意味著價格越高, 閃存雖然說是發展勢頭很好, 但目前來說卻還是因為價格問題無法普及, 因此現在還是一個磁盤作霸王的時代。 與和內存速度相比,磁盤的速度無疑是計算機系統中最大的瓶頸了, 所以在必須使用磁盤而又想提高性能的情況下,人們想出了在磁盤中嵌入一塊高速的內存 用來保存經常訪問的數據從而提高讀寫效率的方法來折中的解決, 這塊嵌入的內存就被稱為高速緩存。說到緩存,這東西應用現在已經是無處不在, 從處于上層的應用,到操作系統層再到磁盤控制器,還有內部,單個磁盤的內部也都存在緩存, 所有這些緩存存在的目的都是相同的,就是提高系統執行的效率。當然在這里我們只關心跟IO性能相關的緩存,與 IO性能直接相關的幾個緩存分別是 文件系統緩存(FileSystemCache) 、磁盤控制器緩存(DiskControllerCache) 和磁盤緩存(DiskCache,也稱為DiskBuffer) ,不過當在計算一個磁盤系統性能的時候文件系統緩存也是不會考慮在內的, 因此我們重點考察的就是磁盤控制器緩存和磁緩存。不管是控制器緩存還是磁盤緩存,他們所起的作用主要是分為三部分: 緩存數據預讀(Read-ahead)和回寫(Write-back) 。緩存數據首先是系統讀取過的數據會被緩存在高速緩存中, 這樣下次再次需要讀取相同的數據的時候就不用在訪問磁盤, 直接從緩存中取數據就可以了。 當然使用過的據也不可能在緩存中永久保留的,緩存的數據一般那是采取 算法來進行管理目的是將長時間不用的數據清除出緩存, 那些經常被訪問的卻能一直保留在緩存中,直到緩存被清空。預讀預讀是指采用預讀算法在沒有系統的IO請求的時候事先將數據從磁盤中讀入到緩存中,然后在系統發出讀IO請求的時候,就會實現去檢查看看緩存里面是否存在要讀取的數據,如果存在(即命中)的話就直接將結果返回,這時候的磁盤精品文檔交流精品文檔交流不再需要尋址、旋轉等待、讀取數據這一序列的操作了, 這樣是能節省很多時的;如果沒有命中則再發出真正的讀取磁盤的命令去取所需要的數據。緩存的命中率跟緩存的大小有很大的關系, 理論上是緩存越大的話,所能緩存的數據也就越多,這樣命中率也自然越高, 當然緩存不可能太大, 畢竟成本在那兒呢如果一個容量很大的存儲系統配備了一個很小的讀緩存的話, 這時候問題會比較大的,因為小緩存的數據量非常小, 相比整個存儲系統來說比例非常低, 樣隨機讀取(數據庫系統的大多數情況) 的時候命中率也自然就很低, 這樣的緩存不但不能提高效率(因為絕大部分讀 IO都還要讀取磁盤),反而會因為每次去匹配緩存而浪費時間。執行讀IO操作是讀取數據存在于緩存中的數量與全部要讀取數據的比值稱為緩存命中率(ReadCacheHitRadio) ,假設一個存儲系統在不使用緩存的情況下機小IO讀取能達到 而它的緩存能提供 的緩存命中率的話,那么際上它的IOPS可以達到150/(1-10%)=166。回寫首先說一下,用于回寫功能的那部分緩存被稱為寫緩存 (WriteCache)在一套緩存打開的存儲中,操作系統所發出的一系列寫 IO命令并不會被挨個的執行,這些寫IO的命令會先寫入緩存中,然后再一次性的將緩存中的修改推到磁盤中,這就相當于將那些相同的多個 IO合并成一個,多個連續操作的小 IO合并成一大的還有就是將多個隨機的寫 IO變成一組連續的寫 這樣就能減少磁盤尋址等操作所消耗的時間,大大的提高磁盤寫入的效率。讀緩存雖然對效率提高是很明顯的, 但是它所帶來的問題也比較嚴重, 因為緩存和普通內存一樣,掉點以后數據會全部丟失,當操作系統發出的寫 IO命令寫入到緩存中后即被認為是寫入成功, 而實際上數據是沒有被真正寫入磁盤的, 此時如果掉電,緩存中的數據就會永遠的丟失了, 這個對應用來說是災難性的, 目解決這個問題最好的方法就是給緩存配備電池了, 保證存儲掉電之后緩存數據能如數保存下來。和讀一樣,寫緩存也存在一個寫緩存命中率(WriteCacheHitRadio)緩存命中情況不一樣的是,盡管緩存命中,也不能將實際的IO操作免掉,只是被合并了而已。控制器緩存和磁盤緩存除了上面的作用之外還承當著其他的作用,比如磁盤緩存有保存IO命令隊列的功能,單個的磁盤一次只能處理一個IO命令,但卻能接收多個IO命令,這些進入到磁盤而未被處理的命令就保存在緩存中的IO隊列中。RAID(RedundantArrayOfInexpensiveDisks)如果你是一位數據庫管理員或者經常接觸服務器,那對 RAID應該很熟悉了,作為最廉價的存儲解決方案, RAID早已在服務器存儲中得到了普及。在 RAID的各個級別中,應當以和(不過已經基本走到頭了,6正在崛起中,看看這里了解下原因)應用最廣了。下面將就 這幾種級別的 RAID展開說一下磁盤陣列對于磁盤性能的影響,當然在閱讀下面的內容之前你必須對各個級別的 RAID的結構和工作原理要熟悉才行,這樣才不至于滿頭霧水,推薦查看 wikipedia 上面的如下條目: StandardRAIDlevels ,NestedRAIDlevels 。RAID0RAID0將數據條帶化(striping) 將連續的數據分散在多個磁盤上進行存取, 系發出的IO命令(不管讀 IO和寫IO都一樣)就可以在磁盤上被并行的執行,每個磁盤單獨執行自己的那一部分請求,這樣的并行的 IO操作能大大的增強整個存儲系統的性能。假設一個 RAID0陣列有n(n>=2)個磁盤組成,每個磁盤的隨機讀寫的IO能力都達到 140的話,那么整個磁盤陣列的 IO能力將是 140*n。同如果在陣列總線的傳輸能力允許的話 RAID0的吞吐率也將是單個磁盤的 n倍。RAID1RAID1在容量上相當于是將兩個磁盤合并成一個磁盤來使用了,互為鏡像的兩個磁盤里面保存的數據是完全一樣的,因此在并行讀取的時候速度將是n個磁盤速寫入速度只有n/2。RAID5我們那一個有 n(n>=3)個磁盤的 陣列來看,首先看看 RAID5陣列的讀 RAID5是支持并行 IO的,而磁盤上的數據呈條帶狀的分布在所有的磁盤上,因此讀IO的速度相當于所有磁盤速度的總和。 不過這是在沒有磁盤損壞的情況下,當有一個磁盤故障的時候讀取速度也是會下降的, 因為中間需要花時間來計算失磁盤上面的數據。讀取數據的情況相對就要復雜的多了,先來看下 RAID5奇偶校驗數據寫入的過程,我們把寫入的數據稱為 當磁盤拿到一個寫 IO的命令的時候,它首先會讀取一次要寫入的地址的數據塊中修改之前的數據 然后再讀取到當前條帶中的校驗信息 接下來就根據 這三組數據計算出數據寫入之后的條帶的奇偶校驗信息 最后發出兩個寫 IO的命令,一個寫入 另一個寫奇偶校驗信息 。可以看出陣列在實際操作的時候需要讀、讀、寫、寫一共 4個 IO才能完成一次寫 IO操作,也就是實際上的寫入速度只有所有磁盤速度總和的1/4從這點可以看出 RAID5是非常不適合用在要大批量寫入數據的系統的。RAID6RAID6和很類似,差別就在于 RAID6多了一個用于校驗的磁盤。就讀 IO速度上來說這兩個是完全一樣的,都是所有磁盤 IO速度的總和。在寫IO上也很是類似,不同的是 將一個命令分成了三次讀、三次寫一共 次IO命令才能完成,也就是 RAID6實際寫入磁盤的速度是全部磁盤速度之和的1/6。可以看出從寫 IO看RAID6比RAID5差別是很大的。RAID10RAID0 讀寫速度都很好,卻沒有冗余保護; 和RAID6都有同樣的毛病就是寫入的時候慢,讀取的時候快。那么 RAID1呢?嗯,這里要說的就是 其實不管是 RAID10還是其實都是組合大于 2塊磁盤時候的 當先鏡像后條帶時候就稱為 先條帶后鏡像的時候稱為 。從性能上看RAID01和RAID10都是一樣的,都是 RAID1嘛,但是RAID10在重建故障磁盤的時候性能比 RAID01 要快。因為 其實就是所以它的性能與RAID1也就是一樣的了,這里不需要再做過多的討論。四個性能指標的變化IO響應時間(IOResponseTime)在任何時候 IO響應時間值得都是單個 IO的響應時間,因此,不管磁盤是否組成了磁盤陣列,它的IO響應時間應該都是一樣的。 從前面的計算中我們可以看到如果IO響應時間在 10ms左右的話是很正常的,但是當 IO響應時間比這個值超出太多的時候,你就要開始注意了,很可能就意味著此時你的磁盤系統已經成為了一個瓶頸。IOPS綜合上面兩個部分的討論我們來估算一下陣列下的磁盤總體 在這里我們先假設組成陣列的單個磁盤的隨機讀寫的 IOP為讀寫緩存命中率都為 組成陣列的磁盤個數為 。因為不管是那種陣列,磁盤的讀取性能都是所有磁盤之和, 所以可以得出下面讀取精品文檔交流精品文檔交流read IOPS = disk_IOPS/(1-read_cache_hit_ratio)*disk_num 0%)*4 = 622而寫入性能就完全不一樣了,根據上面的討論我們可以得出下面結論:RAID0:1IOrequest=>need1actualIOondiskRAID1:1IOrequest=>need2actualIOondiskRAID5:1IOrequest=>need4actualIOondiskRAID6:1IOrequest=>need6actualIOondisk由此我們也可以計算出寫入 IOPS估算公式:RAID0 write IOPS ure_IO_num =140/(1-10%)*4/1 = 622RAID1 write IOPS =disk_IOPS/(1-write_cache_hit_ratio)*disk_num/acture_IO_num =140/(1-10%)*4/2 = 311RAID5 write IOPS ure_IO_num =140/(1-10%)*4/4 = 155RAID6 write IOPS ure_IO_num =140/(1-10%)*4/6 = 103實際上從通過上面的計算方法我們還可以估算當給定一個要求的 IOPS的情況下估計下使用各個陣列級別所需要的磁盤的數量。 當然我們上面的計算方法只是一個估算,我們忽略很多其他的因素, 得出的只是一個大概的數值, 不過在際的應用還是有一定的參考作用的。本篇最后附送一個計算磁盤系統 IOPS的網站――’sk&kcalculator 這個網站提供的計算公式還考慮了諸如陣列條帶大小以及主機方面的因素,很有參考價值,至于怎么選擇合適的條帶大小,請參考【延伸閱讀】部分。傳輸速度(TransferRate)/ 吞吐率(Throughput)實際上估算除了隨機讀寫的 IOPS也就知道了隨機讀寫的吞吐率。對于順序讀寫的呢,還是跟前一篇所講的一樣,主要受限于磁盤的限制,不能再拿 IOPS來量了。random_throughtput = random_IOPS * IO_chunk_size能部室由企管部統一考核)。不符合衛生標準的,超市內每處扣0.5分,超市外每處扣1分。衛生管理制度1 總則1.1 為了加強公司的環境衛生管理,創造一個整潔、文明、溫馨的購物、辦公環境,根據《公共場所衛生管理條例》的要求,特制定本制度。1.2 集團公司的衛生管理部門設在企管部,并負責將集團公司的衛生區域詳細劃分到各部室,各分公司所轄區域衛生由分公司客服部負責劃分,確保無遺漏。2 衛生標準2.1 室內衛生標準2.1.1 地面、墻面:無灰塵、無紙屑、無痰跡、無泡泡糖等粘合物、無積水,墻角無灰吊、無蜘蛛網。2.1.2 門、窗、玻璃、鏡子、柱子、電梯、樓梯、燈具等,做到明亮、無灰塵、無污跡、無粘合物,特別是玻璃,要求兩面明亮。2.1.3 柜臺、貨架:清潔干凈,貨架、柜臺底層及周圍無亂堆亂放現象、無灰塵、無粘合物,貨架頂部、背部和底部干凈,不存放雜物和私人物品。2.1.4 購物車(筐)、直接接觸食品的售貨工具(包括刀、叉等):做到內外潔凈,無污垢和粘合物等。購物車(筐)要求每天營業前簡單清理,周五全面清理消毒;售貨工具要求每天消毒,并做好記錄。2.1.5 商品及包裝:商品及外包裝清潔無灰塵(外包裝破損的或破舊的不得陳列)。2.1.6 收款臺、服務臺、辦公櫥、存包柜:保持清潔、無灰塵,臺面和側面無灰塵、無灰吊和蜘蛛網。桌面上不得亂貼、亂畫、亂堆放物品,用具擺放有序且干凈,除當班的購物小票收款聯外,其它單據不得存放在桌面上。2.1.7 垃圾桶:桶內外干凈,要求營業時間隨時清理,不得溢出,每天下班前徹底清理,不得留有垃圾過夜。2.1.8 窗簾:定期進行清理,要求干凈、無污漬。2.1.9 吊飾:屋頂的吊飾要求無灰塵、無蜘蛛網,短期內不適用的吊飾及時清理徹底。2.1.10 內、外倉庫:半年徹底清理一次,無垃圾、無積塵、無蜘蛛網等。2.1.11 室內其他附屬物及工作用具均以整潔為準,要求無灰塵、無粘合物等污垢。Windows性能計數器-- 磁盤性能分析 DiskPhysicalDisk :單次IO大小Avg.DiskBytes/ReadAvg.DiskBytes/WriteIO響應時間Avg.Disksec/Read 磁盤每次讀取需要的時間,一般不超過一般不要超過11~15ms。Avg.Disksec/Write 一般小于每秒讀/寫的IO數)理論情況下,磁盤的隨機讀計數為 、 順序讀計數為 實際測試值與理論值對比,從而判斷磁盤是否為瓶頸DiskReads/secDiskWrites/secDiskTransfers/secIO吞吐率(磁盤每秒讀 /寫字節數)DiskBytes/secDiskReadBytes/secDiskWriteBytes/sec磁盤隊列長度Avg.DiskQueueLength :磁盤平均隊列長度不應超過 2,即:隊列長度/磁盤數磁盤有兩個重要的參數: Seektime、Rotational latency 。正常的I/O計數為:①1000/(Seektime+Rotationallatency)*0.75,在此范圍內屬正常。當達到%的I/O計數以上時則基本認為已經存在I/O瓶頸。理論、順序讀計數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論