Expert 診斷優化系列------------------你的CPU高麽?

来源:http://www.cnblogs.com/double-K/archive/2016/05/28/5536114.html
-Advertisement-
Play Games

現在很多用戶被資料庫的慢的問題所困擾,又苦於花錢請一個專業的DBA成本太高。軟體維護人員對資料庫的瞭解又不是那麼深入,所以導致問題遲遲不能解決,或只能暫時解決不能得到根治。開發人員解決數據問題基本又是搜遍百度各種方法嘗試個遍,可能錯過診斷問題的最佳時機又可能嘗試一堆方法最後無奈放棄。 怎麼樣讓瑣事纏 ...


    現在很多用戶被資料庫的慢的問題所困擾,又苦於花錢請一個專業的DBA成本太高。軟體維護人員對資料庫的瞭解又不是那麼深入,所以導致問題遲遲不能解決,或只能暫時解決不能得到根治。開發人員解決數據問題基本又是搜遍百度各種方法嘗試個遍,可能錯過診斷問題的最佳時機又可能嘗試一堆方法最後無奈放棄。

    怎麼樣讓瑣事纏身的程式維護人員,用最快的方式解決資料庫出現的問題?怎麼讓我們程式員的痛苦降低到最小...每天喝喝茶水,看看新聞平安度過一天呢?本系列重要通過Expert for sqlserver 工具講解下資料庫遇到的各種問題的表象及導致這樣問題的根本原因,讓定位問題更準確,解決問題思路更清晰!!

    資料庫的性能好壞,對於最終用戶來說表現為點擊的操作是否能夠快速響應,那麼反應到資料庫上就是語句執行時間是否夠短!

    對用運維人員資料庫性能的表現,簡單可能看成CPU 、記憶體、磁碟三巨頭指標是否正常,那麼今天我們就從CPU 下手,看看CPU能夠看出哪些問題!

 

廢話不多說,直接開整---------------------------------------------------------------------------------------------------

  主要用到的性能計數器(不知道什麼是性能計數器的,請自行百度)

  就用兩個~

  1. %Process Time 全實例  (主要用於查看當前伺服器的CPU 情況)
  2. %Process Time sqlservr (主要用於查看資料庫使用的CPU情況 )

排除其他應用影響CPU                       

 

    

    

  

  綜合這兩個計數器 在同一時間點可以診斷出CPU 是否是被伺服器其他的應用所消耗的,如圖中17:10 左右的  “%Process Time 全實例(紅線)” 突然升高,而SQL 服務的(綠線)並無明顯升高,這也就說明,在這個時間段的CPU 壓力不是有資料庫導致的!

  這個紅線的明顯升高時,因為我在資料庫所在的伺服器上做了一次文件壓縮!類似文件壓縮這種操作會使用大量CPU,對資料庫性能造成衝擊!

 

 CPU 問題分析                        

    CPU很高或者達到100%一定是你業務壓力很大?CPU 不能滿足你的需求麽?在下結論前請仔細分析,一個草率的定論可能換來,老闆一個安慰“世界那麼大你該出去走走了!”

   下麵我們用幾個典型的場景,分析下問題,並給出最佳實踐~

   高峰時段CPU 持續很高

    

                                圖中是伺服器幾天的CPU情況

    很多人看到這張圖,是不是看到了自己的伺服器?是否有一種親切感呢~下麵我們來分析下這種表象可能存在的問題!

    首先明確一點90%的問題可能集中在10%的場景,這種CPU 持續持續很高的情況請註意下麵兩點:

  1. 你的資料庫並行度是否調整?
  2. 你的資料庫是否缺少索引,導致頻繁的查詢消耗很高的CPU資源?    

    最大並行度是什麼?簡單的可以理解為執行一條語句最多可以使用多少個CPU。看起來當然是使用的越多越好啦,使用的越多語句肯定越快呀! 這個答案是大寫的 “NO”,使用過多的CPU會導致線程協同工作產生的時間較長,直接導致語句很慢,而且消耗的CPU時間很多,導致CPU使用高,進而成為瓶頸!

  看一個數據語句持續時間也就是執行時間,但是看看CPU的時間,這就是沒有設置並行度,一個並行計劃會產生大量的CPU消耗,另外會讓語句執行的更慢!    

  

    那麼是不是使用的越少越好呢?任何事情沒有絕對的,視情況而定,如果系統有比較大數據量的操作需求,並行使用多個CPU會有很大的提升。

    一般建議系統如果超過32個CPU 那麼設置成8或者4,如果系統中都是特別短小且頻繁的語句建議設置成1(取消語句並行,要慎重真的符合你的場景才好)

    並行開銷的閥值,主要控制SQL優化器何時選用並行計劃,建議預設值,此值設置的越小優化器越容易選擇並行計劃。

    並行度的設置是針對實例級別的設置(2016中可以對單獨資料庫設置)

    怎麼設置並行度和閥值,請看下圖: 系統預設的並行度 為0,閥值預設為5

    

  

    並行度的調整可謂誰用誰知道啊,下麵我們說說系統老大難的問題--語句導致CPU高

    語句導致CPU高也是很常見的問題之一,那麼語句怎麼調優降低CPU 消耗呢? 這裡只做一些簡單的說明,具體的語句調優、參數化減少語句編譯,請看後面的系列文章。

    語句調優的方式很多種,這裡介紹和CPU相關最為常用:

  1. 添加索引降低語句開銷,執行需要的資源消耗少了消耗的CPU 自然相對就少了。
  2. 降低語句複雜度,讓SQL Server執行高效(同樣也是降低資源消耗的方法)。
  3. 分析語句是否可以採用串列計劃。
  4. 前端程式儘量參數化減少語句的編譯消耗。

