MSSQL資料庫後臺程式(執行緒)

sqysl發表於2018-01-08

與Oracle資料庫類似,微軟資料庫產品MSSQL也有諸多後臺程式來保證資料庫系統的高效正常運轉,由於MSSQL採用的是執行緒模型,應該叫做後臺執行緒,為了大家易於理解,我們在暫且稱之為後臺程式,下面我們就來簡要看一下:

與Oracle資料庫類似,微軟資料庫產品MSSQL也有諸多後臺程式來保證資料庫系統的高效正常運轉,由於MSSQL採用的是執行緒模型,應該叫做後臺執行緒,為了大家易於理解,我們在暫且稱之為後臺程式,下面我們就來簡要看一下:

1、 資料寫相關程式

1)   Lazy writer:該程式用來確保系統緩衝區(buffer pool)中有足夠的自由記憶體,該程式定期掃描緩衝記憶體頁,以發現不常使用的記憶體頁並將其移出緩衝區,期間,會先將髒頁資料寫出到磁碟並移除緩衝區。

2)   Eager writer:和lazy writer類似,該程式也是負責將緩衝區內的髒頁寫出到磁碟,但它寫出的這些記憶體頁主要是和非日誌(non-logged,例如:bulk insert,select into)操作相關,期間,允許讀寫新頁並行發生。

3)   Checkpoint:該程式定期掃描緩衝區以發現特定資料庫的髒頁,並將這些髒頁寫出到磁碟,透過建立一個在此之前確認所有髒頁都寫出到磁碟的時間點,可以減少最近資料庫恢復需要的時間。使用者可以透過提交checkpoint命令來請求一個檢查點操作,或者系統也可以根據消耗的日誌空間或時間自動產生一個檢查點操作,此外,當系統中的某些事件也會導致檢查點的發生,例如:增減或移除資料檔案或日誌檔案,例項的關閉等。當檢查點發生時,該程式將緩衝區內的髒頁寫出到磁碟,無論相關事務是否已經提交,都要寫出到磁碟。

值得一提的是,這三個後臺程式都是非同步的,即它們在進行IO操作的同時可以去做其他工作,稍後再來檢查之前IO的完成情況。

2、 事務日誌相關程式

1)   Log writer:該程式負責將事務日誌從緩衝區刷出到磁碟日誌檔案。MSSQL2016前的版本,每個例項只有一個log writer程式,因此,該程式負責例項中的所有資料庫log buffer。該程式透過非同步IO完成log buffer到磁碟的寫出,當使用者提交一個事務時,該程式阻塞該使用者會話,直到將相關資料庫log buffer資料刷出到磁碟完成,同時,該程式還可以繼續其他資料庫log buffer的工作。MSSQL系統中的諸多事件都會觸發log writer程式向磁碟寫出log buffer中的內容,例如:會話提交當前事務,log buffer被寫滿,checkpoint等。

此外,該程式將lredo記錄從log cache/buffer寫出到磁碟log files時,寫出單位是可以變化的,從512~64k不等,這點來說,不像data buffer寫出程式一樣,最小必須是資料頁大小。

2)   Backup log:該程式雖然嚴格來說算不上一個後臺程式,因為它用於完成使用者發出的“backup log…”命令,但它卻是和事務日誌緊密相關。

3、 系統監視和管理相關程式

1)   Signal handler:該程式主要負責MSSQL例項的啟動和關閉。

2)   Task manager:該程式也會參與MSSQL例項的啟動過程,主要用來啟動例項相關的所有資料庫。此外,該程式還負責啟動MSSQL內部某些任務,以及監視例項服務程式和啟動時間等任務。

3)   Resource monitor:該程式主要負責監視記憶體層面的使用和狀態,並在必要時對MSSQL相關緩衝進行調整,當檢測到沒有使用者需求被處理時,將自動進入空閒狀態。

4)   Lock monitor:該程式負責監視阻塞時間超過系統相關閾值的場景,同時,還負責解決死鎖問題。

5)   Ghost cleanup:該程式會週期性的喚醒,並對所有索引中已被標記為刪除的索引項進行檢查,然後,將這些索引項物理移除。

6)   Trace queue task:該程式負責監視跟蹤檔案和行集供應者。對跟蹤檔案,該程式每4秒就會將資料刷出到磁碟檔案;對行集,將會關閉超過10分鐘沒收到任何事件的供應者。

4、 作業排程相關程式

SQLServer Agent:嚴格來說,這並不算是一個後臺程式,而是windows服務,該服務負責完成各種作業的排程和執行。

5、 其他相關程式

1)   XE Timer和XE Dispatcher:這些是擴充套件事件(Extended Event)相關的程式,負責定期將收集到的資料從緩衝非同步傳送到目的地。

2)   BRKR EVENT HNDLR和BRKR TASK:這些事件是服務代理人(Service Broker)相關程式。前者主要負責處理服務代理的所有啟動和關閉事件;後者為執行內部服務代理任務的眾多程式之一。

我們可以透過如下SQL來查詢MSSQL例項後臺程式相關的資訊:

select t.os_thread_id,r.session_id,r.status,r.command
from sys.dm_os_threads t inner join sys.dm_os_workers w on t.thread_address=w.thread_address
inner join sys.dm_exec_requests r on w.task_address=r.task_address
where r.status like '%background%';

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2149858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章