SQLServer效能資料解析

天銘-發表於2016-05-16

磁碟相關


          ins_dir = MSSQL_DIR + "/ms" + str(port)
          data_dir = ins_dir + `/data`
          log_dir = ins_dir + `/log`
          backup_dir = ins_dir + `/backup`
         
          ins_size = func_os.get_dir_size(ins_dir)
          data_size = func_os.get_dir_size(data_dir)
          log_size = func_os.get_dir_size(log_dir)
          backup_size = func_os.get_dir_size(backup_dir)
         
          real_ins_size = ins_size - backup_size
          other_size = real_ins_size - data_size - log_size
          

總空間:real_ins_size = 例項目錄空間 – 備份空間(落地備)
資料空間:data_size
其他檔案空間:other_size = 總空間 – 資料空間 – 日誌空間 = tepmdb空間大小(日誌+資料)+ 其它(errorlog+agentlog+fulltextlog+系統庫+JOBS)
BinLog空間:log_size

SQL Server效能相關

動態管理檢視和函式

   與session執行有關
          sys.dm_exec_connections
          sys.dm_exec_sessions
   與系統有關
          sys.dm_os_performance_counters
   與IO相關
          sys.dm_io_virtual_file_stats

目錄檢視

   資料庫和檔案目錄檢視
          sys.master_files
          sys.databases
          
          

sessions

   命令
          select count(*) from sys.dm_exec_sessions
          where login_name not in (`root`,`aurora`,`sa`, `eagleye`)    
          and login_name not like `s\_%` escape `` and login_name not like %mssqld`
          and login_name not like `%Administrator`
          and status not in (`Preconnect`, `Dormant‘)
   解釋
          sys.dm_exec_sessions:是伺服器範圍的檢視,顯示了有關所有活動使用者連線和內部任務的資訊。
          login_name 當前執行的會話所使用的 SQL Server 登入名。
          status    會話的狀態。 可能的值:
                        Running - 當前正在執行一個或多個請求
                        Sleeping - 當前沒有執行任何請求
                        Dormant – 會話因連線池而被重置,並且現在處於登入前狀態。
                        Preconnect - 會話在資源調控器分類器中。
       分類資源調控器支援對傳入會話的分類。分類基於函式中包含的一組使用者編寫的條件。
       函式邏輯的結果使資源調控器可以將會話歸入現有工作負荷組類。
       會話傳入連結——分類(分類器函式)——路由到工作負荷組——工作負荷組使用相關聯的資源池——資源池提供同時限制應用程式資源      
       

bufferhit

命令
          SELECT a.cntr_value * 1.0 / b.cntr_value * 100.0 AS BufferCacheHitRatio
          FROM sys.dm_os_performance_counters a
                 JOIN (SELECT cntr_value, OBJECT_NAME
                        FROM sys.dm_os_performance_counters
                        WHERE counter_name = `Buffer cache hit ratio base`
                               AND OBJECT_NAME = `MSSQL$MS%d:Buffer Manager`
                        ) b ON a.OBJECT_NAME = b.OBJECT_NAME
          WHERE a.counter_name = `Buffer cache hit ratio`
                 AND a.OBJECT_NAME = `MSSQL$MS%d:Buffer Manager`
解釋
          sys.dm_os_performance_counters       為伺服器維護的每個效能計數器返回一行。
          counter_name    計數器的名稱
          OBJECT_NAME          計數器的所屬類別
          Buffer Manager 物件提供了計數器,用於監視 SQL Server 如何使用:
                        記憶體儲存資料頁、內部資料結構和過程快取。
                        計數器監視 SQL Server 讀取和寫入資料庫頁時的物理 I/O。
          Buffer Manager中的Buffer cache hit ratio base和Buffer cache hit ratio
          Buffer cache hit ratio 官方解釋在緩衝區快取記憶體中找到而不需要從磁碟中讀取的頁的百分比。   
經驗                          
    正常情況應該在99%以上
    
    

checkpoint

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Buffer Manager`
                 AND counter_name = `Checkpoint pages/sec`
解釋
          由要求重新整理所有髒頁的檢查點或其他操作每秒重新整理到磁碟的頁數。
          
經驗    
        1. 顯示執行 checkpoint;會發生checkpoint
        2. alter database 新增或刪除資料庫檔案;會發生checkpoint        
        3. 停止服務;會發生checkpoint
        4. engine定期生成checkpoint,跟recovery interval、恢復模式相關
        5. 備份;會發生checkpoint
        6. 在資料庫中執行了最小日誌記錄操作,例如,在使用大容量日誌恢復模式的資料庫中執行大容量複製操作;會發生checkpoint
        7 執行了需要關閉資料庫的活動。例如,AUTO_CLOSE 設定為 ON 並且關閉了資料庫的最後一個使用者連線,或者執行了需要重新啟動資料庫的資料庫選項更改;會發生checkpoint
        8. 08R2 checkpoint是例項級別的配置,但進行的過程(實現方式)是資料庫級別的,這個msdn沒有詳細說明但可以做實驗證明,大概方法可以構造兩個資料庫和相應資料,不同的DB session手動執行checkpoint觀察sys.dm_os_buffer_descriptors
        9. 髒頁的多少影響checkpoint開銷大小
        10. 08R2映象端不支援checkpoint
    

pagelife

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Buffer Manager    `
                 AND counter_name = `Page life expectancy`
