PG:checkpoint是什么?該如何寫(xiě)數(shù)據(jù)?
PG:checkpoint是什么
Checkpoint是PG中的核心概念。然而會(huì)有用戶(hù)對(duì)此比較陌生,不知道如何調(diào)優(yōu)。本文解釋checkpoint及如何調(diào)優(yōu),希望對(duì)數(shù)據(jù)庫(kù)內(nèi)核理解有所幫助。
PG如何寫(xiě)數(shù)據(jù)
詳細(xì)討論checkpoint前,理解PG是如何write數(shù)據(jù)的非常重要,看下面的圖:
重要的假設(shè)是crash會(huì)發(fā)生在任何時(shí)間。為什么和這個(gè)相關(guān)?需要確認(rèn)數(shù)據(jù)庫(kù)永遠(yuǎn)不會(huì)被破壞。我們不能直接將數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件。為甚?假設(shè)要將“1234”寫(xiě)入數(shù)據(jù)文件,如果在“12”后面崩潰,結(jié)果將是表中某個(gè)位置的一個(gè)元組被破壞,索引條目可能丟失等。我們必須不惜一切代價(jià)防止這種情況發(fā)生。
因此需要更加復(fù)雜的數(shù)據(jù)寫(xiě)入方法。PG首先將數(shù)據(jù)寫(xiě)入WAL,WAL就像一個(gè)包含二進(jìn)制變化的順序磁帶。如果添加一行,WAL可能包含一條記錄,用于記錄數(shù)據(jù)文件哪些地方改動(dòng)了,可能包含一組索引記錄改動(dòng)的指令、可能需要寫(xiě)入一個(gè)額外的頁(yè)等,僅包含一系列變化。
數(shù)據(jù)一旦寫(xiě)入WAL,PG將會(huì)對(duì)共享緩存區(qū)中的數(shù)據(jù)頁(yè)進(jìn)行更改,注意數(shù)據(jù)文件中仍沒(méi)有數(shù)據(jù),F(xiàn)在有了WAL條目及共享緩沖區(qū)的臟頁(yè)。如果一個(gè)讀取請(qǐng)求來(lái)了,可從緩存中找到,而不用到磁盤(pán)上讀取。
某個(gè)時(shí)刻,內(nèi)存中的臟頁(yè)會(huì)由后臺(tái)寫(xiě)入進(jìn)程寫(xiě)入磁盤(pán)。這里最重要的一點(diǎn)是,數(shù)據(jù)可能會(huì)被亂序?qū)懭,這個(gè)是沒(méi)有問(wèn)題的。如果用戶(hù)想讀取數(shù)據(jù),PG先從共享緩沖區(qū)中獲取。因此臟頁(yè)的寫(xiě)入順序與此無(wú)關(guān)。甚至可以晚一點(diǎn)寫(xiě)入,以增加一次sync的量。
刪除WAL
WAL不能無(wú)限寫(xiě)入,需要回收空間。這就是CHECKPOINT需要干的活之一。
Checkpoint的目的就是確保臟頁(yè)刷寫(xiě)到磁盤(pán),然后該臟頁(yè)對(duì)應(yīng)的WAL及之前的WAL就可以刪除回收了。PG的方法啟動(dòng)一個(gè)checkpoint進(jìn)程,將bgwriter進(jìn)程沒(méi)有刷寫(xiě)的刷寫(xiě)到磁盤(pán)。但是這個(gè)過(guò)程并沒(méi)有盡可能快的刷,我們需要使IO平穩(wěn),保證穩(wěn)定的響應(yīng)時(shí)間。
控制checkpoint平穩(wěn)的參數(shù)為:
test=# SHOW checkpoint_completion_target;checkpoint_completion_target------------------------------0.5(1 row)
到下個(gè)checkpoint開(kāi)始前完成刷寫(xiě)一半。真實(shí)情況下對(duì)于大多數(shù)負(fù)載0.7-0.9就可以了,但可以隨意設(shè)置。注意PG14中這個(gè)參數(shù)就會(huì)取消了,硬編碼值為0.9。下一個(gè)問(wèn)題是:什么時(shí)候進(jìn)行checkpoint呢?參數(shù)為:
test=# SHOW checkpoint_timeout;checkpoint_timeout--------------------5min(1 row)test=# SHOW max_wal_size;max_wal_size--------------1GB(1 row)
如果系統(tǒng)的負(fù)載比較低,在一段時(shí)間后進(jìn)行checkpoint。默認(rèn)值是5分鐘,但建議增加這個(gè)值以提高寫(xiě)入性能。注意,請(qǐng)隨意修改這個(gè)值,僅會(huì)影響性能,不會(huì)以任何方式傷害數(shù)據(jù)庫(kù),除了性能沒(méi)有數(shù)據(jù)會(huì)有風(fēng)險(xiǎn)。
max_wal_size有點(diǎn)棘手,這個(gè)是個(gè)軟限制,不是硬限制。因此WAL會(huì)超過(guò)這個(gè)值。這個(gè)值為了告訴PG可以堆積多少WAL,從而挑戰(zhàn)checkpoint。現(xiàn)實(shí)中,提高這個(gè)值會(huì)消耗更多空間,但是會(huì)提高性能。
為啥不將max_wal_size設(shè)置成無(wú)限大呢?首先很明顯,這樣就需要更多空間。另外,一旦數(shù)據(jù)庫(kù)崩潰,PG就需要從上個(gè)checkpoint處開(kāi)始回放,這樣回放的時(shí)間就非常長(zhǎng)了。如果檢查點(diǎn)的距離增加,性能確實(shí)會(huì)提升,但是所做的和想要達(dá)到的效果有限,從某種意義上說(shuō),在這個(gè)問(wèn)題上投入更多存儲(chǔ)空間不會(huì)改變?nèi)魏问虑椤?/p>
后臺(tái)寫(xiě)進(jìn)程會(huì)將臟頁(yè)刷寫(xiě)到磁盤(pán),然而許多情況下,更多工作是由checkpoint進(jìn)程本身完成,因此關(guān)注checkpoint比后臺(tái)寫(xiě)進(jìn)程有意義。
min_wal_size:神秘參數(shù)
min_wal_size 和max_wal_size有什么區(qū)別呢?如果PG空閑,會(huì)逐漸將WAL量減少到min_wal_size,這是個(gè)緩慢的過(guò)程,不是立即一蹴而就。假設(shè)本周內(nèi)有高寫(xiě)負(fù)載,但是在周末會(huì)空閑。禮拜五下午,WAL量會(huì)很多,但是周末,會(huì)漸漸減少。當(dāng)?shù)街芤缓,WAL量又會(huì)增加。
因此最后將min_wal_size的值設(shè)置的不要太小。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開(kāi)發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車(chē)電氣化和底盤(pán)解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.16立即報(bào)名>>> 【在線會(huì)議】ImSym 開(kāi)啟全流程成像仿真時(shí)代
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來(lái)出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專(zhuān)題
- 1 人形機(jī)器人核心零部件,誰(shuí)是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒(méi)回牌桌,但重注全壓在了
- 6 蘋(píng)果或?qū)渴肿止?jié)騰訊大模型,我國(guó)大模型產(chǎn)業(yè)發(fā)展駛?cè)肟燔?chē)道
- 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來(lái),歌爾股份“智能體”在下一盤(pán)“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來(lái)當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專(zhuān)家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市