[SQL Server]Let's Clear Checkpoint process of In-Memory

Disk的checkpoint主要是將記憶體中的dirty pages和交易紀錄資訊寫入disk,

所以dirty pages的數量和checkpoint作業時間為線性關係,SQL Server會自動調整checkpoint作業頻率(預設60秒),

這樣做是要降低其他應用程式所受到的效能影響,如果減少頻率,則會拉長完成時間,

增加頻率,則會影響效能(資料庫一般I/O活動會大幅增加),

如果沒有特別理由,建議由SQL Server自行決定checkpoint頻率。

SQL Server以前在設計checkpoint作業,因當時物理硬碟限制,所以主要避免硬碟讀寫頭隨機搜尋(不像現在普遍都採用SSD),

在記憶體中一發現dirty page,先將每個dirty page放入queue中,

flush處理則會盡可能將queue中pages(依照page id)寫入單一block,讓這些pages在disk盡可能緊密且連續,

自動觸發checkpoint公式:

(Log records * fixed time to recover) > configured recovery interval=Enqueue automatic checkpoint

Note:SQL7.0~SQL2008預設dirty pages:16,SQL2012增加為32,SQL2016目前為128。

From Microsoft。

SQL2012引入間接checkpoint(SQL2016所有DB預設都採用間接checkpoint),

SQL Server依然需要追蹤有那些dirty pages,但結合以前設計優點並新增一條程序叫” PrepareToDirty”(間接checkpoint就是沿用該程序)。

SQL Server會建立一個dirty page manager,裡面會有partition list(依照LSN排序)來存放所有dirty pages list。

每個資料庫的TARGET_RECOVERY_TIME是用來觸發checkpoint作業(計算有多少dirty pages和Log records的redo時間),

間接checkpoint會取得目前的partition lists,list中的page都會依照ID正向排序,都準備就緒時,

會把這些page盡可能都寫入單一block(延續以前設計),

這時不影響dirty page manager查詢作業,因為dirty page manager還可以繼續存放其他空的partition list,

同時也可以避免list發生衝突,而寫入disk後,則會清空相關partition list並讓下一次checkpoint作業繼續使用。

間接checkpoint建議使用在記憶體足夠的系統上,

這也是為什麼SQL2016預設使用,MS宣稱當你建立一個4TB資料庫,

傳統自動checkpoint可能需要數分鐘,但間接checkpoint只需數秒即可完成(只建立250 BUF結構),

也可以縮短回復時間。

 

For In-Memory table

記憶體和硬碟資料表的自動checkpoint有點不同(因為兩種資料保存方式不同),

針對schema_and_data需求,checkpoint需要定期執行,以推進交易紀錄的使用紀錄,

來達到記憶體資料表還原或復原到上一個成功的checkpoint,

且當交易紀錄檔案大於1.5GB(包含硬碟和記憶體的交易紀錄)才會觸發(當然你也可以手動觸發checkpoint),

所以當你資料庫含有記憶體資料表時,執行備份交易紀錄檔案,

不一定可以截斷交易紀錄並重複使用空間,除非你達到1.5GB的門檻。

另外針對一些大系統也有一些特例,當你滿足下列三個條件時

1.Server超過16 logical processors

2.Server超過128GB記憶體

3.Server的subIOsystem超過 200MB/sec指標

 

這時SQL Server將自動啟用Large checkpoint for memory-optimized tables,這有以下2點行為改變

1.data files從128 MB變為 1GB,delta file從16 MB變為128MB

2.自動checkpoint觸發門檻從1.5GB變為12GB

我當時測試RTO卻非常緩慢,後來我才知道滿足三個條件後,SQL SERVER預設啟用Large checkpoint,

因為checkpoint門檻變為12GB,這可能大幅增加復原時間(如果中間不幸發生意外),

之後SQL Server team決定關閉預設啟用Large checkpoint,

我也有順便寫封Email來確認當時我遇到的問題,下面是來自microsoft的Jos de Bruijn回覆和我(擷取部分)

 

參考

Checkpoint Operation for Memory-Optimized Tables

CHECKPOINT (Transact-SQL)

SQL 2016 – It Just Runs Faster: Indirect Checkpoint Default

Database Checkpoints (SQL Server)

Checkpoint process for memory-optimized tables in SQL 2016 and implications on the log

[SQL Server]In-Memory Table檔案群組和檔案規劃考量

SQL Server 2016 Memory-Optimized Tables – The Checkpoint operation

FIX: Slow database recovery in SQL Server 2016 due to large log when you use In-Memory OLTP on a high-end computer