解釋
          表示頁面在快取中的預期"壽命",單位為秒。微軟建議最少300秒。如果在一個例項中經常低於300秒,意味著資料保留的時間少於5分鐘就被移出記憶體。    

經驗
        1. 正常PLE應該是大於300且為一條持續平穩上升的直線
        2. PLE經常性的波動可能是記憶體壓力的訊號,具體再結合lazy_write,page_writes/page_reads等一起觀察判定    
        

sqlcompilations

命令   
        SELECT cntr_value
        FROM sys.dm_os_performance_counters
        WHERE object_name = `MSSQL$MS%d:SQL Statistics`
            AND counter_name = `SQL Compilations/sec`
解釋
    每秒的 SQL 編譯數。 表示編譯程式碼路徑被進入的次數。 包括 SQL Server 中語句級重新編譯導致的編譯。 當 SQL Server 使用者活動穩定後,該值將達到穩定狀態。 

經驗
    編譯截斷主要是CPU開銷,一般可以和Batch Requests/sec對照來看
    

logins

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:General Statistics`
                 AND counter_name = `Logins/sec`
解釋
          General Statistics 物件提供計數器,用於監視伺服器範圍內的常規活動
          Logins/sec   每秒啟動的登入數。 這不包括已入池連線。

transactions

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name LIKE `MSSQL$MS%d:database%%`
                 AND instance_name = `_Total`
                 AND counter_name LIKE `Transactions/sec%%`
解釋
          Database 物件提供了計數器,來監視大容量複製操作、備份和還原吞吐量以及事務日誌活動。
          _Total     有的計數器的instance_name中有值為_Total的例項,它是對該計數器所有例項的聚合值(SUM)。
          Transactions/sec       每秒為資料庫啟動的事務數
經驗
        理解SQLServer的Transactions和Batch Requests,一個Batch Requests可能有多個Transactions,Batch Requests更能說明系統負載
        

locktimeout

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Locks`
                 AND counter_name = `Lock Timeouts/sec`
                 AND instance_name = `_Total`
解釋
          Locks 物件提供了有關各種資源型別的 SQL Server 鎖的資訊
          Lock Timeouts/sec    每秒超時的鎖請求數,包括對 NOWAIT 鎖的請求。
          

deadlock

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Locks`
                 AND counter_name = `Number of Deadlocks/sec`
                 AND instance_name = `_Total`
解釋
          Number of Deadlocks/sec     每秒導致死鎖的鎖請求數。 

經驗
        經常死鎖可能會導致嚴重的問題,藉助Profiler可以解,但在RDS場景下最好的處理方式是開啟Flag 1222 通過日誌分析
        

lockwaits

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Locks`
                 AND counter_name = `Lock Waits/sec`
                 AND instance_name = `_Total`
解釋
          Lock Waits/sec   每秒要求呼叫者等待的鎖請求數。
                    

fullscans

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Access Methods`
                 AND counter_name = `Full Scans/sec`
解釋
          Access Methods       物件提供用於監視如何訪問資料庫中的邏輯資料的計數器。
          Full Scans/sec    每秒不受限制的完全掃描數。這些掃描可以是基表掃描,也可以是全文索引掃描。            
          

pagesplits

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Access Methods `
                 AND counter_name = `Page Splits/sec`
解釋
          Page Splits/sec   每秒由於索引頁溢位而發生的頁拆分數。  

經驗
        頁拆分會搬移資料,效能開銷,和fillfactor引數有聯絡;12相對於08有優化,碰到大條記錄拆分一次放不下可能會嘗試生成一個新頁存放,優化出現連續拆分的情況
        

