原文
作者:Raghav
在PostgreSQL构架基础上进一步了解,在这里,通过信息链接我将会讨论关于实用进程和内存。许多提交者已经好好地记录了关于进程和内存,在这里有提供链接。在我这里有适当关于PostgreSQL实用进程的描述。
每个PostgreSQL实例启动,会有一组实用进程(包括强制性和可选性进程)和内存。两个强制性进程(bgwriter
后台写进程和walwriter
预写式日志写进程)。你可以通过命令ps -ef | grep postgres
检测一下,结果如图10.1.
图10.1
进程和内存概要
图10.2
关于图10.2,它表明了进程附加到PostgreSQL共享内存。
BGWriter/Writer Process
后台写进程或者叫写进程:
后台写进程或者叫写进程是一种强制性进程:
所有PostgreSQL服务器进程从磁盘读取数据然后将它们移到共享缓冲池(Shared Buffer Pool
)里。 共享缓冲池使用ARC
算法或者LRU
(最近最少使用)机制来淘汰页数据。BGWRITER
后台写进程很多时候都是在休眠,但每次唤醒,它通过搜索共享缓冲池(Shared Buffer Pool
)来寻找被修改的页。每次搜索完之后,BGWRITER
后台写进程就会选择那些被修改的页,将它们写到磁盘,然后将它们从共享缓冲池里淘汰出来。后台写进程通过三个参数BGWRITER_DELAY
、BGWRITER_LRU_PERCENT
以及BGWRITER_LRU_MAXPAGES
来控制。
http://www.enterprisedb.com/docs/en/9.0/pg/kernel-resources.html
http://www.enterprisedb.com/docs/en/8.4/pg/runtime-config-resource.html
WAL Writer Process
预写式日志写进程:
预写式日志写进程是一个强制性进程。
预写式日志写进程在适当间隔时会写入并进行文件同步。为了保证事务安全,预写式日志缓冲区在事务日志里持有数据库的更改操作。预写式日志缓冲区在每次事务提交时写到磁盘,预写式日志写进程负责写到磁盘。WAL_WRITER_DELAY
参数是用于调用预写式日志写进程的,然而,还有其他参数同样会使预写式日志写进程比较繁忙。下面有一些链接。
http://www.enterprisedb.com/docs/en/8.4/pg/wal-configuration.html
Stats Collector Process
状态收集进程:
状态收集进程是可选进程,默认是开启的。
状态收集进程会收集一些关于服务器运作的信息。它会计算访问表和索引二者磁盘块的数量和个别的行项数(我注:一个block有可能多个row item,可以通过 select ctid from tbname来查看,第一个数字就是block数,第二个就是row item数)。它同样会跟踪每一个表的总行数,每一个表关于VACUUM
(清理)和ANALYZE
(分析)动作的信息。收集这些统计数据会对查询执行有额外的开销,自己决定收不收集这些信息。以下的链接有更多关于状态收集进程以及相关参数的说明。
http://www.enterprisedb.com/docs/en/9.0/pg/monitoring-stats.html
Autovacuum Launcher Process
自动清理启动器进程:
自动清理进程是一个可选进程,默认是开启的。
为了自动执行VACUUM
和ANALYZE
命令,自动清理启动器进程是由许多被称为autovacuum workers(自动清理工作者)
组成的后台进程。自动清理启动器进程负责启动autovacuum workers(自动清理工作者)
进程来处理所有数据库。启动器会按交叉时间地分发工作,在每个时间间隔里会试图在每一个数据库里启动一个工作者(我注:指autovacuum workers
),通过参数autovacuum_naptime
来设置间隔时间。每个数据库都会启动一个工作者,通过参数autovacuum_max_workers
来设置最大数。每一个工作者进程都会在它所在的数据库里检查每一张表,然后在有需要的时候执行VACUUM
或者ANALYZE
命令。以下的链接有更多关于AUTOVACUUM
自动清理启动器进程的相关参数的说明。
http://www.enterprisedb.com/docs/en/8.4/pg/runtime-config-autovacuum.html
Syslogger Process / Logger Process
系统日志进程或者叫日志进程 :
图10.3
日志是一个可选进程,默认是关闭的。
依据图10.3, 可以清楚地理解所有 实用进程+用户后台进程 + Postmaster守护进程都附加到系统日志进程来记录这它们的活动信息。每一个进程信息都会被记录在PGDATA/pg_log
目录下的.log
文件里。
注意:如果数据目录是通过INITDB
命令创建的,pg_log
目录不会在数据目录里自动创建。需要显式地创建该目录。
调试更多的进程信息会导致服务器的一些额外开销。总是建议日志是最低级别的,如果有要求的话再提高调试级别。以下的链接有更多关于日志参数的说明。
http://www.enterprisedb.com/docs/en/8.4/pg/runtime-config-logging.html
Archiver Process
归档进程:
图10.4
归档进程是可选进程,默认是关闭的。
上面图10.4 是从我观察PostgreSQL的归档进程而制作的。设置数据库为归档模式,意味着捕捉预写式日志(WAL)数据填充到每个段文件。在段文件重新回收利用之前,会将数据保存到某些地方。
图中每个数字标签的解释。
1.在数据库的归档模式,一旦预写式日志(WAL)数据填充满了预写式日志(WAL)段文件,填充满的段文件会被预写式日志写进程(WAL Writer)在目录$PGDATA/pg_xlog/archive_status
下创建一个后缀为”.ready”的文件。文件名将会是“段文件名.ready”。
2.归档进程就会触发去查找那些被预写式日志写进程创建的“.ready”状态的文件。归档进程选择那些后缀是”.ready”的”段_文件号”文件,然后从$PGDATA/pg_xlog
复制这些文件到archive_command
参数(在postgresql.conf)指定的目的地里。
3.成功地从源目录复制到目的目录,归档进程会重命名”段-文件名.ready”为段-文件名.done
。这就完成了归档的过程。
不用说,如果在$PGDATA/pg_xlog/archive_status
目录里有任何名为”段-文件名.ready”的文件都是正等待着被复制到归档目的地里(我注:通过参数archive_command
来指定)。
更多关于参数和归档的信息,请看以下链接。
http://www.enterprisedb.com/docs/en/9.0/pg/continuous-archiving.html
请把你的意见/建议提交在这篇文章中,将不胜感激。
献上我真诚的问候
Raghav