SQL Server 何時將“髒頁”回寫到硬盤

原文出處: 舒永春


SQL Server的工作原理:不能直接修改硬盤上的數據,而是先將數據從硬盤讀入到內存的data cache,然後在內存中修改(被修改過的頁稱爲髒數據頁),最後再從內存回寫到硬盤。下述進程都可能將髒頁回寫到硬盤。


一、Checkpoint(檢查點)

  Checkpoint會搜索整個data cache,將髒頁回寫到硬盤。

  以下情況通常會觸發checkpoint:

1、運行Checkpoint 命令。

2、使用alter database往數據庫中添加了文件,或者從數據庫中刪除了文件。

3、備份數據庫。在數據庫備份之前,數據庫引擎會自動執行檢查點,以便在備份中包含對數據庫數據頁面的全部更改。

4、正常關閉SQL Server,並且不使用NOWAIT選項。

5、SQL Server預計的恢復時間超過了恢復間隔(recovery interval)。該值默認爲0,即由SQL Server自動配置,一般爲1分鐘。一般情況下,按最低每分鐘10MB日誌進行設計。


  以下特殊情況也會觸發checkpoint:

1、當恢復模式爲簡單時,如果日誌文件的空閒空間低於70%。例外的情況是:如果日誌文件是由於一個事務長時間執行而且尚未結束(意味着沒有空間可釋放)導致空閒空間低於70%,則不會觸發checkpoint。

2、當恢復模式爲大容量日誌時,對數據庫做了一個大容量操作。


  checkpoint對數據庫的影響:

1、當數據庫重啓時,SQL Server將從checkpoint 完成的這個時間點開始恢復,即在此之後做redo(前滾)。這種機制加速了恢復的進度。

2、當恢復模式爲簡單時,checkpoint在把髒頁回寫到硬盤後,就去截斷日誌(將VLF的狀態從2改爲0)。



二、Lazywriter(惰性編輯器)

  SQL Server爲每一個NUMA(非一致性內存訪問)配備一個Lazywriter線程。Lazywriter被定期喚醒後,就去掃描與NUMA節點中的data cache,檢查自由列表(free list)。如果列表的大小低於某個閥值(這個閥值取決於data cache的總大小)意味着內存壓力,Lazywriter就去掃描data cache,將其中一些頁標記到自由列表,表示這是空閒內存;如果這些頁中有髒頁,就回寫到硬盤。

  當Lazywriter察覺到系統有內存壓力時,它會增加或減少自由列表上的數據頁,使操作系統的可用物理內存保持在4.8~5.2MB,以防止分頁。

  Lazywriter自SQL Server 2005被引入。它與checkpoint的主要區別:checkpoint不會去修改自由列表。

  這是一個週期運行的線程,默認情況下,每隔一秒鐘運行一次。


三、Worker Thread(工作線程)

  SQL Server 啓動時,同時啓動30~40個工作線程,用於完成客戶端連接提出的各種操作請求。當客戶端連接增加時,SQL Server會自動啓動新的工作線程。當某個工作線程空閒15分鐘,就會被關閉;當空閒內存不夠時,某些工作線程也會被關閉(x86環境)。在x86環境,每個工作線程至少佔用0.5MB內存;在x64環境,每個工作線程至少佔用2MB內存。

  當worker線程察覺內存壓力時,它會掃描data cache,把一段時間內未被訪問的數據頁添加到自由列表;如果這些頁中有髒頁,就回寫到硬盤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章