[翻译]PostgreSQL 9.0 内存 & 进程

原文
作者: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_DELAYBGWRITER_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自动清理启动器进程:

自动清理进程是一个可选进程,默认是开启的。

为了自动执行VACUUMANALYZE命令,自动清理启动器进程是由许多被称为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