[SQL SERVER][Performance]找出硬體Bottleneck

[SQL SERVER][Performance]找出硬體Bottleneck

回想六年前剛接觸SQL Server2000,當時公司沒有DBA這種角色,大多是開發人員同時也是DBA,但在這種球員兼裁判的模式下對於DB的管理幾乎都不重視,可是當DB出現問題時總要有人背黑鍋(小弟太菜了~XD),當時我對sql2000可說模不著頭緒,因為sql2000相關運作猶如黑箱作業,你沒辦法獲取太多有效資訊來驗證自己的假設是否正確(這也代表者無法說服別人),外加那時公司以產出為原則,根本沒有人想好好管理Sql Server,雖然當時自己有花時間去學習相關知識(反而引起我踏入Oracle DB領域),但上頭較注重是你的開發進度,所以我當時也練了一身好武功來對付Sql Server,只要user反應無法連線、記憶體不足或查詢變慢...等疑難雜症,二話不說必殺技使出來~"重開機"~~哈哈(重開才是王道~~還好只是user side可以這樣搞)。

由於前些日子因為公司客戶反應軟體執行效率以達到讓她們無法忍受希望可以改善,當時主管對我說有個DB performance issue搞一下吧(心想那有啥問題,平常每天不都在搞Oracle~爽快答應),那SQL2005幫忙看看摟(他X的!怎麼是SQL Server,哀!只有來首小黑唱的:我不摸SQL好多年.....),不過竟然答應了就得拿出積極態度來處理,廢話不多說(也抱怨完了~哈)切入主題。

文章均為自己見解,如有錯誤還請指教

這篇記錄我自己在找出硬體Boottlenek的想法和過程,並非整體SQL Server Performance Tuning。因為SQL performance tuning個人認為還需有相當經驗當後盾、對SQL Server熟悉程度及DB架構設計和Windows記憶體架構有一定的了解程度(小弟都還太嫩),當然興趣、廣泛吸取知識和有合作人一同討論也很重要,才能真正掌握住對的方向,提出正確建議,免得到頭來白忙一場。

 

當你確定效能瓶頸來自硬體時,如RAM、CPU或Hard Disk要求客戶花錢購買時,一定要提出相關數據來證明自己的假設是正確的,那麼數據該如何取得呢??這時我們可以利用performance counter來監控相關資源的使用情況以利協助分析。面對SQL Server檢查硬體順序:RAM、CPU、Hard Disk。

依環境產生自己的項目清單:

硬體環境項目:熟悉硬體環境方便你可以快速切入及判斷硬體瓶頸發生在那個環節上(孫子有說:知彼知己百戰百勝),大致上我分三類OS、HardWare及DataBase

類別 細項
OS 版本
  虛擬記憶體
  硬碟有無啟用文件壓縮,加密
  是否為獨立的SQLSERVER
  是否設定背景服務
  是否有安裝防毒軟體
  是否停用不必要網路服務
HARDWARE CPU:
是否開啟Hyper Threading
L2 Cache Size
CPU等級及時脈
  實體記憶體:
total size
記憶體等級及時脈
  DISK:
Number of disks
RAID Level
硬碟種類
硬碟轉速和緩衝區大小
  NIC:網卡等級及吞吐量
DataBase 版本類型
  參數及屬性設定:
Min Server Memory
Max Server Memory
affinity mask
awe enabled
cost threshold for parallelism
cursor threshold
fill factor (%)
index create memory (KB)
lightweight pooling
max degree of parallelism
min memory per query (KB)
network packet size (B)
priority boost
query governor cost limit
query wait (s)
recovery interval (min)
set working set size
user connections
定序設定
遠端查詢逾時設定(s)
自動更新統計值
自動非同步更新統計資料
自動建立統計資料
自動壓縮

硬體效能計數器清單:列出個人認為比較重要及具有參考價值得計數器

CPU

performance name 建議值 說明
Processor: % Processor Time <80% 紀錄每個CPU的利用率,如果值持續超過80%,就要考慮增加CPU數量或更換較大的L2 cache
Processor: %Privileged Time

< 30% of Total %Processor Time  
or
<10

此進程所分配的無法與其它進程共享的當前字節數量。如果系統性能隨著時間而降低,則此計數器可以是memory leak的最佳指示器。
CPU花費在執行WINDOWS系統核心命令時間百分比。
如果%Privileged Time > 20% and  PhysicalDisk %Usage > 55% 即表示存在I/O buttleneck

System: Processor Queue Length

<2

相當於等候處理器空檔時間的執行緒數目。4顆CPU該值不應該超過8,如果超過就要考慮增加CPU數量或更換較大的L2 cache

System:Context Switches/sec

<5000

該值如果超過5000值有可能是CPU瓶頸,但也有可能是記憶體不足造成頻繁換頁導致CPU繁忙

Process:Page Faults/sec

<400

將進程產生的頁故障與系統產生的相比較,以判斷這個進程對系統頁故障產生的影響。

RAM

performance name 建議值 說明

Memory: Pages/sec

0~20/sec
best:<15

記錄每秒鐘記憶體和硬碟之間的交換頁面,頁面交換頻繁超過SERVER所能承受IO,將降低性能,所以要盡可能壓低值,如果一直超過就要考慮加記憶體
為了解決記憶體硬體分頁錯誤,而在磁碟中進行讀取或寫入的頻率,此計數器是追蹤造成系統延遲這類錯誤主要指標

Memory: Available MBytes

>200MB

