`
文章列表
这一节 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() 创建的共享内存索引——可扩展 ...
Global site tag (gtag.js) - Google Analytics