PostgreSQL内核分析(1): 后台进程

环境搭建:

1. VS2005(完全安装, 要用VC8), (VS2008用来编译也是可以的,但是最后的工程文件还是VS2005的)
2. Active Perl5.8后续版本,确保perl\bin在PATH环境变量里头
3. Bison 和 Flex
Bison 1.875 或者 2.2或以后版本才有效.
Flex必须是2.5.31或后续版本, 请参照一下:http://www.postgresql.org/ftp/misc/winflex/
如果是从release的source code里build, 这两个工具,可以不要。如果是从git里头取的code,则需要这两个工具。
4. source code: http://www.postgresql.org/ftp/source/v9.1.3/
5. Diff, gettext等,连同Bison,从GnuWin32里头下载。http://gnuwin32.sourceforge.net/packages.html


至于:6. MIT Kerberos (Kerberos authentication support)
7. libxml2 and libxslt
8. openssl
9. ossp-uuid
10. zlib
11. Python

这些都是可选的,不是必需的。

如果只是build这些选项,甚至包括一些开发包,这里有一个编译打包好的。下载地址:http://code.google.com/p/hisql/downloads/list。这个包是免安装版。
里边已经放置了odbc, jdbc, ado.net包以及pgAdmin客户端。

1) 解压源码至E:\PROJECTS\postgresql-9.1.3

2 ) 假设VS2005安装到:D:\tools\vs8, 进入cmd窗口:运行D:\tools\vs8\vc\bin\vcvars32.bat,以得到所有有用的VC编译器环境变量。
进入目录:E:\PROJECTS\postgresql-9.1.3\src\tools\msvc

3) 运行build.bat DEBUG >> \build.log
4) 检查没什么错误(0 errors)之后,运行install.bat E:\PROJECTS\pgsql_debug,将build出来之后的东西安装到此位置。

5) 在pgsql_debug目录下边设置简单的几个环境变量pg_env.bat, 并运行之:

@ECHO OFF
REM The script sets environment variables helpful for PostgreSQL
SET PGHOME=E:\PROJECTS\pgsql_debug
SET PATH=%PGHOME%\bin;%PATH%
SET PGDATA=%PGHOME%\data
SET PGLOCALEDIR=%PGHOME%\share\locale

6) 运行下边命令建立数据目录:

initdb --no-locale -E UTF-8 -DE:\PROJECTS\pgsql_debug\data

7) 启动server进程并创建db,
pg_ctl -l pgsql.log start

createdb iihero

8) 连接db:
psql iihero

iihero=# create table foo2(id bigint);
CREATE TABLE
iihero=# select pg_backend_pid();
10804
9)
// 此时知道该连接对应的后台进程ID是10804,用VS2005打开plsql.sln,attach到此进程,
// 找到postmaster工程,src/backend/tcop/postgres.c, 在exec_simple_query()处设断点,就可以跟踪普通的SQL操作在后台的执行情况,此处不缀述。
10) 插入大批量的数据作测试
iihero=# insert into foo2 select * from generate_series(1, 1000000);
INSERT 0 1000000

11)
后台进程postgres.exe,一启动就有6个。除了用psql连接导致的新postgres进程以外,这个好判断,用select pg_backend_pid()就可以得到进程号,准确进行attach。

那么如果想跟踪其它几个后台进程呢?
总共就这些后台进程:(SysLogger, BgWriter, WalWriter, AutoVacuum, PgArch, PgStat),名字都叫postgres。
我们注意到src/backend/postmaster/*.c里头,刚好有对应这6个进程的实现部分。
使用VS debugger的suspend,再加上对这几个文件进行试设断点,也是可以的。如果仔细比对源码,看看postmaster.c中的SubPostmasterMain():

	if (strcmp(argv[1], "--forkbackend") == 0 ||
		strcmp(argv[1], "--forkavlauncher") == 0 ||
		strcmp(argv[1], "--forkavworker") == 0 ||
		strcmp(argv[1], "--forkboot") == 0)
		PGSharedMemoryReAttach();


	/* autovacuum needs this set before calling InitProcess */
	if (strcmp(argv[1], "--forkavlauncher") == 0)
		AutovacuumLauncherIAm();
	if (strcmp(argv[1], "--forkavworker") == 0)
		AutovacuumWorkerIAm();
        if (strcmp(argv[1], "--forklog") == 0)
	if (strcmp(argv[1], "--forkcol") == 0)
	{
		/* Close the postmaster's sockets */
		ClosePostmasterPorts(false);


		/* Do not want to attach to shared memory */


		PgstatCollectorMain(argc, argv);
		proc_exit(0);
	}

不难发现,
SysLogger --> --forklog
AutoVacuum --> --forkavworker, --forkavlauncher
WalWriter, BgWriter --> --forkboot
PgStat --> --forkcol
PgArch --> --forkarch

使用ProcessExplorer工具,从postgres.exe的进程属性即可以看出对应的是哪个后台进程。 如下图所示:

找到src/backend/postmaster/pgarch.c,选择适当的断点,即可进行跟踪了。

<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值