在对数据进行处理之前都需要将数据从磁盘读到内存中,更新完毕后再将修改的数据写回磁盘,在postgresql数据中由backgroud writer与server process负责将“脏“数据写回磁盘。数据库执行flush数据大致过程:先由backgroud writer进程进行写,剩余的数据再由server process进程完成。
影响backgroud writer进程写数据的参数有以下几个:
bgwriter_delay:
backgroud writer进程连续两次flush数据之间的时间的间隔。默认值是200,单位是毫秒。
bgwriter_lru_maxpages:
backgroud writer进程每次写的最多数据量,默认值是100,单位buffers。如果脏数据量小于该数值时,写操作全部由backgroud writer进程完成;反之,大于该值时,大于的部分将有server process进程完成。设置该值为0时表示禁用backgroud writer写进程,完全有server process来完成;配置为-1时表示所有脏数据都由backgroud writer来完成。(这里不包括checkpoint操作)
bgwriter_lru_multiplier:
这个参数表示每次往磁盘写数据块的数量,当然该值必须小于bgwriter_lru_maxpages。设置太小时需要写入的脏数据量大于每次写入的数据量,这样剩余需要写入磁盘的工作需要server process进程来完成,将会降低性能;值配置太大说明写入的脏数据量多于当时所需buffer的数量,方便了后面再次申请buffer工作,同时可能出现IO的浪费。该参数的默认值是2.0。
bgwriter的最大数据量计算方式:
1000/bgwriter_delay*bgwriter_lru_maxpages*8K=最大数据量
上述参数对于数据文件所在磁盘的带宽也很有参考意义。
参数值依据系统状态而设置,通过监控系统的运行状况,进行分析总结。为参数配置合适的值。参考数据字典pg_stat_bgwriter.
View "pg_catalog.pg_stat_bgwriter"
Column | Type | Modifiers
--------------------+--------+-----------
checkpoints_timed | bigint |
checkpoints_req | bigint |
buffers_checkpoint | bigint |
buffers_clean | bigint |
maxwritten_clean | bigint |
buffers_backend | bigint |
buffers_alloc | bigint |
View definition:
SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, pg_stat_get_buf_alloc() AS buffers_alloc;
注:
postgresql中脏数据的写入不仅仅是由backgroud writer参数决定的,checkpoint也对脏数据的写入进行了控制。
backgroud writer进程的间隔是以毫秒计算,而checkpoint的间隔时间相对要很长。所以bgwriter更像是在checkpoint的周期内去完成脏数据的写入。所以bgwriter进程如果能够实现周期均匀数据量合适的写入数据,在减少IO的次数的同时还能够提升命中率,对checkpoint也能够减轻压力,不至于发生集中的写入操作,而造成IO使用的高值,也可以说进一步降低了对系统资源的考验。