- 浏览: 231112 次
- 性别:
- 来自: 北京
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
文章列表
这一节
pg
在
postmaster
启动时估算数据库的要打开的文件数,设置VFD数。
Pg
用“虚拟”文件描述符(
VFDs
)缓存来处理打开的文件。因各种原因服务器打开很多文件描述符,包括基表、临时文件(例如排序和
hash spool files
)和像那样随机对
C
例程库的调用;超过系统对单进程能打开的文件数的限制是很容易的。操作系统打开一个文件占用一个文件描述符(
FD
)。(在现代
OS
上这个值大概是
256
,但是在其他
OS
上可能低至
32
,
WinServer2003
里是
512
) ...
这一节
pg
初始化堆扫描同步支持用到的相关结构。
堆扫描同步是当多个进程在同一个表上做顺序扫描(
sequential scan
),
pg
尝试保持他们同步以减少整体
I/O
需求。这个目标是读每一个页到共享内存仅一次,且使所有参与扫描这个页的进程在这个页被替换出共享内存前处理这个页。
活跃
backend
进程列表,这被用来跟踪
pg
有多少个孩子和在需要的时候给他们发送信号。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
...
这一节
pg
初始化
BTree
用到的相关结构,通过
BTreeShmemInit
例程实现
。主要是初始化了一个
BTVacInfo
结构,并使用了面向过程C
语言编程的一个技巧,把这个结构中的固定长度数组
BTOneVacInfo vacuums[1]
扩充成
Max ...
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化
walsender
和
walreceiver
相关结构
方法调用流程图
2
初始化
xlog
相关结构
话说
main()->
…
->PostmasterMain()->
…
->reset_shared() ->
CreateSharedMemoryAndSemaphores()>
…
->WalSndShmemInit()
,调用
ShmemInitStruct()
,
...
这一节
pg
初始化
AutoVacuum
系统和进程用到的相关结构,通过
AutoVacuumShmemInit
例程实现
。主要是初始化了一个
AutoVacuumShmemStruct
结构和autovacuum_max_workers
个(默认3
个,可以根据GUC
参数设置)
结构组成的链表,以供
AutoVacuum
相关进程使用。
AutoVacuum
系统架构于两种不同的进程:
autovacuum
发起者进程(
launcher
)和
autovacuum
工作者进程(
worker
)。发起者进程是一直运行的进 ...
这一节
pg
初始化后台写进程(
BgWriter
)用到的相关结构,通过
BgWriterShmemInit
例程实现
。主要是初始化了一个
BgWriterShmemStruct
结构,并使用了面向过程C
语言编程的一个技巧,把这个结构中的固定长度数组
BgWriterRequest requests[1]
扩充成
NBuffers
个(根据默认值或
GUC
参数的设置计算得到)的
BgWriterRequest
结构的数组,以供后台写进程使用。
后台写进程
bgwriter
是
pg8.0
新增加的。尝试维护一 ...
这一节
pg
初始化非
postmaster
进程间发送信号用到的相关结构,在共享内存里通过信号交互,通过
ProcSignalShmemInit
例程实现
。主要是初始化了
MaxBackends +
NUM_AUXPROCTYPES
=164
个
(默认是100+64
个,可以设置)
ProcSignalSlot
结构的数组,以供非
postmaster
进程之间互动互操作。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化
ProcSingal
方法调用流程 ...
这一节
pg
初始化
postmaster
子进程给
postmaster
进程发送信号用到的相关结构,在共享内存里通过信号交互,通过
PMSignalShmemInit
例程实现
。主要是初始化了一个
PMSignalData
结构,并使用了面向过程编程的一个技巧,把这个结构中的固定长度数组
sig_automatic_t PMChildFlags[1]
扩充成
2XMaxBackends=200
个的信号的数组,以供
postmaster
进程和
postmaster
子进程之间互动互操作。
...
这一节
pg
初始化管理共享失效信息状态缓存所用到的相关结构,通过
CreateSharedInvalidationState
例程实现。共享失效消息主要涉及系统目录、逻辑表、物理表文件、数据库等。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化共享失效状态缓存方法调用流程图
2
初始化
xlog
相关结构
话说
main()->
…
->PostmasterMain()->
...
这一节
pg
初始化共享后台进程状态数组
SharedBackendStatus
和多个字符串缓存
,通过
CreateSharedBackendStatus
例程实现。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化
SharedBackendStatus
方法调用流程图
2
初始化
xlog
相关结构
话说
main()->
…
->PostmasterMain( ...
这一节
pg
初始化进程表,通过
CreateSharedProcArray
例程实现,该例程中初始化的相关结构主要是为了支持维护一个所有活跃backend
进程的PGPROC
结构的未排序数组。
尽管多处用到此数组,但主要是作为确定当前运行进程的事务集合的一种方式。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化
SharedProcArray
方法调用流程图
2
初始化
xlog
相关结构
...
这一节
pg
初始化进程表,通过
InitProcGlobal
例程实现,在postmaster
或standalone
进程启动时初始化全局进程表。pg
还创建了支持被请求的backend
进程时每个backend
进程需要的信号。以前pg
仅在backend
进程实际启动时分配信号,但是这样不好,因为这样使postgres
在加载时失败,很多unix
系统被配置/
错误配置成在信号数目上比较小,在试着开启了一个进程时信号用完了,这是常见的故障。因此,现在pg
在初始化时就立即搞出足够的信号数以支持预期的最大backend
进程数。如果系统管理员把MaxBack ...
这一节
pg
初始化
predicate
锁,支持可序列化事务隔离。通过
InitPredicateLocks
例程实现,主要是干了下面这么几件事:
A
创建了哈希表"PREDICATELOCKTARGET hash"
。
B
在上面的哈希表里增加了
ScratchTargetTag
结构的索引
C
创建了哈希表"PREDICATELOCK hash"
。
D
初始化了
"PredXactList"
相关结构
E
创建 ...
这一节
pg
初始化锁管理器,通过
InitLocks
例程实现,主要是创建了三个哈希表
。
第一个哈希表"LOCK
hash"
用于管理锁,第二个哈希表"PROCLOCK
hash"
用于管理进程锁,第三个"LOCALLOCK
hash"
用于管理本地锁信息。其中第一个和第二个哈希表都是共享哈希表,第三个是非关系哈希表。初始化第三个哈希表"LOCALLOCK hash"
时在共享内存哈希表索引"
ShmemIndex
"
里没有创建 ...
pg
的内存除了
AllocSet/MemoryContext
外,另一个主要部分就是共享内存(shared memory
)。这一节讨论共享内存(简写shmem
)的分配。
pg
在
reset_shared
()
这个函数里,
计算数据缓冲、xlog
、clog
、共享进程、子事务、并发控制、轻量级锁、backend
进程等需要的共享内存,
调用
shmget()
函数在堆上分配,
用
PGShmemHeader *
类型的
ShmemSegHdr
变量的index
成员指向调用hash_create()
创建的共享内存索引——可扩展
...