https://www.postgresql.org/docs/10/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-BACKGROUND-WRITER 19.4.5. Background Writer There is a separate server process called the background writer,whose function is to issue writes of “dirty” (new or modified) shared buffers. It writes shared buffers so server processes handling user queries seldom or never need to wait for a write to occur. However,the background writer does cause a net overall increase in I/O load,because while a repeatedly-dirtied page might otherwise be written only once per checkpoint interval,the background writer might write it several times as it is dirtied in the same interval. The parameters discussed in this subsection can be used to tune the behavior for local needs. bgwriter_delay (integer) Specifies the delay between activity rounds for the background writer. In each round the writer issues writes for some number of dirty buffers (controllable by the following parameters). It then sleeps for bgwriter_delay milliseconds,and repeats. When there are no dirty buffers in the buffer pool,though,it goes into a longer sleep regardless of bgwriter_delay. The default value is 200 milliseconds (200ms). Note that on many systems,the effective resolution of sleep delays is 10 milliseconds; setting bgwriter_delay to a value that is not a multiple of 10 might have the same results as setting it to the next higher multiple of 10. This parameter can only be set in the postgresql.conf file or on the server command line. bgwriter_lru_maxpages (integer) In each round,no more than this many buffers will be written by the background writer. Setting this to zero disables background writing. (Note that checkpoints,which are managed by a separate,dedicated auxiliary process,are unaffected.) The default value is 100 buffers. This parameter can only be set in the postgresql.conf file or on the server command line. bgwriter_lru_multiplier (floating point) The number of dirty buffers written in each round is based on the number of new buffers that have been needed by server processes during recent rounds. The average recent need is multiplied by bgwriter_lru_multiplier to arrive at an estimate of the number of buffers that will be needed during the next round. Dirty buffers are written until there are that many clean,reusable buffers available. (However,no more than bgwriter_lru_maxpages buffers will be written per round.) Thus,a setting of 1.0 represents a “just in time” policy of writing exactly the number of buffers predicted to be needed. Larger values provide some cushion against spikes in demand,while smaller values intentionally leave writes to be done by server processes. The default is 2.0. This parameter can only be set in the postgresql.conf file or on the server command line. bgwriter_flush_after (integer) Whenever more than bgwriter_flush_after bytes have been written by the background writer,attempt to force the OS to issue these writes to the underlying storage. Doing so will limit the amount of dirty data in the kernel's page cache,reducing the likelihood of stalls when an fsync is issued at the end of a checkpoint,or when the OS writes data back in larger batches in the background. Often that will result in greatly reduced transaction latency,but there also are some cases,especially with workloads that are bigger than shared_buffers,but smaller than the OS's page cache,where performance might degrade. This setting may have no effect on some platforms. The valid range is between 0,which disables forced writeback,and 2MB. The default is 512kB on Linux,0 elsewhere. (If BLCKSZ is not 8kB,the default and maximum values scale proportionally to it.) This parameter can only be set in the postgresql.conf file or on the server command line. Smaller values of bgwriter_lru_maxpages and bgwriter_lru_multiplier reduce the extra I/O load caused by the background writer,but make it more likely that server processes will have to issue writes for themselves,delaying interactive queries. 19.4.6. Asynchronous Behavior