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

来源:http://www.cnblogs.com/double-K/archive/2016/12/12/6145406.html
-Advertisement-
Play Games

前言 性能優化是資料庫運維人員和中、高級軟體開發人員的必備技能,很多時候老司機和新司機的區別就在寫出的東西是否優化。 博主接觸過近千家客戶的系統,這些系統都存在著各種各樣的性能問題。那麼如何透徹的瞭解我們的資料庫性能問題?今天就用一個案例來說明性能優化的那點兒事兒。 PS:很多技術人員對優化有一套自 ...


前言

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

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

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

  正所謂:跟著博主不迷路,博主帶你上高速!

   點開案例跟著博主的思路看看優化這些事兒 : 本文案例Demo

  

 

瞭解系統環境

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

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

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


 

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

全局層面看性能

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

 

性能計數器

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

  

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

  

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

  

 

 

   其他計數器:

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

  

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

    

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

  

 

系統等待

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

  幾個主要等待:  

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

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

  CXPACKET:CPU的調度等待。

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

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

  

 

 

綜合分析

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

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

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

  

 

解決問題

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

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

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

步驟一 針對系統問題對資料庫進行全面的優化,提升整體效率

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

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

 

優化操作系統配置

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

 

優化資料庫層面的配置

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

  

 

 

是否大量缺失索引

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

  

 

刪除無用索引

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

 

刪除重覆索引

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

  

 

對重點語句建索引

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

 

解決阻塞

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

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

  

 

優化TempDB

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

 

 

優化日誌碎片

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

清除索引碎片

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

 

一階段預期效果

 

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

步驟二 處理熱點問題

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

  在語句調優中請主要關註:是否有缺失索引,是否存在隱式轉換,語句的執行時間、CPU、邏輯讀寫量、物理讀寫量、占用TempDB空間等信息。

 

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

 
 

簡單的優化一下

   

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

 

 

二階段預期效果

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

 

步驟三 針對業務

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

 

三階段預期效果

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

導圖

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

  

CPU:

  

 

 

  記憶體:

   

 

 

  磁碟:

  

 

 

  等待:

  

 總結

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

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

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

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

  巡檢系列文章請參見:後續系列

 

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 在SQL Server中導入數據時,會有一個“啟用標示插入”的選項,突然間懵逼了,這到底啥意思?我選與不選這個選項,結果好像沒區別!不科學啊這,“存在即合理”,我相信這個選項肯定有它的用處,只是我不知道罷了。 於是我去查資料,在CSDN論壇里找到了可能的解釋: 1)首先:“啟用標示插入”只對標示列( ...
  • 事務 事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個事務。 事務併發 資料庫是多個用戶(事務)共用的,當多個用戶同時訪問數據時,那麼在這種情況下就叫做併發。 事務併發下可能出現的問題 更新丟失 ...
  • oracle資料庫中,數據的增、刪、改、查,通過SQL語句實現 SQL:結構化查詢語言; 特點:不區分大小寫;字元串用單引號引起來;語句結束用分號表示結束; 行註釋,在語句的最前面加“--” 塊註釋,分別在語句的前後加 /* 和 */ SQL中常用的幾類: 一、數據定義語言 DDL:創建、修改、刪除 ...
  • 最近在入門nodejs,正好學習到瞭如何使用nodejs進行資料庫的連接,覺得比較重要,便寫一下隨筆,簡單地記錄一下 使用在安裝好node之後,我們可以使用npm命令,在項目的根目錄,安裝nodejs中的mysql模塊 在連接資料庫之前,要先引入nodejs連接處理mysql的模塊 類似php連接m ...
  • 類型 行級觸發器: FOR EACH ROW 影響的每一行都會執行觸發器 語句級出發器 預設的模式,一句話才執行一次觸發器 觸發器不能嵌套,不能含有事務控制語句 何時觸發 Before:條件運行前 After:條件運行後 Instead of:替代觸發,作用在視圖上 創建觸發器 實例一 1.創建一個 ...
  • 學習到 oracle 的視圖的時候,瞭解到對 Oracle 中數據的記錄進行分頁處理和 Mysql 提供的 limit 來進行分頁處理大有不同,limit 是 mysql 中特有的關鍵字。 那麼在 oracle 中如何實現對記錄的分頁處理呢? 解決辦法:使用 ROWNUM 1.問題如下:查詢出成績前 ...
  • 在之前的文章中介紹瞭如何直接在Ubuntu中安裝Hadoop。但是對於64位的Ubuntu來說,官方給出的Hadoop包是32位的,運行時會得到警告: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your ...
  • 命令如下: 其中-i指定監聽的網路介面,在RHEL 7下,網路介面名不再是之前的eth0,而是 eno16777736。 在RHEL 5&6下,可直接不帶-i參數,因為它預設是eth0。在RHEL 7下,如果不用-i參數指定網路介面,則會報如下錯誤: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...