天天看點

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  性能優化是資料庫運維人員和中、進階軟體開發人員的必備技能,很多時候老司機和新司機的差別就在寫出的東西是否優化。

  部落客接觸過近千家客戶的系統,這些系統都存在着各種各樣的性能問題。那麼如何透徹的了解我們的資料庫性能問題?今天就用一個案例來說明性能優化的那點兒事兒。

  PS:很多技術人員對優化有一套自己的了解,在閱讀本文前請放下你自己的了解。

  正所謂:跟着部落客不迷路,部落客帶你上高速!

   點開案例跟着部落客的思路看看優化這些事兒 : 本文案例Demo

  

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  優化首先要知道資料庫在一個什麼樣的硬體/軟體環境下運作?配置是怎麼樣的?記憶體、CPU這些是否能完全被應用?資料庫體量多大?

  首先我們先看一下系統的配置:

  軟體層面,我們要知道我們的作業系統版本,SQL Server版本,以及對應版本的硬體限制(如32位系統不開AWE無法使用超過4G記憶體、server 2008 标準版最大支援32G記憶體等)

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)
30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  本例中我們可以看出,系統環境沒有異常問題,SQL Server的更新檔不是最新的,CPU資源不充足,可能CPU會成為系統的瓶頸。

  全局層面看問題主要指綜合伺服器的各種名額表象定位系統的瓶頸或問題,在性能優化中最忌諱的就是看到一個名額馬上就下手,針對一個名額的判斷是盲目的,很可能使問題偏離本身的根本原因,也可能使優化根本無法解決根本問題而隻是表象得到了緩解。

  CPU:在大量時間内CPU的使用率達到100%,說明CPU已經成為瓶頸。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  記憶體:記憶體計數器生命周期在11點時已經降到0,惰性寫入器也彪高,說明記憶體也存在壓力,而且比較嚴重。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  磁盤:磁盤的平均隊列很高(一般系統最佳情況隊列應該低于2),并且讀隊列和寫隊列都很高。由于記憶體存在壓力,是以現在無法判斷磁盤的壓力是由于記憶體不足引起的還是磁盤速度不能滿足需要。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)
