成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個真實案例,教會你數據庫性能調優

數據庫
微軟工程師的一個工程師曾經對性能調優有一個非常形象的比喻:剝洋蔥 。我也非常認可,讓我們來一層一層撥開外面它神秘的面紗。

前言

微軟工程師的一個工程師曾經對性能調優有一個非常形象的比喻:剝洋蔥 。我也非常認可,讓我們來一層一層撥開外面它神秘的面紗。

[[217135]]

六大因素

下面祭出的是我們在給客戶分析數據庫性能問題最常用的圖。

一個真實案例 教會你數據庫性能調優

看完這個圖,你是不是對性能調優有了個基本的概念了。通常來講,我們會依照下面的順序來進行分析:

  • 硬件能力

  • 系統規模

  • 數據庫內部因素

  • 軟件環境

這4個的順序可以有所調整或者交換,但是對于系統的性能優化一定要從全局出發。切勿一來就深入到某一個SQL語句的優化,因為可能你花費大量的時間把一個SQL從20s 優化到1s,但是整個系統的卡慢仍然存在。

***才是:

  • 業務模型及架構

  • 代碼設計

實戰案例

不廢話了,開整開整,直接上干貨。

時間:2018年1月某天

事件:某醫院客戶 下午4點 突然出現大面積的卡慢。整個系統出現嚴重問題,信息中心電話打爆,醫院工程師手足無措。

萬幸的是我們給數據庫裝了‘攝像頭’,下面就從監控錄像來看看發送了什么。然后加以解決。

硬件能力

CPU

在問題發生時間段內CPU使用率在20%以下,正常。

一個真實案例 教會你數據庫性能調優

Memory

從下面的圖像顯示,內存使用正常。

頁生命周期

一個真實案例 教會你數據庫性能調優

可用內存

一個真實案例 教會你數據庫性能調優

IO

IO隊列平均值很低,15.48 左右有個瞬時的高點,可留意這段時間有沒有批量的寫入。

一個真實案例 教會你數據庫性能調優

總的來看,硬件資源是足夠的。

系統規模

問題發生時,每秒的批請求數并不是一個上升趨勢,反而有所下降。這是因為系統的擁堵,等待 ,影響了系統的吞吐量。

一個真實案例 教會你數據庫性能調優

數據庫內部因素

等待

一個真實案例 教會你數據庫性能調優

慢語句

一個真實案例 教會你數據庫性能調優

從會話和慢語句的趨勢圖可以看到,問題發生的時間和客戶描述完全吻合,我們可以斷定本身事故的確是慢在數據庫。

什么導致的慢

檢查者個時間段運行中的語句,可以發現下午15.58左右,數據庫中開始出現越來越多的CMEMTHREAD等待。

一個真實案例 教會你數據庫性能調優

一直到1900頁16.08分的時候,出現了***達100個并發同時出現CMEMTHREAD等待。

一個真實案例 教會你數據庫性能調優

什么是CMEMTHREAD等待

微軟官方的描述:在任務正在等待線程安全的內存對象時發生。 當多個任務嘗試從同一個內存對象分配內存導致爭用時,等待時間可能會增加。

這個描述很晦澀,感覺還是完全不知道等待類型是怎么回事,應該怎么處理這類問題。

實際上,從官方描述來看是內存爭用的問題,但是實際上這個問題的關鍵在于多個任務的爭用,實際上是并發的執行的問題。

場景

  1. 出現在數據庫編譯或重編譯時,將即席執行計劃ad hoc plans 插入到計劃緩存中的時候

  2. NUMA架構下,內存對象是按照節點來分區的

內存對象有三種類型的(Global,Per Numa Node,Per CPU)。 SQL Server將允許對內存對象進行分段,以便只有同一節點或CPU上的線程具有相同的底層CMemObj,從而減少來自其他節點或cpu的線程交互,從而提高性能和可伸縮性。減少內存的并發爭用。

  1. SELECT  
  2. type, pages_in_bytes,  
  3. CASE 
  4.  
  5. WHEN (0x20 = creation_options & 0x20) THEN 'Global PMO. Cannot be partitioned by CPU/NUMA Node. TF 8048 not applicable.'  
  6. WHEN (0x40 = creation_options & 0x40) THEN 'Partitioned by CPU.TF 8048 not applicable.'  
  7. WHEN (0x80 = creation_options & 0x80) THEN 'Partitioned by Node. Use TF 8048 to further partition by CPU' 
  8.  
  9. ELSE 'UNKNOWN'  
  10. END 
  11.  
  12. from sys.dm_os_memory_objects  
  13. order by pages_in_bytes desc 

如果你發現,Partitioned by Node 的內存開銷是排在前面的,可以使用TRACE FLAG 8048來減少CMEMTHREAD等待。

一個真實案例 教會你數據庫性能調優

從圖中可以看到,客戶的 Partitioned by Node 是比較靠后的,排在14位。

3. 補丁

這類場景是最常見的。如果在系統中發現出現大量的CMEMTHREAD等待,優先考慮數據庫是不是已經安裝***的補丁。

2008 r2: FIX: SQL Server 2008 R2 performs poorly when most threads wait for the CMEMTHREAD wait type if the threads use table variables or temp tables to load or update rowsets

2012 ,2014 當您執行許多特殊查詢在 SQL Server 2012年或 SQL Server 2014 CMEMTHREAD 等待。

軟硬件環境

一個真實案例 教會你數據庫性能調優