紀錄SQLSERVER可用的實體記憶體,長時間如果維持低於200Mb(留給OS代表電腦整體地缺乏記憶體,或有某個應用程式沒有釋出記憶體,就要考慮加記憶體或解決應用程式

Memory: Page Faults/sec

<80

如果大於80表示過度硬體分頁錯誤將考慮增加記憶體或是緩衝區設定過大
確認磁碟活動是否為分頁所造成

Memory: Committed Bytes

 

可以查看確認memory leak行為,評估 PLE 和 Lazy Writes/sec 的檢查點。
這是對虛擬記憶體需求的量值
它會顯示已配置了多少位元組要藉由處理序並已認可作業系統的 RAM 頁面框架或分頁檔 (可能都) 中的頁面位置 當上述的可用的 RAM, 容量增加 Committed Bytes (私用位元)] 會增加分頁並也會增加的分頁檔在使用量。 在某些時候, 分頁活動開始到已知的效能會明顯地影響。

Memory: Committed Limit

<實體記憶體

如果長時間大於實體記憶體就要考慮增加實體記憶體

SQL Server:Buffer Manager Buffer Cache Hit Ratio

91%~99%

紀錄獲取資料的頻率是從記憶體而不是從硬碟,如果該值持續不在範圍內就要考慮增加記憶體

SQL Server:Buffer Manager Lazy Writes/Sec

<20

一般來說該值不會很高,0~20是可接受範圍(越接近0表示SQL的緩衝區很足夠且沒有dirty pages),如果持續超過20將考慮增加記憶體

SQL Server:Buffer Manager Free Pages

> 640

微軟建議不可低於640,如太低可調高max memory或增加記憶體

SQL Server:Buffer Manager Free list stalls/sec

< 2

顯示資料庫可用頁數請求頻率(因為緩衝區不足),該直如果持續大於2代表記憶體不足

SQL Server:Buffer Manager Page Life Expectancy

>300

記憶體指標之一,如果該值持續<300那麼將考慮增加記憶體
小於300時,代表
Memory pressure
Memory constraints
Code SQL Server cache
Missing indexes, or poor query plans

SQL Server:Buffer Manager Checkpoints Pages/sec

 

當下列情況發生時,代表 Memory presure
High Checkpoint pages/sec
High lzay writes/sec
low page life expectancy (<300 seconds)

SQLServer:Memory Manager Target ServerMemory(KB)

<實體記憶體

 

SQL Server可使用的記憶體總數

若 Target ServerMemory (KB) 計數器和電腦中的實體記憶體數量相比一直很高,可能代表需要更多的記憶體。

SQLServer:Memory Manager Total ServerMemory(KB)

<

SQLServer:Memory Manager Target ServerMemory(KB)

SQL Server正使用的記憶體總數(來自緩衝區)

若 Total Server Memory (KB) 計數器和電腦中的實體記憶體數量相比一直很高,可能代表需要更多的記憶體。也就有了資源競爭(Contention)問題,因作業系統較難配置記憶體來執行一般性作業

Process:Working Set

 

如果這個數字一直低於「最小伺服器記憶體」與「最大伺服器記憶體」伺服器選項設定的記憶體數量,則代表 SQL Server 設定的記憶體過多。

Disk

performance name 建議值 說明
Physical Disk: % Disk time

<70%

紀錄磁碟陣列繁忙程度,原則上要低於70%,如果持續超過70%(24小時監控周期大約超過10分鐘),就要考慮更換轉速更快硬碟
可參考Avg. Disk Queue Length來協助判斷

Physical Disk: Avg. Disk Queue Length

<2

平均有多少系統要求,正在等取存後。
8個硬碟組成磁碟陣列,假設值=10,那麼實際值=10/8=1.25都在建議值以內,超過則要考慮更換轉速更快硬碟

Physical Disk: Current Disk Queue Length

<2

 

Physical Disk: Disk Reads/sec

最佳:<15ms
次加:30~60ms
最差:>60ms

一般而言,Ultra Wide SCSI 磁碟每秒可以處理 50 至 70 次 的 I/O 操作
讀取和寫入請求(為所選磁盤在實例間隔中列隊的)的平均數。
磁盤瓶頸判斷公式:
每磁盤的I/O數=(讀次數+(4*寫次數))/磁盤個數。
如果計算出來的每磁盤的I/O數大於磁盤的處理能力,那麼磁盤存在瓶頸。

Physical Disk: Disk Writes/sec

  可參考每家硬碟廠商所提供數據

LogicalDisk:% Free Space

 

指出logicalDisk空間不足,所以當logicalDisk處存的是交易紀錄檔時,該指標資訊很重要

SQL Server:Databases Data File(s) Size(KB)

 

資料庫內所有資料檔總計大小包含任何自動成長

SQL Server:Databases Percent Log Used

 

使用中的紀錄檔空間百分比

SQL Server:Log Growths Log Growths

 

資料庫交易紀錄檔的擴大總次數

有了以上的清單,就可以按表操課取得數據,當然如果可以模擬改善後的數據,如加RAM前查詢時間及加RAM後時間比較,硬碟及CPU..等,相信會讓客戶更願意掏錢購買硬體(而非只要遇到效能問題就只能花錢買硬體改善,有時花錢還買不到效果那就慘了)。

 

PS:

往往遇到效能上的問題,大多沒有經過壓力測試(所以也沒有任何硬體和DB相關數據基準線)或開發時(TSQL語法及SP用法..等)效能就沒注意,交付時間一到產品雖可如期上線,一開始或許都沒麻煩(資料量小),但半年或一年後(資料成長速度超乎預期)卻得應付往後的效能災難,到時就得須花更多人力及財力得不償失。