天天看點

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的程序屬性即可以看出對應的是哪個背景程序。 如下圖所示:

PostgreSQL核心分析(1): 背景程式

找到src/backend/postmaster/pgarch.c,選擇适當的斷點,即可進行跟蹤了。

<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; 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>