目前數據庫的版本是 11.0.5556.0 而前面提到的補丁,安裝后的版本是:11.0.5623.0

代碼設計

是什么語句產生了等待。

都是類似下面的語句,***時,并發超過100。

SELECT

* INTO #Tmp from TB where 1=2

特點如下:

1.語句簡單 開銷都小于5不會產生并行。

2.都采用了select into #temptable的形式。

就像上面分析的一樣,CMEMTHREAD等待是一個并發問題,而不是一個內存問題。在其他方案行不通的時候,我們可以通過調整此類語句的寫法,減少CMEMTHREAD等待.

業務模型及架構

目前系統是單機運行的狀態,這其實是很少見的。存在少量OLAP 和OLTP業務混合的情況。后續我們會給客戶規劃 讀寫分離 或者負載均衡的解決方案。

解決方案

安裝***的補丁

至少需要安裝前面發的解決等待問題的FIX。建議是直接安裝到目前為止***的2012 SP4補丁。

修改參數

optimize for ad hoc workloads 從0修改為1 。針對將即席執行計劃ad hoc plans 插入到計劃緩存中的時候場景,減少ad hoc 查詢占用的內存。

增加TEMPDB數據文件的個數

select * into #temptable 會產生大量的閂鎖爭用,防止在CMEMTHREAD 等待消除后,出現大量的pagelatch 閂鎖爭用。我經歷過很多案例,解決了前面的一個擁堵之后,后面有產生了新的等待,導致性能更差了。請記住優化是一個長期的,循序漸進的過程。

一個真實案例 教會你數據庫性能調優

遷移TEMPDB數據文件的位置

目前部分tempdb文件放在S,一般分放在D盤。建議都遷移到S盤(存儲上面),增加tempdb的響應速度。如果可能的話,使用SSD來***化tempdb的性能,將會是不錯的選擇。

優化程序的代碼

修改代碼通常都是放在***面的,因為要牽涉的情況比較多。前面的手段80%的情況下,都可以解決問題。剩下的20%,我們需要,檢查程序中的邏輯,看看這些的語句都是什么業務產生的。什么條件會觸發這類業務.對應下面類似的語句都使用存儲過程,或者參數化后的方式,減少編譯和重編譯的次數。另外此類語句都會并發創建臨時表,可能通過調整tempdb的設置,加快此類語句的執行速度,減少同一時間此類語句的并發數量。

優化效果

經過前面的幾個優化手段,第二天開始,沒有再出現過一次CMEMTHREAD的等待。

等待

一個真實案例 教會你數據庫性能調優

慢語句

一個真實案例 教會你數據庫性能調優

總結

通過這篇文件你應該已經完全學會了數據庫性能調優的思想。他告訴了我們出現問題時,怎么動手一步一步的排查問題,就像剝洋蔥一樣一層一層的剝開。

參考

微軟官方博客對這類等待的原理和如何調試:How It Works: CMemThread and Debugging Them

SQL Server 2016 對這里問題進行了進一步的優化,詳細參考:SQL 2016 – It Just Runs Faster: Dynamic Memory Object (CMemThread) Partitioning 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2011-07-08 16:02:54

HBase

2023-04-03 10:25:00

數據庫性能調優

2021-01-25 09:20:04

數據庫架構分布式

2010-05-04 17:08:24

Oracle數據庫

2019-08-13 08:32:14

MySQL數據庫性能調優

2011-04-25 09:12:47

LinuxIO數據庫

2022-05-10 10:02:51

openGauss性能調優數據庫

2010-04-07 13:32:39

Oracle調優

2022-03-24 10:57:18

數據庫MySQLSQL

2010-03-10 11:29:47

MySQL數據庫性能調

2023-06-05 09:17:50

SQLAlchemy關系型數據庫

2021-12-29 08:21:01

Performance優化案例工具

2022-08-13 12:28:11

MySQL性能調優Explain

2011-04-18 13:46:24

數據庫設計

2011-08-15 18:09:46

查詢性能調優索引優化

2020-11-09 07:34:49

JVM性能監控

2017-07-21 08:55:13

TomcatJVM容器

2011-04-18 13:12:01

數據庫索引

2011-04-18 13:23:46

數據庫查詢

2011-04-18 13:36:32

數據庫游標
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲综合国产 | 日本精品一区二区三区在线观看视频 | 亚洲成人av一区二区 | 国产高清自拍视频在线观看 | 欧美视频xxx| 欧美精品乱码久久久久久按摩 | a免费视频 | 午夜视频在线免费观看 | 99久久精品免费看国产高清 | 欧美一区二区三区在线看 | 欧美手机在线 | 欧美一级片久久 | 精品成人免费一区二区在线播放 | 精品久久精品 | 日韩欧美中文在线 | 欧美精品成人一区二区三区四区 | a毛片视频网站 | 久久精品免费一区二区三 | 国产在线小视频 | 成人国产综合 | 91久久久久久久久久久 | 狠狠操电影 | 国产一区二区不卡 | 精品久久久久久久久久久 | 欧美日韩一 | 国产精品99久久久久久宅男 | 91在线看视频 | 国产精品一区二区在线 | 亚洲国产第一页 | 久草在线在线精品观看 | 国产一二三区免费视频 | 欧美在线亚洲 | 久久性色| av在线三级 | 综合久久久 | 久久精品国产一区二区电影 | 91亚洲免费 | 日韩一二区 | 日韩国产欧美视频 | 久久国产婷婷国产香蕉 | 国产精品久久久久久吹潮 |