`

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>
分享到:
评论

相关推荐

    PostgreSQL数据库内核分析

    ### PostgreSQL数据库内核分析知识点概览 #### 一、PostgreSQL简介 - **定义**: PostgreSQL是一种功能强大的开源对象关系型数据库系统,支持多种编程语言(如C、Java、Python等)进行应用程序开发,并且提供了丰富...

    postgresql内核源码调用思维导图

    这包括初始化进程、后台进程的启动以及内存结构的设置。"postgresSQL程序结构图-v8-wangteacher-v1.0.xmind"这份思维导图可能详细描绘了这些步骤,其中的“xmind”标签表明这是一个可视化表示,有助于我们直观地理解...

    CentOS中运行PostgreSQL需要修改的内核参数及配置脚本分享

    1. `vm.dirty_background_ratio`:这个参数定义了当系统内存中的脏页达到总内存的百分比时,后台进程开始将缓冲区的数据刷回磁盘。默认值为10%,在大内存机器(比如超过64GB)上,这可能导致大量磁盘I/O,影响系统...

    postgres内核源码分析实验环境配置导读.pptx

    通过以上步骤,我们可以构建一个完整的PostgreSQL内核源码分析实验环境,无论是使用GDB进行底层调试,还是利用Source Insight或Eclipse进行代码浏览和分析,都能为深入理解PostgreSQL的工作机制提供有力支持。

    Transaction Processing in PostgreSQL

    - **Postmaster 进程**:负责启动和管理其他后台进程。 - **服务器进程(Backend)**:每个连接都有一个独立的后端进程处理 SQL 查询。 - **共享内存**:用于存储临时数据和元数据,确保不同后端进程间的数据一致性...

    作者:Clojure后台作业队列在PostgreSQL 9.5之上

    旁玩Clojure后台作业队列位于PostgreSQL 9.5之上。 它允许创建后台作业,将这些作业放在多个队列中,并在以后进行处理。 后台作业可以是任何名为Clojure的函数。 该项目的主要灵感来自 , 和 。产品特点耐用性:队列...

    Python-用于收集内核跟踪数据并将其可视化的守护程序和webapp

    在这个项目中,可能使用了这些库来呈现内核跟踪数据,例如通过时间线图显示系统调用频率,或者通过散点图表示不同进程间的通信。 守护程序部分可能使用了Python的`daemonize`库或自定义实现来确保服务在后台持续...

    galy pg全球开发者大会

    - **动态后台工作进程**:动态后台工作进程允许更灵活地管理后台任务,增强了系统的灵活性和效率。 - **动态共享内存**:通过改进内存管理机制,提高多核处理器环境下的性能。 - **内核级逻辑复制**:新的逻辑复制...

    联通营业厅设备后台管理系统

    《联通营业厅设备后台管理系统详解》 在信息技术日益发达的今天,运营商的营业厅设备管理已经成为了一项重要的工作。联通营业厅设备后台管理系统是专为Linux操作系统设计的,旨在提高设备管理效率,优化业务流程,...

    PostgreSQL 并行管理实践手册

    max_worker_processes是workers的顶级限制后台进程的总数(此参数不允许修改,系统会自动根据实际的cpu个数(核数)来设置)。 八、如何确定workers的数量 查询规划器可以根据表或索引大小增加或减少工作线程的数量...

    bgworker-main-源码.rar

    - bgworker是PostgreSQL内核的一部分,它们与主进程、前端进程、WAL writer、Checkpointer等其他后台进程共同构建了复杂的数据库服务环境。 8. **源码分析** - 分析`bgworker-main-源码.zip`可能涉及以下关键文件...

    linux C++ 服务器/后台开发 秋招整理资料

    1. **Linux操作系统**:理解Linux内核、文件系统、进程管理、内存管理、网络模型等基本概念。 2. **Shell命令**:掌握常用的shell命令,如ls、cd、cp、mv、grep、find、sed、awk等。 3. **Linux权限与文件系统**:...

    详解Linux系统中的守护进程.docx

    在Linux系统中,守护进程(daemon)是一种特殊类型的进程,它们在系统启动时启动,并持续运行直到系统关闭,通常没有与任何控制终端关联,因此在后台默默执行任务。守护进程在Unix和Linux环境中扮演着重要角色,执行...

    unix一些命令.pdf

    1. 系统命令:包括系统信息查看、系统设置、进程管理、文件系统管理、网络管理等命令。 * uname:显示当前系统的信息,包括操作系统名称、主机名、内核版本等。 * uptime:显示系统的运行时间和平均负载。 * top/...

    patch pg 支持win7 -- win10

    7. **服务管理**:PostgreSQL作为后台服务运行,补丁可能包含服务配置更改,比如启动类型、依赖项、权限设置等。 8. **故障排查**:在应用补丁后,需要进行测试以确认PostgreSQL的功能和性能,如果遇到问题,可能...

    基于PHP的蓝色商务公司php企业网站源码(XDcms内核).zip

    它支持多种数据库,如MySQL、PostgreSQL等,能够处理表单数据、生成动态页面、与用户交互等。 2. **PHP面向对象编程**:在PHP 5及以上版本,PHP引入了完整的面向对象编程特性,包括类、对象、继承、封装和多态,这...

    Linux从入门到精通

    **知识点1:Linux系统概述** - **定义**:Linux是一种自由开源的操作系统内核,它最初由Linus Torvalds于1991年发布。 - **特点**: - 开源免费:任何人都可以自由获取其源代码并进行修改和分发。 - 高度定制化:...

    linux常用命令手册.pdf

    - `# nohup command &`:使进程在后台运行且不受终端关闭的影响。 - `# disown %job`:使作业脱离终端控制。 #### 三、文件系统操作 - **文件权限管理** - `# chmod mode file`:更改文件权限。 - `# chown ...

    整站程序自由的Linux(LinuxOpe.com)全站程序-linuxope.com-php

    1. **Linux操作系统**:Linux是一种自由和开放源代码的操作系统,它的内核由林纳斯·托瓦兹创建。Linux被广泛应用于服务器、超级计算机、移动设备等领域,因其稳定性和安全性受到开发者和企业的青睐。 2. **PHP...

Global site tag (gtag.js) - Google Analytics