SQL Server數據庫系統的IO性能受到物理硬盤的IO延遲和SQL Server請求執行的IO操做的影響。在監控硬盤性能時,最主要的度量值(metric)是IO延遲,IO延遲是指從應用程序建立IO請求,到硬盤完成IO請求的時間延遲。若是物理硬盤不能及時完成IO請求,跟不上請求負載的速度,那麼SQL Server就容易出現性能問題。SQL Server內部在執行一些特定的操做時,會和硬盤作讀寫交互,這也會影響物理硬盤響應SQL Server的IO請求的性能,使查詢進程處於PageIOLatch或WriteLog等待。sql
首先要了解操做系統的存儲管理,硬盤在操做系統分爲:物理硬盤(Physical Disk)和邏輯硬盤(Logical Disk)。Windows能夠在一個Physical Disk上劃出若干個邏輯分區,每個邏輯分區是一個Logical Disk。對於分配在同一個Physical Disk上的Logical Disks,其讀寫操做共享Physical Disk的IO帶寬。Windows給每個Logical Disk分配一個盤符,App經過盤符來讀寫數據。數據庫
對應地,硬盤的性能有兩組計數器:Logical Disk 和 Physical Disk,其中邏輯硬盤是物理硬盤的邏輯分區:windows
那麼,Windows性能監控器都有哪些硬盤的性能計數器了?緩存
1,Disk Queue Lengthsession
硬盤隊列長度是等待被Physical Disk處理的IO請求的數目。若是一個App發出一條讀請求,可是目標Disk正在處理其餘IO Task,那麼這個新的請求就會被放在Disk queue中,Disk queue Length就是1,硬盤的請求隊列的長度,可以衡量硬盤的工做負載,隊列長度越長,說明硬盤接收到的IO請求越多,完成一次IO請求須要的處理時間就越長,從必定程度上代表,硬盤性能不能知足業務的需求了。ide
2,傳輸(Transfer)時間性能
Transfer是Disk 的一次完整的I/O動做,表示從尋道,讀寫數據,到傳輸完成。在統計時,Transfer 是 Read 和 Write的加和。spa
3,讀寫時間百分比 操作系統
硬盤的工做時間(elapsed time)是指硬盤用於執行read/write操做的時間日誌
4,IO拆分
一次IO拆分紅屢次IO來實現,IO拆分的緣由是文件出現碎片,一次IO請求讀取的非連續的數據段,那麼硬盤子系統會把該請求分紅屢次執行,測量IO拆分的比例可以反映文件存儲的分散程度。
還有一個緣由會致使IO拆分,這就是一次讀取的數據過大,致使沒法經過一次IO請求返回,這就須要把IO請求拆分紅屢次。
Split IO/Sec reports the rate at which I/Os to the disk were split into multiple I/Os. A split I/O may result from requesting data of a size that is too large to fit into a single I/O or that the disk is fragmented.
使用性能監控器來偵測IO性能,用於監控IO性能的計數器主要是物理硬盤的讀寫:
這兩個計數器的性能指標:
1,監控物理Disk的IO延遲
在Windows級別上對Physical Disk的IO延遲進行分析,主要依賴於Performance Monitor的計數器,衡量物理Disk的IO延遲的計數器主要有三個:
avg.Disk sec/(Transfer,Read,Write),可以很好的反映Disk的IO速度,推薦的衡量Disk的IO速度的基線(baseline):
2,分析Data Collector收集的計數器數值
下圖是產品環境中一臺Server的計數器數值圖表,將IO延遲的度量值按比例放大1000倍,這樣圖表顯示的單位就是ms。
初步判斷,Disk的讀寫延遲很是高,Disk的IO性能較差,IO速度慢
3,監控物理Disk的IO次數
根據Disk的IO次數來界定Disk性能,沒有統一的閾值,通常經過監控計數值來獲取一個趨勢,設置一個基線,若是在Disk比較忙碌時,遇到異常的谷值,那麼就須要查看是否出現參數嗅探問題和Disk IO密集的查詢,異常的谷值通常是由查詢語句請求的數據量太多形成的,須要對查詢語句進行性能調優。
系統級常常用到的Disk性能計數器是PhysicalDisk計數器:
隊列長度波動很大,在%Idle Time 升高時,IO數量下降,沒有發現明顯的異常谷值。
4,監控物理Disk讀寫的數據量
這幾個計數值,對監控物理Disk的讀寫性能,意義不大,僅僅做爲參考。
SQL Server可以緩存從Disk加載的數據頁,正常狀況下,大部分操做不須要任何物理讀操做,不須要Disk的物理IO參與就能完成,可是,有一些操做,必須和物理Disk進行IO操做,才能完成。SQL Server和物理Disk進行IO交互的操做:
SQL Server只會讀取數據文件,只要數據緩存在內存中,理想狀況下,SQL Server不會執行任何物理讀操做,也不須要從物理Disk加載數據到內存,SQL Server執行讀取操做性能和內存的緩存能力有直接關係,也和用戶讀取的數據量有關。
SQL Server的寫操做分爲寫數據文件和寫日誌文件。寫入日誌文件的數據量,徹底由數據修改量決定,和內存壓力沒有關係;寫入數據文件的數量,主要和修改量有關。LazyWriter和內存壓力有關係,一旦內存有壓力,LazyWriter自動啓動,負責清理最久未被訪問的緩存,釋放內存,增長可用的Free buffer數量。
所以,SQL Server請求的物理Disk的讀操做數量和內存有直接關係,內存越充足,緩存的數據量越多,物理Disk的讀操做的數量就會越少,邏輯讀的數量不會減小;SQL Server請求的物理Disk的寫操做數量和用戶執行的數據修改量有直接關係,和內存是否存在壓力關係很微小。在執行物理disk的讀寫請求時,SQL Server的查詢進程產生PageIOLatch等待,表示進程正在執行物理讀操做,該等待能夠從DMV:sys.dm_exec_requests 查看到:
select r.session_id, r.blocking_session_id as blocking, r.wait_type as Current_Wait_Type, r.wait_resource, r.last_wait_type, r.wait_time, r.status, r.command, r.cpu_time,r.reads,r.writes,r.logical_reads, r.total_elapsed_time, r.start_time, db_name(r.database_id) as database_name, SUBSTRING( st.text, r.statement_start_offset/2+1, ( CASE WHEN r.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), st.text)) ELSE (r.statement_end_offset - r.statement_start_offset)/2 END ) ) as IndividualQueryStatement from sys.dm_exec_requests r outer APPLY sys.dm_exec_sql_text(r.sql_handle) as st where (r.wait_type<>'MISCELLANEOUS' or r.wait_type is null) and r.session_id>50 and r.session_id<>@@spid
PageIOLatch 等待:表示進程正在從物理Disk加載數據到內存,即進程在進行物理讀操做,從Reads字段可以看到物理讀的數量
WriteLog 等待:表示事務正在修改數據,SQL Server將預先將事務日誌記錄寫入到事務日誌文件
參考文檔:
Memory - Lazy Writer and Checkpoint
SQL Server disk performance metrics – Part 1 – the most important disk performance metrics
Measuring Disk Latency with Windows Performance Monitor (Perfmon)