postgresql 杀进程进程无故挂掉

守护进程也称为精灵进程,它在系统自举时启动,在系统关闭时才终止。因为它没有控制终端,所以说他们是在后台运行的。笔记记录了PostgreSQL的守护进程PostMaster进程的主要职责与它的基本流程。简单的了解了PostmasterMain函数以及PostgreSQL的内存初始化形式。
在完成Database Cluster的初始化之后,用户可以启动一个数据库实例。PostgreSQL在多用户模式下,实例是由Postmaster守护进程来管理。
一、Postmaster的主要职责
数据库的启停;
监听客户端连接;
为每个客户端连接fork单独的Postgres服务进程;
当服务进程出错时进行修复;
管理数据文件;
管理与数据库运行相关的辅助进程;
Postmaster的主要源文件:src/backend/postmaster/postmaster.c
Postmaster进程的入口函数为PostmasterMain,在PostgreSQL启动时,由main函数中调用。
二、PostmasterMain流程概述
1.为Globals.c中定义的全局变量赋值
如Postmaster的进程标识号(pid)、开始运行时间等;
2.组织内存上下文;
PostgreSQL自V7.0后实现了自己的内存管理机制MemoryContext,系统中的内存分配操作在各种语义(类型)的MemoryContext中进行,它的内部机制类似于操作系统的内存分配机制。MemoryContext为每个进程分配了进程执行环境,每个进程环境之间不相互影响,每个子进程都拥有多个私有的MemoryContext,每个子进程的MemoryContext组成了一个树形结构,根节点为TopMemoryContext。
MemoryContext负责对这些进程环境进行切换,同时,每个进程可以在其进程环境中调用操作系统库函数进行内存分配操作,如malloc,realloc,free。,但因为PostgreSQL对内存的分配,释放等操作都是在MemoryContext中进行,因此不再使用C语言的标准库函数malloc,realloc,free来操作,而是重新实现了palloc,replloc和pfree分别对应C语言标准库的三个内存管理函数。
这三个函数的定义在mcxt.c中
void * palloc(Size size);
void * repalloc(void *pointer, Size size);
void pfree(void *pointer);
具体的实现可以通过查看源码来了解。
源码中定义MemoryContext的类型是MemoryContextData,它的数据结构定义如下:
/* 标识MemoryContext的具体类型 */
MemoryContextMethods *methods;
/* 内存处理函数指针 */
MemoryContext parent;
/* 父节点指针,若是TopMemoryContext则为NULL */
MemoryContext firstchild;
/* head of linked list of children */
MemoryContext nextchild;
/* next child of same parent */
/* 节点名称 (just for debugging) */
/* T = no space alloced since last reset */
} MemoryContextData;
各种MemoryContext的定义在mcxt.c中
MemoryContext CurrentMemoryContext = NULL;
MemoryContext TopMemoryContext = NULL;
MemoryContext ErrorContext = NULL;
MemoryContext PostmasterContext = NULL;
MemoryContext CacheMemoryContext = NULL;
MemoryContext MessageContext = NULL;
MemoryContext TopTransactionContext = NULL;
MemoryContext CurTransactionContext = NULL;
MemoryContext PortalContext = NULL;
这些MemoryContext的默认值都是NULL,在使用他们之前首先需要对其进行初始化。
CurrentMemoryContext
CurrentMemoryContext是分配给当前进程的缺省的MemoryContext,在任何时候都有一个“当前”的MemoryContext记录在全局变量CurrentMemoryContext,在需要转换MemoryContext时使用MemoryContextSwitchTo方法将CurrentMemoryContext指向其他类型的MemoryContext;
PostmasterContext
PostmasterContext是Postmaster进程正常工作时的内存环境,由它通过fork函数产生的子进程创建成功后将会回头来删除它,子进程过河拆桥,而PostmasterContext则是照亮别人,燃烧自己;
TopMemoryContext
TopMemoryContext是所有MemoryContext的根,由它分配的内存直到系统退出才会释放;ErrorContext是用于错误处理的内存环境,在PostgreSQL系统启动时它一直存在。
回到Postmaster进程PostmasterMain的源码:在Postmaster进程启动的时候,MemoryContext将首先实例化根TopMemoryContext,并将“当前”的内存上下文指向PostmasterContext。
PostmasterContext = AllocSetContextCreate(TopMemoryContext,
&Postmaster&,
ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE,
ALLOCSET_DEFAULT_MAXSIZE);
MemoryContextSwitchTo(PostmasterContext);
3.配置参数
初始化内存上下文之后,配置Postmaster运行所需的各种参数。PostmasterMain源码中InitializeGUCOptions方法中的GUC是Grand Unified Configuration。
GUC以及如何自定义GUC选项的笔记:《在postgresql.conf中增加自定义配置项》
4.验证数据目录的合法性,并且将工作空间切换到数据目录;
5.初始化SSL库(如果启用SSL)
6.预装载SharedLibraries;
7.建立监听
8.注册信号处理函数
9.实例化日志子进程(如果Logging_collector配置为on,SysLogger_Start())
10.实例化状态收集子进程(pgstat_init())
11.实例化AUTOVOCUUM子进程(autovac_init())
12.加载pg_hba.conf文件load_hba()
13.删除临时文件(RemovePgTempFiles())
14.启动数据库
* We're ready to rock and roll...
这里不知道是哪位大神,和我一样喜爱摇滚吗?
设置pmState的状态为PM_STARTUP
15.启动bgwriter子进程(maybe_start_bgworker())
16.无限循环等待客户端的连接
src/backend/main/main.c
不使用–single-step和–single-line参数时,启动一个新的postgres进程。
if (argc & 1 && strcmp(argv[1], &--single&) == 0)
PostgresMain(argc, argv, NULL, get_current_username(progname));
在PostgresMain中,启动一个无限循环等待客户端的连接。
src/backend/tcop/postgres.c(line:3898)
// Wait for a connection request to arrive.
// New connection pending on any of our sockets? if so,fork a child process to deal with it
// 检查log collector,background writer process,walwriter process,autovacuum launcher这些进程是否运行,没有运行会重新启动它们。并且在这里开始checkpoint
if (pmState == PM_RUN || pmState == PM_RECOVERY ||
pmState == PM_HOT_STANDBY)
if (CheckpointerPID == 0)
CheckpointerPID = StartCheckpointer();
if (BgWriterPID == 0)
BgWriterPID = StartBackgroundWriter();
// waiting client message.
ReadyForQuery......
StartCheckpointer–>StartChildProcess–>AuxiliaryProcessMain–>CheckpointerMain
17.如果Serverloop没有返回状态码则退出PostmasterMain
66 queries in 0.439 seconds[笔记]PostgreSQL发生crash的几种原因
最近调查PostgreSQLcrash,整理了下一般常见的几种原因。1. PostgreSQL版本更新PostgreSQL的一般维护期为5年。5年内,会不断对发现的bug进行修复。因此,我们需要及时更新PostgreSQL。避免触发bug发生crash。2. 磁盘空间满磁盘空间满是导致PostgreSQL crash的一个常见原因。因此对磁盘监控,是非常必要的事情。3. 删除关键日志文件比如删除了pg_clog/pg_xlog/pg_log4. 内存OOMshared_buffers设置过大。work_mem设置不足。connections过多导致内存不足。5. 硬件问题使用未经验证,不兼容的硬件。磁盘故障。系统长时间运行。6. 太多的连接。7. zombie lockstransaction未释放。
没有更多推荐了,51CTO旗下网站
PostgreSQL进程结构
《PostgreSQL数据库内核分析》第2章PostgreSQL的体系结构,本章从宏观上对PostgreSQL的控制和处理流程进行了简要介绍,说明了各个模块之间是如何协同工作,以使得整个数据库系统能够稳定、正确地处理用户的各种操作和请求的。至于每个模块是如何各司其职,其内部具体是如何运作的,将会在后续的章节进行专门的介绍。本节为大家介绍PostgreSQL进程结构。
作者:彭智勇/彭煜玮来源:机械工业出版社| 23:10
2.3& PostgreSQL进程结构
PostgreSQL系统的主要功能都集中于Postgres程序,其入口是Main模块中的main函数,在初始化数据集簇、启动数据库服务器时,都将从这里开始执行。Main模块主要的工作是确定当前的操作系统平台,并据此做一些平台相关的环境变量设置和初始化,然后通过对命令行参数的判断,将控制转到相应的模块中去。图2-4是main函数的调用流程。
【责任编辑: TEL:(010)】
图2-4& PostgreSQL系统主函数main的流程
PostgreSQL使用一种专用服务器进程体系结构,其中,最主要的两个进程就是守护进程Postmaster和服务进程Postgres。从本质上来说,Postmaster和Postgres都是通过载入Postgres程序而形成的进程,只是在运行时所处的分支不同而已。守护进程Postmaster负责整个系统的启动和关闭。它监听并接受客户端的连接请求,为其分配服务进程Postgres。服务进程Postgres接受并执行客户端发送的命令。它在底层模块(如存储、事务管理、索引等)之上调用各个主要的功能模块(如编译器、优化器、执行器等),完成客户端的各种数据库操作,并返回执行结果。
Postmaster和Postgres程序
在Unix或Linux系列的系统下,Postmaster仅仅是Postgres的一个符号链接;而在Windows系统下,Postmaster是Postgres的一个拷贝。所以PostgreSQL系统几乎所有的核心功能都是由Postgres程序完成的。
PostgreSQL守护进程Postmaster(单用户模式下的Postgres进程)除为用户连接请求分配后台Postgres服务进程外,还将启动相关的后台辅助进程。守护进程Postmaster在完成基本运行环境初始化、创建接受用户请求的监听端口后,顺序启动如下系统辅助进程:SysLogger(系统日志进程)、PgStat(统计数据收集进程)、AutoVacuum(系统自动清理进程)。在守护进程Postmaster进入到循环监听中时启动如下进程:BgWriter(后台写进程)、WalWriter(预写式日志写进程)、PgArch(预写式日志归档进程)。这些辅助进程的用途在2.5节有详细介绍。
PostgreSQL采用C/S模式,系统为每个客户端分配一个服务进程。前端应用欲访问某一数据库时,就调用接口库(比如ODBC、libpq)把用户的请求通过网络发给守护进程Postmaster。Postmaster将启动一个新的服务进程Postgres为用户服务,此后前端进程和服务进程不再通过Postmaster而是直接进行通信。也就是说,Postmaster总是监听用户连接请求并为用户分配服务进程Postgres,而Postgres则负责为客户端执行各种命令。&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:96583人学习过
讲师:41564人学习过
讲师:783643人学习过
精选博文论坛热帖下载排行
本书深入浅出地说明了如何利用.NET、Flash及XML来辅助Flash富媒体应用程序的开发。
本书首先介绍了Flash影片应用程序与.NET应用程序结合的...
订阅51CTO邮刊一、查看哪些用户在链接数据库
select * from pg_stat_
& 这里的pg_stat_activity其实是一个视图,它的定义可以在postgres这个数据库里面的视图部分找到。
二、杀死进程
& 现在我们找出所有连接到数据库的进程了,那么如何去杀死那些IDEL的进程从而释放出连接呢?如果pg的版本是 8.4及以上的,可以很简单地用下面的语句来杀死所有IDEL进程 :
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE current_query='&IDLE&'
& pg_terminate_backend是pg的内部方法,另外还有一个叫pg_cancel_backend,这个方法在8.4以前的版本中就一直存在。这两个方法的区别在于:
pg_cancel_backend & &只是取消当前某一个进程的查询操作,但不能释放数据库连接
pg_terminate_backend & &可以在pg的后台杀死这个进程,从而释放出宝贵的连接资源
阅读(...) 评论()PostgreSQL中怎么关闭死锁的进程_百度知道
PostgreSQL中怎么关闭死锁的进程
我有更好的答案
今天在进行测试的时候,发现一个数据表无法进行更新。一旦 运行更新sql,就进行等待。无法执行下去。感觉数据库进行了死锁。由于使用的PostgreSQL数据库,没有资料。只好进行谷歌。最终在一个英文论坛中发现了解决方法。如下:1.检索出死锁进程的ID。SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID ';检索出来的字段中,【wating 】字段,数据为t的那条,就是死锁的进程。找到对应的【procpid 】列的值。2.将进程杀掉。
采纳率:67%
为您推荐:
其他类似问题
postgresql的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 postgresql 删除进程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信