自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)真實(shí)案例,教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

數(shù)據(jù)庫(kù)
微軟工程師的一個(gè)工程師曾經(jīng)對(duì)性能調(diào)優(yōu)有一個(gè)非常形象的比喻:剝洋蔥 。我也非常認(rèn)可,讓我們來(lái)一層一層撥開(kāi)外面它神秘的面紗。

前言

微軟工程師的一個(gè)工程師曾經(jīng)對(duì)性能調(diào)優(yōu)有一個(gè)非常形象的比喻:剝洋蔥 。我也非常認(rèn)可,讓我們來(lái)一層一層撥開(kāi)外面它神秘的面紗。

[[217135]]

六大因素

下面祭出的是我們?cè)诮o客戶分析數(shù)據(jù)庫(kù)性能問(wèn)題最常用的圖。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

看完這個(gè)圖,你是不是對(duì)性能調(diào)優(yōu)有了個(gè)基本的概念了。通常來(lái)講,我們會(huì)依照下面的順序來(lái)進(jìn)行分析:

  • 硬件能力

  • 系統(tǒng)規(guī)模

  • 數(shù)據(jù)庫(kù)內(nèi)部因素

  • 軟件環(huán)境

這4個(gè)的順序可以有所調(diào)整或者交換,但是對(duì)于系統(tǒng)的性能優(yōu)化一定要從全局出發(fā)。切勿一來(lái)就深入到某一個(gè)SQL語(yǔ)句的優(yōu)化,因?yàn)榭赡苣慊ㄙM(fèi)大量的時(shí)間把一個(gè)SQL從20s 優(yōu)化到1s,但是整個(gè)系統(tǒng)的卡慢仍然存在。

***才是:

  • 業(yè)務(wù)模型及架構(gòu)

  • 代碼設(shè)計(jì)

實(shí)戰(zhàn)案例

不廢話了,開(kāi)整開(kāi)整,直接上干貨。

時(shí)間:2018年1月某天

事件:某醫(yī)院客戶 下午4點(diǎn) 突然出現(xiàn)大面積的卡慢。整個(gè)系統(tǒng)出現(xiàn)嚴(yán)重問(wèn)題,信息中心電話打爆,醫(yī)院工程師手足無(wú)措。

萬(wàn)幸的是我們給數(shù)據(jù)庫(kù)裝了‘攝像頭’,下面就從監(jiān)控錄像來(lái)看看發(fā)送了什么。然后加以解決。

硬件能力

CPU

在問(wèn)題發(fā)生時(shí)間段內(nèi)CPU使用率在20%以下,正常。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

Memory

從下面的圖像顯示,內(nèi)存使用正常。

頁(yè)生命周期

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

可用內(nèi)存

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

IO

IO隊(duì)列平均值很低,15.48 左右有個(gè)瞬時(shí)的高點(diǎn),可留意這段時(shí)間有沒(méi)有批量的寫(xiě)入。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

總的來(lái)看,硬件資源是足夠的。

系統(tǒng)規(guī)模

問(wèn)題發(fā)生時(shí),每秒的批請(qǐng)求數(shù)并不是一個(gè)上升趨勢(shì),反而有所下降。這是因?yàn)橄到y(tǒng)的擁堵,等待 ,影響了系統(tǒng)的吞吐量。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

數(shù)據(jù)庫(kù)內(nèi)部因素

等待

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

慢語(yǔ)句

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

從會(huì)話和慢語(yǔ)句的趨勢(shì)圖可以看到,問(wèn)題發(fā)生的時(shí)間和客戶描述完全吻合,我們可以斷定本身事故的確是慢在數(shù)據(jù)庫(kù)。

什么導(dǎo)致的慢

檢查者個(gè)時(shí)間段運(yùn)行中的語(yǔ)句,可以發(fā)現(xiàn)下午15.58左右,數(shù)據(jù)庫(kù)中開(kāi)始出現(xiàn)越來(lái)越多的CMEMTHREAD等待。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

一直到1900頁(yè)16.08分的時(shí)候,出現(xiàn)了***達(dá)100個(gè)并發(fā)同時(shí)出現(xiàn)CMEMTHREAD等待。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

什么是CMEMTHREAD等待

微軟官方的描述:在任務(wù)正在等待線程安全的內(nèi)存對(duì)象時(shí)發(fā)生。 當(dāng)多個(gè)任務(wù)嘗試從同一個(gè)內(nèi)存對(duì)象分配內(nèi)存導(dǎo)致?tīng)?zhēng)用時(shí),等待時(shí)間可能會(huì)增加。

