【轉】SQLSERVER磁盤原理

  【聲明:本篇博客轉載自http://www.cnblogs.com/ljhdo/p/5149401.html】html

  最近一段時間的工做主要是與SQLSERVER數據庫打交道,須要對SQLSERVER有一個比較全面的認識。故也在捉急的翻閱資料,學習這個經典的關係型數據庫。sql

性能計數器(Performance Counter)是量化系統狀態或活動的一個數值,Windows Performance Monitor在必定時間間隔內(默認的取樣間隔是15s)獲取Performance Counter的當前值,並記錄在Data Collections中,經過Performance Monitor可以查看系統的性能數據,是故障排除的極佳工具。Performance Counter數量不少,若是不瞭解計數器的功能,在選擇計數器時,每每不知所措。因爲SQL Server 是IO密集型的應用程序,常常須要進行大量的讀寫操做,從Disk讀取數據到內存,將內存中的數據寫入到Disk,所以,Disk和內存是SQL Server的生命線,監控SQL Server 的性能,常常用到的性能計數器是Disk和內存。數據庫

一,Disk性能監控windows

1,Disk的結構緩存

典型的機械Disk的結構主要有:磁頭(head),磁道(track),扇區(sector),盤面(Platter),柱面(cylinder)和簇(cluster)。如圖,服務器

當磁盤旋轉時,若磁頭保持在一個位置上,則每一個磁頭都會在磁盤表面劃出一個圓形軌跡,這些圓形軌跡叫作磁道。磁盤上的每一個磁道被等分爲若干個弧段,這些弧段是磁盤的扇區,每一個磁道上的扇區數量是相等的,每一個扇區存放512個字節的信息,磁盤驅動器在向磁盤讀取和寫入數據時,以扇區爲單位。若干個連續的扇區組合爲一個簇,文件存取是以簇爲單位的。app

硬盤一般由重疊的一組盤片構成,每一個盤面都被劃分爲數目相等的磁道,並從外緣的"0"向中心開始編號,具備相同編號的磁道造成一個圓柱,稱之爲磁盤的柱面。磁盤的柱面數與一個盤面上的磁道數是相等的。因爲每一個盤面都有本身的磁頭,所以,盤面數等於總的磁頭數。所謂硬盤的CHS,是指Cylinder(柱面)、Head(磁頭)、Sector(扇區),硬盤的容量=柱面數×磁頭數×扇區數×512B。ide

扇區是能獨立尋址的最小單位,簇是資源分配的最小單位。Disk的一次讀寫操做,由尋道,旋轉延遲和數據傳輸組成,因爲尋道和旋轉延遲佔用了讀寫操做的大部分時間,Disk在執行每次讀寫操做時,採起就近原則,讀寫連續的N個扇區,讀寫的數據量是4KB的整數倍。工具

2,順序讀寫和隨機讀寫性能

隨機讀寫是指數據分佈在不一樣的磁道上,Disk的磁頭必須移動磁道,才能讀取到相應的數據;順序讀寫是指數據分佈在同一磁道的相鄰扇區中,在讀寫數據時,Disk的磁頭不須要移動磁道。因爲,Disk的磁道移動是機械運動,「很慢」,佔讀寫數據所用時間的絕大部分,所以,Disk的順序讀寫速度遠遠高於隨機讀寫速速,應儘可能避免隨機讀寫。Disk,固態硬盤盒內存的讀寫速度對比:

3,硬盤性能計數器

在OS Level上,Windows在一塊物理硬盤上分紅多個邏輯分區,每個邏輯分區叫作一個Logical Disk,經過盤符標識,運行在Windows上的Application使用盤符來尋址。對於分配在同一塊物理硬盤上的邏輯分區,共享物理硬盤的讀寫帶寬,至關於在一塊物理硬盤上工做。所以,Disk計數器分爲兩組:PhysicalDisk 和 LogicalDisk,LogcialDisk計數器記錄每一個邏輯分區的讀寫計數,用於分析特定的Application在不一樣的邏輯分區上的Disk IO活動和性能參數;PhysicalDisk計數器記錄整個物理Disk的性能指標,用於瞭解Disk的響應速度,主要使用PhysicalDisk計數器,分析Disk的性能問題。

