PostgreSQL DBA(64) - checkpoint_completion_target引數解析

husthxd發表於2019-07-31

本文介紹了checkpoint_completion_target引數對checkpoint排程的影響.PostgreSQL對checkpoint過程的排程,與資料庫在執行過程中產生日誌的大小和時間兩個維度相關.

日誌
PostgreSQL原始碼中CalculateCheckpointSegments和IsCheckpointOnSchedule函式給出了checkpoint_completion_target引數對checkpoint排程的影響,在給出計算公式前,先行定義幾個變數:
checkpoint進度progress:


progress=(num_processed / num_to_scan)

其中:
1.num_processed已處理的髒塊數
2.num_to_scan總共需要處理的塊數

checkpoint啟動後產生的日誌相對允許最大日誌量的比例:


elapsed_xlogs = elapsed_xlogsize/wal_segment_size/checkpoint_segments
checkpoint_segments = max_wal_size_mb/wal_segment_size/(1.0 + checkpoint_completion_target)

其中:
1.elapsed_xlogsize是指在checkpoint啟動後產生的日誌量(以MB為單位)
2.wal_segment_size預設為16MB
3.max_wal_size_mb是postgresql.conf配置檔案中

在滿足以下條件時:


progress*checkpoint_completion_target ≥ elapsed_xlogs

在checkpointer程式會進行一定時間的休眠(100ms),以控制髒塊刷盤(包括fsync)的進度.

可以看出,上述條件的臨界點是:


progress*checkpoint_completion_target = elapsed_xlogs

現就此臨界點對該公式進行變換,讓checkpoint_completion_target放在等式的右邊:


(num_processed / num_to_scan)*checkpoint_completion_target = 
elapsed_xlogsize*(1.0 + checkpoint_completion_target)/max_wal_size_mb
-->
num_processed / num_to_scan = 
elapsed_xlogsize*(1.0/checkpoint_completion_target + 1)/max_wal_size_mb

由此可見,在其他變數一定的情況下,右邊算式的值與checkpoint_completion_target成反比,checkpoint_completion_target越大該值越小,意味著checkpointer程式休眠的機會越多.

時間
設elapsed_seconds=(now.tv_sec - ckpt_start_time + now.tv_usec / 1000000.0)表示過去消逝的時間
滿足以下條件,checkpointer進度可休眠:


(num_processed/num_to_scan)*checkpoint_completion_target ≥ elapsed_seconds / checkpoint_timeout
-->
num_processed/num_to_scan ≥ elapsed_seconds/(checkpoint_completion_target*checkpoint_timeout)

右邊表示式在其他變數一定的情況下,checkpoint_completion_target越大,則值越小,checkpointer可休眠的機會越大.

參考資料
PgSQL · 特性分析 · 談談checkpoint的排程

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

相關文章