這個(gè)描述很晦澀,感覺(jué)還是完全不知道等待類型是怎么回事,應(yīng)該怎么處理這類問(wèn)題。

實(shí)際上,從官方描述來(lái)看是內(nèi)存爭(zhēng)用的問(wèn)題,但是實(shí)際上這個(gè)問(wèn)題的關(guān)鍵在于多個(gè)任務(wù)的爭(zhēng)用,實(shí)際上是并發(fā)的執(zhí)行的問(wèn)題。

場(chǎng)景

  1. 出現(xiàn)在數(shù)據(jù)庫(kù)編譯或重編譯時(shí),將即席執(zhí)行計(jì)劃ad hoc plans 插入到計(jì)劃緩存中的時(shí)候

  2. NUMA架構(gòu)下,內(nèi)存對(duì)象是按照節(jié)點(diǎn)來(lái)分區(qū)的

內(nèi)存對(duì)象有三種類型的(Global,Per Numa Node,Per CPU)。 SQL Server將允許對(duì)內(nèi)存對(duì)象進(jìn)行分段,以便只有同一節(jié)點(diǎn)或CPU上的線程具有相同的底層CMemObj,從而減少來(lái)自其他節(jié)點(diǎn)或cpu的線程交互,從而提高性能和可伸縮性。減少內(nèi)存的并發(fā)爭(zhēng)用。

  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 

如果你發(fā)現(xiàn),Partitioned by Node 的內(nèi)存開(kāi)銷是排在前面的,可以使用TRACE FLAG 8048來(lái)減少CMEMTHREAD等待。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

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

3. 補(bǔ)丁

這類場(chǎng)景是最常見(jiàn)的。如果在系統(tǒng)中發(fā)現(xiàn)出現(xiàn)大量的CMEMTHREAD等待,優(yōu)先考慮數(shù)據(jù)庫(kù)是不是已經(jīng)安裝***的補(bǔ)丁。

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 當(dāng)您執(zhí)行許多特殊查詢?cè)?SQL Server 2012年或 SQL Server 2014 CMEMTHREAD 等待。

軟硬件環(huán)境

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

目前數(shù)據(jù)庫(kù)的版本是 11.0.5556.0 而前面提到的補(bǔ)丁,安裝后的版本是:11.0.5623.0

代碼設(shè)計(jì)

是什么語(yǔ)句產(chǎn)生了等待。

都是類似下面的語(yǔ)句,***時(shí),并發(fā)超過(guò)100。

SELECT

* INTO #Tmp from TB where 1=2

特點(diǎn)如下:

1.語(yǔ)句簡(jiǎn)單 開(kāi)銷都小于5不會(huì)產(chǎn)生并行。

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

就像上面分析的一樣,CMEMTHREAD等待是一個(gè)并發(fā)問(wèn)題,而不是一個(gè)內(nèi)存問(wèn)題。在其他方案行不通的時(shí)候,我們可以通過(guò)調(diào)整此類語(yǔ)句的寫(xiě)法,減少CMEMTHREAD等待.

業(yè)務(wù)模型及架構(gòu)

目前系統(tǒng)是單機(jī)運(yùn)行的狀態(tài),這其實(shí)是很少見(jiàn)的。存在少量OLAP 和OLTP業(yè)務(wù)混合的情況。后續(xù)我們會(huì)給客戶規(guī)劃 讀寫(xiě)分離 或者負(fù)載均衡的解決方案。

解決方案

安裝***的補(bǔ)丁

至少需要安裝前面發(fā)的解決等待問(wèn)題的FIX。建議是直接安裝到目前為止***的2012 SP4補(bǔ)丁。

修改參數(shù)

optimize for ad hoc workloads 從0修改為1 。針對(duì)將即席執(zhí)行計(jì)劃ad hoc plans 插入到計(jì)劃緩存中的時(shí)候場(chǎng)景,減少ad hoc 查詢占用的內(nèi)存。

增加TEMPDB數(shù)據(jù)文件的個(gè)數(shù)

select * into #temptable 會(huì)產(chǎn)生大量的閂鎖爭(zhēng)用,防止在CMEMTHREAD 等待消除后,出現(xiàn)大量的pagelatch 閂鎖爭(zhēng)用。我經(jīng)歷過(guò)很多案例,解決了前面的一個(gè)擁堵之后,后面有產(chǎn)生了新的等待,導(dǎo)致性能更差了。請(qǐng)記住,優(yōu)化是一個(gè)長(zhǎng)期的,循序漸進(jìn)的過(guò)程。

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

