PostgreSQL vacuum原理—啟動機制

jesselyu發表於2015-04-25

在”PostgreSQL vacuum原理一功能與引數中我在致講了vacuum的幾大功能點,以及相關的一些引數,如何來調整vacuum。那麼這一章節主要講比較核心的一些東西。

1.PG發起vacuum的流程

在PG例項起動時,postmaster 程式會fork出autovacuum launcher程式。

clip_image001

完整的vacuum程式建立如下:

pg_ctl命令列起動PG例項,然後fork出postmaster Server程式,這也是PG的主程式。postmaster程式再負責fork各種其它後臺程式。

按以下順序,依次起動:logger程式,checkpoint程式,writer程式,wal writer程式,autovacuum launcher程式以及stats collector程式。

autovacuum launcher程式再負責fork autovacuum worker程式。我們具體的vacuum動作最後都交由worker程式來做,幹雜活。

預設情況下,最多由三個worker程式,由引數autovacuum_max_workers控制。

image

2. autovacuum launcher程式

    autovacuum launcher是vacuum worker的總排程者。在起vacuum worker時,會先balance一次vacuum_cost_limit值,balance的過程就是新的worker起來時,

賦予此worker後面因vacuum而消耗的最大允許IO limit。因為vacuum_cost_limit值是所有worker平攤的,我們設定的vacuum_cost_limit是所有worker的總累加值。

因此新的work加入進來後,需要做兩件事:一是計算新的work的cost_limit值;二是調整已經在running的worker的cost_limit值。

另外值得注意的是:從目前原始碼中得知,vacuum_cost_limit的值是要被vacuum_cost_delay時間平分掉的。假設cost_limit的值是200,cost_delay是10毫秒,max worker是3個,

並且都在running狀態。那麼可以計算出,其實每個worker每個毫秒所能允許消耗的IO值是:200/10/3,約為6.6。

另外autovacuum launcher還要重建db list,根據autovacuum_naptime去計算每個db分配到的時間。引數介紹請見:”PostgreSQL vacuum原理一功能與引數”另外,

值得注意的是,雖然可以幾個worker一起執行,但是目前的做法是,在db 級別並行。也就是說worker是根據autovacuum launcher重建的db list去逐一遍歷每個DB的。

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

相關文章