lazy_writes

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Buffer Manager`
                 AND counter_name = `Lazy writes/sec`
解釋
          Lazy writes/sec   每秒被緩衝區管理器的惰性編寫器寫入的緩衝區數。
          惰性編寫器    一個系統程式,用於成批重新整理髒的老化的緩衝區(包含更改的緩衝區,必須將這些更改寫回磁碟,才能將緩衝區重用於其他頁),並使它們可用於使用者程式。
          當SQL Server感覺到記憶體壓力的時候,會將最久沒有使用的資料頁面和執行計劃從緩衝池中清理掉,做這個動作的就是Lazy Writer。

經驗
           Lazy writes有單獨一個系統程式,刷髒頁的過程和checkpoint類似同樣會有效能影響,對比checkpoint可以理解為兩者的行為類似但目的不同,Lazy writes是保證記憶體有可用頁,一般有記憶體壓力的時候會頻繁出現,Checkpoint聚合寫、優化IO、維護資料一致性,可以結合PLE一起觀察記憶體問題
           
           

pagereads

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Buffer Manager `
                 AND counter_name = `Page reads/sec`
理解
          Page reads/sec  每秒發出的物理資料庫頁讀取數。

經驗                             
        大量物理讀寫和IOPS升高是一致的;頻繁持續的物理讀寫過高先找找是否有需要優化改寫的SQL或者考慮增加記憶體,當然記憶體是有成本的最好的方式還是通過rewrite queries/add intelligent indexes處理;
        

pagewrite

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:Buffer Manager`
                 AND counter_name = `Page writes/sec`
理解
          Page writes/sec  每秒執行的物理資料庫頁寫入數。

經驗                             
        大量物理讀寫和IOPS升高是一致的;頻繁持續的物理讀寫過高先找找是否有需要優化改寫的SQL或者考慮增加記憶體,當然記憶體是有成本的最好的方式還是通過rewrite queries/add intelligent indexes處理;     
        

qps

命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%d:SQL Statistics`
                 AND counter_name = `Batch Requests/sec`
理解
          SQL Statistics      物件提供計數器來監視編譯和傳送到 SQL Server 例項的請求型別。通過監視查詢編譯和重新編譯的次數以及 SQL Server 例項收到的批數,可瞭解 SQL Server 處理使用者查詢的速度,以及查詢優化器處理查詢的效率。
          Batch Requests/sec  每秒收到的 Transact-SQL 命令批數。

經驗
        這個Batch Requests跟MySQL的QPS不同,SQLServer一個Batch Requests可能包含多個Transactions
        

traffic_kb

命令
          SELECT round(SUM(net_packet_size * 1.0 * num_reads / 1024), 0) AS read_kb, round(SUM(net_packet_size * 1.0 * num_writes / 1024), 0) AS write_kb
          FROM sys.dm_exec_connections
          WHERE session_id > 50
理解      
          dm_exec_connections     返回與 SQL Server 例項建立的連線有關的資訊以及每個連線的詳細資訊。
          net_packet_size  用於資訊和資料的網路包的大小。可為 Null 值。
          num_reads   此連線中已發生的讀包次數。可為 Null 值。
          num_writes  此連線中已發生的寫資料包次數。可為 Null 值。
          session_id    標識與此連線關聯的會話。可為 Null 值。
          
          

db_io

命令
          SELECT SUM(fs.num_of_reads + fs.num_of_writes) AS [mssql_db_log_io]
          FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
              INNER JOIN sys.master_files AS f
              ON fs.database_id = f.database_id
                  AND fs.file_id = f.file_id
                      INNER JOIN sys.databases AS d
                      ON d.database_id = f.database_id
                          AND d.name IN (%s) GROUP BY d.name ORDER BY d.name
解釋
          sys.dm_io_virtual_file_stats     返回資料和日誌檔案的 I/O 統計資訊。
          num_of_reads     對檔案發出的讀取次數。
          num_of_writes    在該檔案中寫入的次數。
          sys.master_files  儲存在 master 資料庫中的每個資料庫檔案都在表中佔用一行。
          database_id 應用此檔案的資料庫的 ID。master database_id 始終為 1。
          file_id    資料庫內檔案的 ID。主 file_id 始終為 1
          sys.databases     例項中的每個資料庫都對應一行
          name     資料庫名稱
          

activesession

命令
          select COUNT(*)
          from sys.dm_exec_sessions
              where login_name not in (`root`,`aurora`,`sa`, `eagleye`)
                  and login_name not like `s\_%` escape ``
                  and login_name not like `%mssqld`
                  and login_name not like `%Administrator`
                  and status not in (`Preconnect`, `Dormant`, `Sleeping`)
                  and session_id > 50
解釋
          比之前的session監控多了Sleeping和session_id>50的過濾條件
          Sleeping      當前沒有執行任何請求

經驗
        activesession過高一般業務都會出現卡慢,但這個值只是一個結果表現,具體導致原因還需要其它進一步排查
        

connectionreset

   命令
          SELECT cntr_value
          FROM sys.dm_os_performance_counters
          WHERE object_name = `MSSQL$MS%s:General Statistics`
                 AND counter_name = `Connection Resets/sec`
   解釋
          Connection Resets/sec    從連線池啟動的登入總次數。                                    
          


相關文章