遷移TEMPDB數(shù)據(jù)文件的位置

目前部分tempdb文件放在S,一般分放在D盤(pán)。建議都遷移到S盤(pán)(存儲(chǔ)上面),增加tempdb的響應(yīng)速度。如果可能的話,使用SSD來(lái)***化tempdb的性能,將會(huì)是不錯(cuò)的選擇。

優(yōu)化程序的代碼

修改代碼通常都是放在***面的,因?yàn)橐獱可娴那闆r比較多。前面的手段80%的情況下,都可以解決問(wèn)題。剩下的20%,我們需要,檢查程序中的邏輯,看看這些的語(yǔ)句都是什么業(yè)務(wù)產(chǎn)生的。什么條件會(huì)觸發(fā)這類業(yè)務(wù).對(duì)應(yīng)下面類似的語(yǔ)句都使用存儲(chǔ)過(guò)程,或者參數(shù)化后的方式,減少編譯和重編譯的次數(shù)。另外此類語(yǔ)句都會(huì)并發(fā)創(chuàng)建臨時(shí)表,可能通過(guò)調(diào)整tempdb的設(shè)置,加快此類語(yǔ)句的執(zhí)行速度,減少同一時(shí)間此類語(yǔ)句的并發(fā)數(shù)量。

優(yōu)化效果

經(jīng)過(guò)前面的幾個(gè)優(yōu)化手段,第二天開(kāi)始,沒(méi)有再出現(xiàn)過(guò)一次CMEMTHREAD的等待。

等待

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

慢語(yǔ)句

一個(gè)真實(shí)案例 教會(huì)你數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

總結(jié)

通過(guò)這篇文件你應(yīng)該已經(jīng)完全學(xué)會(huì)了數(shù)據(jù)庫(kù)性能調(diào)優(yōu)的思想。他告訴了我們出現(xiàn)問(wèn)題時(shí),怎么動(dòng)手一步一步的排查問(wèn)題,就像剝洋蔥一樣一層一層的剝開(kāi)。

參考

微軟官方博客對(duì)這類等待的原理和如何調(diào)試:How It Works: CMemThread and Debugging Them

SQL Server 2016 對(duì)這里問(wèn)題進(jìn)行了進(jìn)一步的優(yōu)化,詳細(xì)參考:SQL 2016 – It Just Runs Faster: Dynamic Memory Object (CMemThread) Partitioning 

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2011-07-08 16:02:54

HBase

2023-04-03 10:25:00

數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

2021-01-25 09:20:04

數(shù)據(jù)庫(kù)架構(gòu)分布式

2010-05-04 17:08:24

Oracle數(shù)據(jù)庫(kù)

2019-08-13 08:32:14

MySQL數(shù)據(jù)庫(kù)性能調(diào)優(yōu)

2022-05-10 10:02:51

openGauss性能調(diào)優(yōu)數(shù)據(jù)庫(kù)

2011-04-25 09:12:47

LinuxIO數(shù)據(jù)庫(kù)

2010-04-07 13:32:39

Oracle調(diào)優(yōu)

2022-03-24 10:57:18

數(shù)據(jù)庫(kù)MySQLSQL

2010-03-10 11:29:47

MySQL數(shù)據(jù)庫(kù)性能調(diào)

2021-12-29 08:21:01

Performance優(yōu)化案例工具

2022-08-13 12:28:11

MySQL性能調(diào)優(yōu)Explain

2023-06-05 09:17:50

SQLAlchemy關(guān)系型數(shù)據(jù)庫(kù)

2011-04-18 13:46:24

數(shù)據(jù)庫(kù)設(shè)計(jì)

2011-08-15 18:09:46

查詢性能調(diào)優(yōu)索引優(yōu)化

2020-11-09 07:34:49

JVM性能監(jiān)控

2011-04-18 13:12:01

數(shù)據(jù)庫(kù)索引

2011-04-18 13:23:46

數(shù)據(jù)庫(kù)查詢

2011-04-18 13:36:32

數(shù)據(jù)庫(kù)游標(biāo)

2011-05-24 09:45:41

Oracle數(shù)據(jù)庫(kù)系統(tǒng)調(diào)優(yōu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)