Tempdb怎麼會成為效能瓶頸?

2021-07-26 17:16:31 字數 2337 閱讀 9184

我曾經遇到過這樣乙個效能問題。乙個客戶反映,他的sql server會在某一段時間裡,突然變得非常慢。最後他不得不重啟sql server服務。而重啟以後,問題就消失了。客戶在出現問題的那段時間裡,收集了主要的系統動態管理檢視,以及效能監視器裡和sql server有關的那些計數器。順便說一句,這台伺服器有16顆cpu。

sys.dm_exec_requests是檢查sql server效能瓶頸的有力工具。在處理sql server效能問題的時候,它是作者第二個檢查的物件。(第乙個當然是sql server的日誌檔案,要確認server當時沒有異常。)

從sys.dm_exec_requests的結果看,問題比較明顯,有很多任務在爭搶頁面2:18:331608上的pagelatch_x資源。tempdb上的瓶頸是當時最大的問題。

tempdb上的乙個頁面,能造成客戶整個sql server響應緩慢。這是為什麼?為什麼重起又能解決問題呢?

tempdb是sql server裡的乙個重要的系統資料庫。許多使用者的操作,都有可能使用到它。最常見的當然是使用者使用臨時表或者表變數。其他可能性有,使用者使用trigger,snapshot isolation level,某些複雜的查詢,dbcc checkdb,以及dbcc reindex等。

當資料庫建立一張新錶的時候,sql server要為這張表分配儲存頁面,同時sql server也要修改sgam, pfs, 和gam頁面,把已經分配出去的頁面標誌成已使用。所以每建立一張新錶,sgam, pfs, 和gam這些系統頁面都會有修改動作。

這種行為對一般的使用者資料庫不會有問題,因為正常的應用不會折騰著不停地建表、刪表。但是tempdb就不同了。如果乙個儲存過程使用了臨時表,而這個儲存過程被併發使用者廣泛使用,那很自然地就會有很多併發使用者在tempdb裡同時建立表,做完了以後又刪除表。這樣,在乙個時間點,會有很多任務要修改sgam, pfs, 或gam頁面。但是為了維護物理的一致性,對於同乙個頁面,sql server在乙個時間點同時只允許乙個使用者修改它。所以對於tempdb,如果同時有很多很多人要在同乙個資料檔案裡分配空間,那這個資料檔案的sgam, pfs, 或gam頁面,就有可能成為系統瓶頸。大家只能乙個乙個做,併發度上不去。

但是2:18:331608這個值讓人有點疑惑。第一,檔案id 18意味著這個tempdb上至少有18個檔案。除去乙個日誌檔案,這個tempdb至少有17個資料檔案。而這台伺服器只有16顆cpu,為什麼大家別的資料檔案都不用,非要搶這個第18號檔案呢?這是很奇怪的地方。第二,sgam, pfs, 和gam頁面都在檔案的開頭。只有當資料檔案變得比較大以後,檔案頭的那幾個頁面已經不夠用了,sql server才會在後面再分配新的系統頁面。所以331608意味著這個18號檔案當時已經比較大了。

帶著這些疑惑,作者又讓客戶收集了乙個tempdb上的sp_helpfile結果。這個結果回答了疑惑。

像前面猜測的一樣,這個tempdb上果然有17個資料檔案。但是這些檔案的配置是不一樣的。前16個檔案的初始大小是256mb,最大大小是512mb。而最後乙個資料檔案,也就是出問題的18號,初始大小是2gb,沒有上限。使用者這樣設定,顯然是為了防止tempdb在p盤上使用太多的空間。

如果tempdb能夠同時使用這17個資料檔案,那麼它會同時在不同的資料檔案裡為不同的使用者分配空間。也就意味著,同時可以有多個人建立臨時物件。這樣tempdb就不再會是系統的效能瓶頸。併發度會大大提高。

那這位使用者那裡發生了什麼呢?通過效能監視器的計數器sqlserver:databases – data file(s) size (kb),發現當時tempdb的總大小在21gb。也就是說,前面的16個小的資料檔案已經用滿。sql server只好集中使用第18號資料檔案,因為它沒有上限,就讓它不斷自動增長。所有的壓力都集中在了乙個檔案上,難怪這個檔案成為了瓶頸。

sql server重起以後,tempdb被清空。使用者重新可以同時使用這17個檔案。所以,重起解決了問題。

為了達到長治久安,在高併發、又大量使用tempdb的sql server裡,dba需要這樣配置tempdb。

1.建立和cpu數目同樣多的tempdb資料檔案,每個檔案的大小要一樣大。

這裡客戶應該建立16個資料庫檔案,每個2gb,差不多夠用。

2. 嚴密監視tempdb空間使用情況,確保這些檔案不會被sql server寫滿。

3. 如果使用中發現初始空間不夠大,需要手工增長每乙個資料檔案,確保它們始終一樣大。

如果初始空間不夠大,sql server會自動增長某個檔案,獲得新的空間。而這個自動增長的檔案會成為系統瓶頸。所以不能依賴sql server幫你自動增長。

當然,監視tempdb的使用情況,搞清楚是誰在tempdb裡占用了這麼多空間也是很重要的。

glassfish 怎麼會這樣

專案中伺服器使用的是 glassfish v2版本,碰到2次有點不可思議的事,都是因為在myeclipse7.5啟動了glassfish。1。實現 忘記密碼 這個功能的時候,使用的是jmail。網上找了很多 都是不行,找到一篇e文的 說一定可以,貼上到我的 中,還是不行,後才逛了無數篇帖子,提到在m...

正則不怎麼會用

一 基本正則 1.乙個點 匹配除換行符之外的任意乙個字元,例如r.t能匹配rat ret,但是不能匹配root 2.符號 用於匹配前乙個字元0次或任意多次,比如ab 可以a ab abb等。比如 代表任意長度的不包含換行的字元 grep r t etc passwd 沒有rt rrt rrrt,只能...

技術怎麼會有過渡之說?

數日前袁紅崗寫文章說ajax,只是一種過渡技術。當時看到後,就覺得不妥。其內容有推銷自己產品之嫌,如果真是這樣,我覺得將是乙個敗筆。如果聽信他的話,我看當前所有採用apusic jsf技術的朋友應該放棄這個技術了,乙個過渡的東西,你還學個什麼勁啊。快去問一下袁兄,什麼才不是過渡技術吧。最近csdn的...