30分鐘帶你熟練性能優化的那點兒事兒(案例說明)
30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

   其他計數器:

  可以看到系統中全表掃面的次數比較多,這表明很多查詢沒有應用索引。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  系統在11點左右和11點24左右發生大量鎖等待,并且等待時間很長(超過150s)

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  通過很多類計數器能綜合看出系統的問題。這裡不一一細說了

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  等待是另一個可以全局層面看系統的名額,系統運作的卡慢問題很大部分是因為等待而引起的,那麼等待的類型也是可以很直覺的反映出系統的問題。

  幾個主要等待:  

  ASNC_NETWORK_IO:一般反應出有部分查詢可能傳回大量資料,請加查具體的等待語句是否需要傳回如此多的資料。

  WAITFOR :可能是配置了CDC釋出訂閱或程式中使用了語句waitfor delay

  CXPACKET:CPU的排程等待。

  LCK_M_U :更新語句之間的語句阻塞。

  WRITELOG:說明程式中有循環的插入跟新操作而頻繁的寫入日志,磁盤速度不能滿足寫入頻率而造成。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  綜合系統等待和性能計數器,我們基本可以判定出來系統存在以下問題:

  系統的CPU、記憶體、磁盤均存在較大的壓力,尤其CPU負荷接近100%,系統中存在大量表掃面可能缺失比多索引。系統中有的語句可能要傳回大量的不必要資料,系統鎖情況嚴重,等待時間很長,語句執行時間也必然很長。

  語句執行的整體情況:由于上述的問題影響,那麼系統中必然存在大量的長時間語句!

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  問題的定義是很重要的一步,從全局的多項名額綜合分析,讓所有問題無所遁形。定位問題後我們先來看一下解決這些問題的基本步驟。

  本案例是自己模拟的一個情況,是以雖然在表象上來看資源壓力很大,但實際在運作的語句不多,場景也有限,但在生産系統如果存在這樣的表象,那麼說明你的系統性能問題非常嚴重急需一次詳細的優化了。

  那麼下面也介紹一下生産系統遇到這樣的問題應該怎麼優化,有哪些必要的步驟。

  很多人優化可能直奔語句,認為語句就可以解決性能的所有問題,其實這樣的觀點是不全面的,系統的配置,資料庫的配置,索引的規劃等都是解決性能的必要步驟。

  例如:系統中的語句都是最佳的,資料庫運作還是很慢,可能就是因為你的CHECKDB配置的問題,也有可能因為你自動收縮沒有關閉而導緻的性能問題。

  針對伺服器進行配置檢查,檢視是否有配置不合理或可以優化的配置項,比如是否配置了虛拟記憶體?伺服器層面是否限制的資源使用?伺服器是否高性能模式運作?

  針對資料庫參數進行合理配置使硬體充分發揮硬體功能,優化不合理配置,降低對資料庫造成沖擊的可能性。比如:最大并行度?最大記憶體?

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  大量索引缺失必然導緻語句性能不佳,并且消耗大量的系統資源,很可能就會造成上面伺服器高壓力的表象

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  針對資料庫中無用的索引進行删除。提升更新操作的時間。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  針對資料庫中重複的索引進行删除。提升更新操作的時間。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  針對系統中消耗大的語句或執行次數多的語句進行分析,評估語句性能問題,并建立合适的索引提,降低語句的資源消耗,升語句運作效率。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  解決語句間的阻塞,這需要分析語句的阻塞鍊,到底語句被什麼樣的操作阻塞了,為什麼會阻塞?

  很多新手經常問的問題:為什麼我有的時候查很快有的時候查就很慢? 答:大多數情況就是你的語句被阻塞了。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  針對TempDB調優,減少TempDB資源争用導緻的壓力。本例中可以死看到有TempDB的争用等待,是以對TempDB的優化也是必要的。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  針對日志增大,帶來的日志碎片問題進行優化。

  檢查系統的索引維護情況,并針對碎片過大的表進行碎片清除操作。主要展現在系統中有老化的索引,索引的老化導緻索引的性能不高或失效。

  一階段的優化是對性能的整體提升,性能提升也會很明顯,針對不同系統提升一般在2-3倍。

  處理熱點問題主要是在階段一的基本優化後針對重點的語句進行調優,可能包含建立索引,修改寫法,查詢提示,計劃向導等等。

  在語句調優中請主要關注:是否有缺失索引,是否存在隐式轉換,語句的執行時間、CPU、邏輯讀寫量、實體讀寫量、占用TempDB空間等資訊。

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  例:這樣一條語句經過第一階段的優化并沒有太大的提升,而且資源消耗依然很大,那麼我們可以針對這條語句進行詳細的二階段優化。

 

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

簡單的優化一下

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)
30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

   

  隻是簡單的改了下語句的寫法時間有7秒變成1秒,記憶體消耗從300+MB 變成 1MB

    階段二的優化屬于細緻的優化步驟,要針對更為具體的語句、具體的情況。經過本階段優化可以使系統中大部分語句從寫法、配置、運作名額都趨于優化值。

  這個步驟需要配合開發人員,到底哪些功能依然慢?執行了哪些語句?是上司用的功能?還是一般可以慢的功能?如果大上司用的功能,那可能你就需要多花些心思了。這部分這裡就不展開說了。

    第三階段屬于最細緻的階段,可以結合業務真正點對點的消滅系統中存在問題。

  針對性能優化奉上幾個圖希望能幫助資料庫從業者梳理一下優化的思路(個人思路僅供參考,不完善的地方也請見諒)

CPU:

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  記憶體:

   

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  磁盤:

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  等待:

30分鐘帶你熟練性能優化的那點兒事兒(案例說明)

  在性能優化中最忌諱的就是看到一個名額馬上就下手,針對一個名額的判斷是盲目的,很可能使問題偏離本身的根本原因,也可能使優化根本無法解決根本問題而隻是表象得到了緩解。

  本文隻是通過一個例子簡述一下優化的基本思路,希望幫助更多資料庫從業者,了解性能優化。

  本文隻闡述了思路,具體的各部分解決方式請參見我的系列文章:SQL SERVER全面優化-------Expert for SQL Server 診斷系列

  性能的調優是一個持續性的工作,不是一次解決了問題以後就可以高枕無憂了,定期的巡檢也是資料庫從業者必要的工作之一,做到及早發現及早解決。

  巡檢系列文章請參見:輕松精通資料庫管理之道——運維巡檢系列

 ----------------------------------------------------------------------------------------------------

注:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,非常感謝!