系統級常常用到的Disk性能計數器是PhysicalDisk計數器,LogcialDisk僅供參考:

  • %Disk Time :表示Disk的忙碌程度,是Disk處理讀寫請求的時間的百分比,常常大於100%,建議使用%IdleTime反推出Disk處於讀寫狀態的百分比
  • Disk Reads/sec :每秒向Disk請求讀操做的次數
  • Disk Transfers/sec:Disk每秒執行讀寫操做的次數
  • Disk Reads Bytes/sec :在Disk執行讀操做時,每秒從Disk讀取的字節數量
  • Disk Bytes/sec:當Disk執行讀寫操做時,每秒從Disk讀取到內存的,或從內存寫入到Disk的字節數量,好的Disk,其值在20-40MB之間,差的Disk,其值在20MB如下。
  • Avg. Disk Queue Length :提供Disk阻塞程度的主要度量值,表示在 sample interval期間,Disk等待處理的IO請求隊列的平均長度,即等待被Disk處理的IO請求的數量,隊列的長度要考慮到RAID,若是存儲後臺使用100塊物理disk,那麼該計數值達到100,這個值是正常的,理論上,每塊物理disk的隊列長度不該該長時間大於2.
  • Avg. Disk sec/Transfer:Disk每一次讀寫操做所用的平均時間
  • Avg. Disk sec/Read:Disk每一次讀操做所用的平均時間 
  • Avg. Disk sec/Write:Disk每一次寫操做所用的平均時間

avg.Disk sec/(Transfer,Read,Write),可以很好的反映Disk的IO速度,因此這三個計數值常常用來衡量Disk的IO速度:

  • 很好:<10ms
  • 通常:10-20ms
  • 有點慢:20-50ms
  • 很是慢:>50ms

二,系統物理內存性能計數器

SQL Server在運行的過程當中,會持續地向內存中加載大量數據,若是數據長期駐留在內存中,那麼SQL Server 不須要申請Disk IO請求,就能直接訪問數據,快速響應用戶的請求。若是SQL Server訪問的數據不在內存中,將會產生一個Hard Page Fault,那麼SQL Server首先指示存儲引擎將數據頁從Disk加載到內存中,產生PageIOLatch等待,等到數據被加載到內存以後,SQL Server在內存中訪問數據,處理用戶請求,因爲Disk 的IO速度較慢,延遲高,大量的Hard Page Fault將嚴重影響SQL Server響應用戶請求的速度,所以,經常使用的系統級內存計數器跟缺頁中斷有關:

  • Memory:Page Faults/sec :每秒發生的Page Fault的數量,Page Fault包括Hard Fault 和 Soft Fault,Hard fault表示須要從Disk中讀取數據頁,Soft fault表示須要從Physical Memory中讀取數據頁,Soft Fault不會影響性能,因爲Hard Fault須要訪問Disk,會產生顯著的延遲。
  • Memory:Pages Input/sec:每秒發生的Hard Fault的數量,用於計算Hard Fault的百分比: Pages Input / Page Faults = % Hard Page Faults,若是百分比常常大於40%,說明系統須要常常訪問Disk獲取數據,在必定程度上說明系統存在內存壓力。
  • Memory:Pages/sec:每秒從Disk讀取或寫入Disk的Page數量,表示內存和Disk交互的Page的數量:將Page存儲到Disk或從Disk讀取數據到內存的Page的數量。

三,SQL Server的Buffer Manager計數器