CPU 規律波動

    拿到CPU的監控數據不要盲目下結論,數據往往是最能反映問題,給你提供思路的!

    

 

    如果你是系統維護人員,看到類似這樣的CPU數據指標,如果你還不能有一些思路,請你好好熟悉下你親愛的系統。

    這張圖很清晰地反映出系統每半小時一次的CPU升高,那麼別忙著去找對應時間點的語句,我們最少要好好想一下,系統中有什麼操作半小時執行一直?SQL JOB?計劃任務?前臺定時處理?等等等

    這個規律的定時處理是否有異常?是否最近有什麼改動?執行的結果是不是和你想的一樣?

    也許問題就這麼清晰的定位了......

CPU 突然飆高

     

                    圖中 9點CPU由平均20幾飆升到100%

    CPU突然飆高可能是偶然的現象,也許你可以認為沒有關係,但當你判斷為偶然之前,你是否做過下麵的分析:

  1. 是否分析過系統日誌,CPU飆高時間點是否有異常?
  2. 是否檢查伺服器上有什麼特殊應用?
  3. 是否檢查了資料庫狀態?
  4. 是否詢問過相關業務人員?
  5. 是否馬上開啟監控為下一次突發情況的到來做好準備?

    如果沒有你的判斷真是毫無根據...也錯過了一次發現問題,學習知識的機會!

    排除上述異常,最有可能的原因就是資料庫中,在那一刻有一個或多個語句運行異常,或非常不優化。如果這情況真的因為語句問題,而且只出現一次,那麼這可能不是問題,我們儘量找到當時的語句,查看問題。找到當時的語句可以通過系統視圖sys.dm_exec_query_stats 查看CPU消耗以及運行時間,或者由自己的監控工具得到。

    找到對應的時間點看看到底是什麼語句在運行~

    

    

    對這條語句進行分析到底是為什麼!

 

 

CPU 真高!

    經過各種分析優化,如果依然CPU壓力明顯,真心是硬體不能支撐業務了,那麼我們就要選擇更高大上的方式了,比如修改程式設計垂直/水平拆分,添加硬體,讀寫分離分擔壓力,組建集群負載均衡等等手段......

 

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

  總結:對於CPU壓力的解決,大部分的用戶可以通過調整並行度和系統語句的優化來解決。

      另外對系統的監控和分析在診斷問題及解決問題中起到至關重要的作用。

      在下結論前一定要經過仔細的分析研究,一個想當然的決定可能造成嚴重的影響。

     你的系統真的需要加硬體,或高大上的方案麽?     

    

-----------------------給出一些CPU相關的文章連接-----------------------------------------------------

樺仔的  SQLSERVER排查CPU占用高的情況

高大俠的  深入解析SQL Server並行執行原理及實踐(下)

careyson的 談一談SQL Server中的執行計劃緩存(上)

 常用 監控SQLSERVER性能計數器

 

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

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!

  引用高大俠的一句話 :“拒絕SQL Server背鍋,從我做起!”


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對Rxjava不熟悉的同學可以先看我之前寫的幾篇文章 RxJava 和 RxAndroid 一 (基礎) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroid 三(生命周期控制和記憶體優化) 另外推薦幾篇比較好的文章,有助於理解Rxjava 安卓客戶端是如何使 ...
  • 指定其中LinearLayout的寬度就能夠實現你GridView的長寬變化,如果它的長超過屏幕,則自動添加水平滾動條。 ...
  • 1. ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod 蘋果系統升級 OS X EL Capitan 後會出現的插件錯誤,將 安裝 CocoaPods 的 sudo gem ins ...
  • 一、音頻 1、iOS 裡面共有四種專門實現播放音頻的方式: System Sound Services(系統聲音服務)。 OpenAL(跨平臺的開源的音頻處理介面)。 Audio Queue Services(播放和錄製音頻服務)。 AVAudioPlayer(高級音頻播放器)。 在這裡我們主要介紹 ...
  • // // ViewController.m // CNBlogs // // Created by PXJ on 16/5/27. // Copyright © 2016年 PXJ. All rights reserved. // #import "ViewController.h" @inter ...
  • Bitmap aa = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); InputStream input = datastream(aa);//把bitmap轉換為流 Bitmap bitmap = tra ...
  • #pragma mark - InterpolatedUIImage=因為生成的二維碼是一個CIImage,我們直接轉換成UIImage的話大小不好控制,所以使用下麵方法返回需要大小的UIImage - (UIImage *)createNonInterpolatedUIImageFormCIIma ...
  • 1. 簡單動畫 1> UIImageView GIF 動畫 GIF圖的原理是:獲取圖片,存儲在圖片數組中,按照圖片數組的順序將圖片以一定的速度播放 2> UIActivityIndicatorView 風火輪動畫 在APP中,載入界面的時候我們都會看到一個想風火輪的動畫在不停的轉,這個動畫其實是iO ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...