有一個獨立的服務器進程,叫做后臺寫入器,它的功能就是發出寫“臟”(新的或修改過的)共享緩沖區的命令。它寫出共享緩沖區,這樣讓處理用戶查詢的服務器進程很少或者永不等待寫動作的發生。不過,后臺寫入器確實會增加 I/O 的總負荷,因為雖然在每個檢查點間隔中一個重復弄臟的頁面可能只會寫出一次,但在同一個間隔中后臺寫入器可能會把它寫出好幾次。在這一小節討論的參數可以被用于調節本地需求的行為。
bgwriter_delay (integer)
指定后臺寫入器活動輪次之間的延遲。在每個輪次中,寫入器都會為一定數量的臟緩沖區發出寫操作(可以用下面的參數控制)。然后它就休眠bgwriter_delay毫秒, 然后重復動作。 但是,當緩沖池中沒有臟緩沖區時,無視bgwriter_delay設置,它都會進入更長的睡眠時間。 默認值是 200 毫秒(200ms)。注意在許多系統上,休眠延遲的有效解析度是 10 毫秒;因此,為bgwriter_delay設置一個不是 10 的倍數的值與把它設置為下一個更高的 10 的倍數是一樣的效果。這個選項只能在服務器命令行上或者在postgresql.conf文件中設置。
bgwriter_lru_maxpages (integer)
在每個輪次中,不超過這么多個緩沖區將被后臺寫入器寫出。把這個參數設置為零可禁用后臺寫出(注意被一個獨立、專用輔助進程管理的檢查點不受影響)。默認值是100 個緩沖區。這個參數只能在postgresql.conf文件中或在服務器命令行上設置。
bgwriter_lru_multiplier (floating point)
每一輪次要寫的臟緩沖區的數目基于最近幾個輪次中服務器進程需要的新緩沖區的數目。最近所需的平均值乘以bgwriter_lru_multiplier可以估算下一輪次中將會需要的緩沖區數目。臟緩沖區將被寫出直到有很多干凈可重用的緩沖區(然而,每一輪次中寫出的緩沖區數不超過bgwriter_lru_maxpages)。 因此,設置為 1.0 表示一種“剛剛好的”策略,這種策略會寫出正好符合預測值的數目的緩沖區。 更大大的值可以為需求高峰提供某種緩沖,而更小的值則需要服務進程來處理一些寫出操作。默認值是 2.0。這個參數只能在postgresql.conf文件中或在服務器命令行上設置。
bgwriter_flush_after (integer)
不管何時后端寫入器寫入了超過bgwriter_flush_after字節,嘗試強制 OS 把這些寫發送到底層存儲上。這樣做將限制內核頁緩存中臟數據的量,降低了在檢查點末尾發出一個fsync時或者 OS 在后臺大批量寫回數據時卡住的可能性。那常常會導致大幅度壓縮的事務延遲,但是也有一些情況(特別是負載超過 shared_buffers但小于 OS 頁面高速緩存)的性能會降低。這種設置可能會在某些平臺上沒有效果。合法的范圍在0 (禁用強制寫回)和2MB之間。Linux 上的默認值是 512kB,其他平臺上是0(如果BLCKSZ 不是8kB,默認值和最大值按比例縮放)。這個參數只能在postgresql.conf 文件中或者服務器命令行上設置。
較小的bgwriter_lru_maxpages和bgwriter_lru_multiplier可以降低由后臺寫入器造成的額外 I/O 開銷。但更可能的是,服務器進程將必須自己發出寫入操作,這會延遲交互式查詢。