Postgresql 的Checkpoint
Checkpoint是什麼?
checkpoint又名檢查點,一般checkpoint會將某個時間點之前的dirty data全部寫出到磁碟,以實現資料的一致性與完整性。目前各個流行的關係型資料庫都具備checkpoint功能,其主要目的是為了縮短crash recovery time,以Oracle為例,在進行資料恢復時,會以最近的checkpoint為參考點執行事務roll forward,然後對沒有commit的事務進行roll back。而在WAL機制的淺析中,也提過PostgreSQL在崩潰恢復時會以最近的checkpoint為基礎,不斷應用這之後的WAL日誌。機制大致相同。
PG的檢查點種類:
在xlog.h檔案中,有如下程式碼對checkpoint進行了相應的分類:
/*
* OR-able request flag bits for checkpoints. The "cause" bits are used only
* for logging purposes. Note: the flags must be defined so that it's
* sensible to OR together request flags arising from different requestors.
*/
/* These directly affect the behavior of CreateCheckPoint and subsidiaries */
#define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */
#define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint,
* but issued at end of WAL
* recovery */
#define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */
#define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */
/* These are important to RequestCheckpoint */
#define CHECKPOINT_WAIT 0x0010 /* Wait for completion */
/* These indicate the cause of a checkpoint request */
#define CHECKPOINT_CAUSE_XLOG 0x0020 /* XLOG consumption */
#define CHECKPOINT_CAUSE_TIME 0x0040 /* Elapsed time */
#define CHECKPOINT_FLUSH_ALL 0x0080 /* Flush all pages, including those
也就是說,以下幾種情況會觸發資料庫作業系統做檢查點操作:
資料庫shutdown
資料庫recovery完成
超級使用者(其他使用者不可)執行CHECKPOINT命令
XLOG日誌量達到了觸發checkpoint閾值
週期性地進行checkpoint
觸發checkpoint時,需要重新整理所有髒頁,為了能夠週期性的建立檢查點,減少崩潰恢復時間,同時合併I/O,PostgreSQL提供了輔助程式checkpointer。它會 週期性 檢測時間以及上面的XLOG日誌量閾值是否達到,而週期時間以及XLOG日誌量閾值可以透過引數來設定大小,接下來介紹下與checkpoints相關的引數。
checkpoints相關的引數
checkpoint_segments
當前最大的WAL日誌檔案段的數量,或者說,當系統的日誌量達到這麼多的時觸發一個檢查點,其預設值為3, 每個段的大小是16M,因此大概64M日誌觸發一個檢查點。調大這個數將延長系統崩潰後恢復的時間。
checkpoint_timeout
系統自動執行checkpoint之間的最大時間間隔。系統預設值是5分鐘。
checkpoint_completion_target
手冊上原文為“Specifies the target of checkpoint completion, asa fraction of total time between checkpoints”,完成檢查點所需要的時間/檢查點之間總時間的目標比例*100%,它要求系統在恰當的時間內完成檢查點,不要太快也不要太慢,過快將導致過於密集的IO, 形成IO風暴影響系統的平穩執行,過慢則可能引發持續性的IO, 降低系統效能。
checkpoint_warning
系統預設值是30秒,如果checkpoints的實際發生間隔小於該引數,將會在server log中寫入寫入一條相關資訊。可以透過設定為禁用。
checkpoint相關的計算:
checkpoint_completion_target對計算起著決定性的作用
假如引數這樣配置:
shared_buffers = 128GB # 1/4 記憶體
checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
checkpoint_timeout = 30min
max_wal_size = 256GB # 2*shared_buffers
min_wal_size = 64GB # shared_buffers * 1/2
1:極端假設128G全是髒資料
(128*1024)/(30*60*0.9)= 80.90864198 MB/s
要求磁碟的平均離散IO至少在這個之上,否則存在瓶頸,因為觸發時刻,壓力更大。
當然前提假設,128G都是髒的,如果髒資料不多,壓力更小
2:假設週期內產生256G的WAL
那麼
(256*1024)/ (30*60)= 145.6355556 MB/s
WAL為順序IO
3:bgWriter
業務上寫操作除了產生WAL,還有bgwriter週期性地寫出髒塊,因為一個塊可能被多次修改,但是writer此時可能更少
(256*1024)/ (30*60)= 145.6355556 MB/s
綜上,資料庫寫操作吞吐均值可能是 80.9 MB/s + 145.6 MB/s+ 145.6 MB/s=372MB/s
出發瞬間的壓力可能超過此值。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29497382/viewspace-2636778/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL checkpoint原理SQL
- PostgreSQL備機checkpointSQL
- PostgreSQL xlog格式之checkpointSQL
- PostgreSQL-PG程式之checkpoint(四)SQL
- postgresql 檢查點調整 checkpoint 轉SQL
- 【PG】PostgreSQL 預寫日誌(WAL)、checkpoint、LSNSQL
- PostgreSQL DBA(168) - pgAdmin(config:checkpoint)SQL
- PostgreSQL DBA(66) - 配置引數(checkpoint_flush_after)SQL
- PostgreSQL DBA(64) - checkpoint_completion_target引數解析SQL
- PostgreSQL啟動恢復透過checkpoint open wal檔案SQL
- PostgreSQL啟動恢復讀取checkpoint記錄失敗的條件SQL
- Checkpoint和SCN的解析
- Oracle中的checkpoint程式Oracle
- mysql checkpointMySql
- Postgres Checkpoint
- Oracle CheckpointOracle
- 對checkpoint的理解(轉載)
- Checkpoint總結
- checkpoint 優化優化
- MySQL中的redo log和checkpointMySql
- Oracle中checkpoint存在的意義Oracle
- 對“checkpoint not completed!”的理解 (zt)
- checkpoint詳解(zt)
- Oracle checkpoint詳解Oracle
- 初學checkpoint and scn
- Incremental checkpoint up to RBAREM
- 增量檢查點(incremental checkpoint)的解疑REM
- ckpt(checkpoint)機制研究
- oracle checkpoint檢查點Oracle
- checkpoint詳解(部分轉)
- Oracle checkpoint詳解一Oracle
- Oracle checkpoint詳解二Oracle
- 對checkpoint的理解一文的學習
- checkpoint時的SCN寫檔案動作
- SCN, checkpoint 及資料庫的恢復資料庫
- oracle checkpoint 觸發的9個條件Oracle
- PostgreSQL-PostgreSQL中的public(九)SQL
- MySQL checkpoint執行時機MySql