Buffer Manager計數器用於監視SQL Server如何使用內存數據頁和計劃緩存,讀取和寫入數據頁時的Disk IO。因爲Buffer Pool是SQL Server內存最活躍,使用最多的部分,因此也是最容易出現性能瓶頸的部分,計數值尤爲重要:

  • Buffer Cache hit ration:從Buffer Pool中直接讀取,不須要從Disk中讀取的數據頁的百分比,也叫命中率,這個計數器表示,在SQL Server讀取數據時,數據存在於內存中,跟數據駐留在內存中的時間和內存壓力關係不大,僅供參考。
  • Page Writes/sec:每秒寫入到Disk的數據頁數,和內存使用關係不大,跟用戶修改的數據量有關
  • CheckPoint Pages/sec:將數據刷新到Disk的Dirty Pages的數量,和內存使用關係不大,跟用戶修改的數據量有關,若是用戶對數據庫作了不少修改操做,那麼內存中修改過的數據髒頁就會比較多,每次刷新的髒頁數量就會比較大
  • Lazy Writes/sec:被LazyWriter刷新的buffer數量,若是是髒頁,那麼將buffer寫入到Disk,並將buffer空間標記爲Free,若是不是髒頁,那麼該buffer空間也被標記爲Free,LazyWriter的做用是維護必定數量的Free buffer,SQL Server使用Free buffer來加載新的數據頁。
  • Page Life Expectancy:PLE,數據頁駐留在內存中的時間。若是SQL Server沒有新的內存需求,或有空閒的內存來完成新的內存需求,那麼Lazy Writer不會被處罰,Page會一直駐留在Buffer Pool中,那麼Page Life Expectancy會維持在一個比較高的水平;若是Page Life老是高高低低,代表SQL Server存在內存壓力。PLE的參考數值是:Max Server Memory/4GB*300s,若是PLE值長期低於參考值,內存可能存在瓶頸。
  • Page Reads/sec:每秒從Disk讀取的數據頁數,即物理讀的次數,若是用戶訪問的數據都緩存在內存中,那麼SQL Server不須要從物理Disk上讀取頁面。因爲物理IO的開銷大,Page Reads操做必定會影響SQL Server的性能。
  • Free list stalls/sec:等待一個Free Page的請求數量,SQL Server申請從Disk加載一個Page到內存中,必須在內存中分配一個Buffer,Buffer Manager負責維護Free Buffer List,若是Free List沒有任何Free Buffer,那麼請求必須等待,直到有空閒的Buffer使用,才能將Disk中的Page加載到內存中。

常用後四種計數器,探測系統的內存壓力,前三種,僅供參考,在此,感謝 wy123 的幫助。

四,SQL Server的Memory Manager計數器

Memory Manager計數器用於監控服務器內存整體使用狀況,在一個很是繁忙的系統中,Lock內存和授予內存是經常使用的計數器:

  • Total Server Memory (KB):SQL Server當前使用的內存總量
  • Target Server Memory (KB):SQL Server可以使用的內存總量
  • Lock Memory (KB):SQL Server用於鎖的內存總量
  • Grant Workspace Memory (KB):授予內存,SQL Server用於執行hash,排序和建立Index操做而消耗的內存總量
  • Memory Grants Pending (KB):等待內存授予的進程數量,若是進程不能得到指定數量的內存,那麼進程將不會開始執行

五,使用Performance Counter監控SQL Server數據庫系統的總體性能

建立兩個Data Set:Disk Activity,用於監控物理磁盤的活動;Memory Activity ,用於監控系統內存的Hard Fault和SQL Server的內存使用。

 

下文摘抄自《硬盤的讀寫原理》,做者是真實的歸宿,寫的很是詳細:

訪盤請求完成過程

當須要從磁盤讀取數據時,系統會將數據邏輯地址傳給磁盤,磁盤的控制電路按照尋址邏輯將邏輯地址翻譯成物理地址,即肯定要讀的數據在哪一個磁道,哪一個扇區。 爲了讀取這個扇區的數據,須要將磁頭放到這個扇區上方,爲了實現這一點,磁頭須要移動對準相應磁道,這個過程叫作尋道,所耗費時間叫作尋道時間,而後磁盤 旋轉將目標扇區旋轉到磁頭下,這個過程耗費的時間叫作旋轉時間。

即一次訪盤請求(讀/寫)完成過程由三個動做組成:

  • 尋道(時間):磁頭移動定位到指定磁道
  • 旋轉延遲(時間):等待指定扇區從磁頭下旋轉通過
  • 數據傳輸(時間):數據在磁盤與內存之間的實際傳輸

所以在磁盤上讀取扇區數據(一塊數據)所需時間:Ti/o=尋道時間 +旋轉時間 + n *傳輸時間

磁盤的讀寫原理

