设为首页 收藏本站
查看: 1123|回复: 0

[经验分享] PostgreSQL内核分析(1): 后台进程

[复制链接]

尚未签到

发表于 2016-11-20 09:47:05 | 显示全部楼层 |阅读模式
  环境搭建:
  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的进程属性即可以看出对应的是哪个后台进程。 如下图所示:
DSC0000.jpg
  找到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>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302764-1-1.html 上篇帖子: postgreSql的字符串操作函数 下篇帖子: PostgreSQL 8.3在Windows XP FAT32下安装步骤
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表