標籤:問題 記憶體 task 解決 檢查 SQ 恢複 address 處理
與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%‘;
MSSQL資料庫後台進程(線程)