系統將文件存儲到磁盤上時,按柱面、磁頭、扇區的方式進行,即最早是第1磁道的第一磁頭下(也就是第1盤面的第一磁道)的全部扇區,而後,是同一柱面的下一磁頭,……,一個柱面存儲滿後就推動到下一個柱面,直到把文件內容所有寫入磁盤。系統也以相同的順序讀出數據。讀出數據時經過告訴磁盤控制器要讀出扇區所在的柱面號、磁頭號和扇區號(物理地址的三個組成部分)進行。磁盤控制器則直接使磁頭部件移動到相應的柱面,選通相應的磁頭,等待要求的扇區移動到磁頭下。在扇區到來時,磁盤控制器對扇區進行讀寫操做。

局部性原理與磁盤預讀

因爲存儲介質的特性,磁盤自己存取就比主存慢不少,再加上機械運動耗費,磁盤的存取速度每每是主存的幾百分分之一,所以爲了提升效率,要儘可能減小磁盤I/O。爲了達到這個目的,磁盤每每不是嚴格按需讀取,而是每次都會預讀,即便只須要一個字節,磁盤也會從這個位置開始,順序向後讀取必定長度的數據放入內存。這樣作的理論依據是計算機科學中著名的局部性原理:

  • 當一個數據被用到時,其附近的數據也一般會立刻被使用。
  • 程序運行期間所須要的數據一般比較集中。
  • 因爲磁盤順序讀取的效率很高(不須要尋道時間,只需不多的旋轉時間),所以對於具備局部性的程序來講,預讀能夠提升I/O效率。

預讀的長度通常爲頁(page)的整倍數,頁是計算機管理存儲器的邏輯塊,硬件及操做系統每每將主存和磁盤存儲區分割爲連續的大小相等的塊,每一個存儲塊稱爲一頁(在許多操做系統中,頁得大小一般爲4k),主存和磁盤以頁爲單位交換數據。當程序要讀取的數據不在主存中時,會觸發一個缺頁異常,此時系統會向磁盤發出讀盤信號,磁盤會找到數據的起始位置並向後連續讀取一頁或幾頁載入內存中,而後異常返回,程序繼續運行。

 

拓展閱讀:經常使用的系統內存性能計數器的描述

Page Faults/sec is the average number of pages faulted per second. It is measured in number of pages faulted per second because only one page is faulted in each fault operation, hence this is also equal to the number of page fault operations. This counter includes both hard faults (those that require disk access) and soft faults (where the faulted page is found elsewhere in physical memory.) Most processors can handle large numbers of soft faults without significant consequence. However, hard faults, which require disk access, can cause significant delays.

Page Reads/sec is the rate at which the disk was read to resolve hard page faults. It shows the number of reads operations, without regard to the number of pages retrieved in each operation. Hard page faults occur when a process references a page in virtual memory that is not in working set or elsewhere in physical memory, and must be retrieved from disk. This counter is a primary indicator of the kinds of faults that cause system-wide delays. It includes read operations to satisfy faults in the file system cache (usually requested by applications) and in non-cached mapped memory files. Compare the value of Memory\\Pages Reads/sec to the value of Memory\\Pages Input/sec to determine the average number of pages read during each operation.

Pages Input/sec is the rate at which pages are read from disk to resolve hard page faults. Hard page faults occur when a process refers to a page in virtual memory that is not in its working set or elsewhere in physical memory, and must be retrieved from disk. When a page is faulted, the system tries to read multiple contiguous pages into memory to maximize the benefit of the read operation. Compare the value of Memory\\Pages Input/sec to the value of  Memory\\Page Reads/sec to determine the average number of pages read into memory during each read operation.

Pages/sec is the rate at which pages are read from or written to disk to resolve hard page faults. This counter is a primary indicator of the kinds of faults that cause system-wide delays.  It is the sum of Memory\\Pages Input/sec and Memory\\Pages Output/sec.  It is counted in numbers of pages, so it can be compared to other counts of pages, such as Memory\\Page Faults/sec, without conversion. It includes pages retrieved to satisfy faults in the file system cache (usually requested by applications) non-cached mapped memory files.

 

參考文檔:

Measuring Disk Latency with Windows Performance Monitor (Perfmon)

SQL Server disk performance metrics – Part 1 – the most important disk performance metrics

Performance Monitor Counters

硬盤的讀寫原理

Great SQL Server Debates: Buffer Cache Hit Ratio

相關文章
相關標籤/搜索