首页 > 数据库 >postgresql 后台进程及内存结构

postgresql 后台进程及内存结构

时间:2023-11-07 20:01:25浏览次数:34  
标签:wal postgresql 数据库 checkpoint 进程 内存 缓冲区 后台 日志

1.postgresql 后台进程

postgresql 后台进程及内存结构_数据库

1.1 主进程postmaster:/data/postgresql/postgresdir/bin/postgres

主进程postmaster 是整个数据库实例的总控进程,负责启动和关闭数据库实例。

1.2 logger 系统日志进程

只有在参数logging_cllect 设置为“on”时,主进程才会启动logger 辅助进程。其通过postmaster进程、所有服务进程及其他辅助进程收集所有的stderr 输出,并将其输出写入日志文件。

1.3 checkpointer 检查点进程

checkpoint就是一个事务顺序的记录点,checkpoint主要是进行刷脏页,redo时会参考checkpoint进行日志回放。除了刷脏之外还会更新一些位点信息,清理一些不再需要的wal。用来保证数据的一致性和完整性。

什么时候数据库才会进行checkpoint?

a. 超级用户手动执行checkpoint命令

b. 参数checkpoint_timeout中指定的间隔(默认300秒)

c. 写入WAL的数据量已达到参数max_wal_size(默认值:1GB)

d. online backup开始的时候

e. 执行pg_start_backup函数时

f. 在实例关闭时(除了pg_ctl stop -m命令执行)

e. 在进行数据库配置时(例如CREATE DATABASE / DROP DATABASE语句)

当执行checkpoint时,数据库主要完成以下几个工作:

a. 识别shared buffers中所有的脏页

b. 将脏页写入相应的数据文件

c. 确保修改后的文件通过fsync()写入到磁盘

1.4 background writer 后台写进程

background writer 进程是把共享内存中的脏页写到磁盘上的进程。当向数据库中插入或更新数据时,并不会马上把数据持久化到数据文件中。主要是为了提高插入、更新、删除数据的性能。

1.5 walwriter 预写式日志写进程

walwriter 是写wal 日志的进程。在修改数据之前必须把这些修改操作记录到磁盘中,这样后面更新实际数据时就不需要实时地把数据持久化到文件中了。如果机器突然宕机或数据库异常退出,导致一部分内存中的脏数据没有及时地刷新到文件中,在数据库重启后,通过读取wal 日志把最后一部分的wal 日志重新执行一遍,就可以将数据库恢复到宕机时的状态。

1.6 autovacuum launcher 自动清理进程

对表进行delete 操作后,原有数据并不会立刻删除,而且在更新数据时,页并不会在原有数据上做更新,而是会新生成一行数据,原有数据只是会标记为删除状态,只有在没有并发的其他事务读到这些旧数据时,才会将其删除。

1.7 stats collector 统计数据收集进程

主要做数据的收集统计,收集的信息主要用于查询优化时的代价估算,这些信息包括在一个表和索引上进行了多少次插入、更新和删除操作,,磁盘块读写的次数以及行的读取次数。pg_statistic表。

1.8 logical replication launcher

用于逻辑复制,订阅者通过 logical replication launcher进程向发布者订阅表的更新并获取更新。

1.9 archiver 归档进程

wal 日志会循环使用,较早的wal 日志会被覆盖。归档进程会在覆盖前把wal 日志备份出来。pg 数据库可以利用 PITR 技术利用全量备份和wal 归档日志,把数据恢复到全量备份后的任意时间点。 

2.内存结构

postgresql 后台进程及内存结构_共享内存_02

2.1 本地内存

主要存储一些不需要全局存储的数据。主要有以下几个:

临时缓冲区:用于访问临时表的本地缓冲区。

work_mem:内部排序操作和hash 表在使用临时磁盘文件之前的内存缓冲区。

maintenance:在维护性操作(比如vacuum、create index、和alter table ass foreign key 等)中使用的内存缓冲区。

2.2 共享内存

postgresql 启动后会生成一块共享内存,主要用于数据块的缓冲区,以提高读写性能。wal日志缓冲区和clog (commit log) 缓冲区也存在于共享内存中。除此之外还有一些全局信息也会保存在共享内存,比如进程信息、锁信息、全局统计信息等。

标签:wal,postgresql,数据库,checkpoint,进程,内存,缓冲区,后台,日志
From: https://blog.51cto.com/u_11103985/8239193

相关文章

  • Unity性能优化之内存篇
    本文和传统的内存优化不一样,不是讲如何降低内存占用,而是讲编程开发中要注意的内存问题以及一些内存技术的演变与原理。 本文很长,目录如下:(1)Application进程的内存分段;(2)OS动态内存分配与手动内存管理;(3)什么是内存碎片,避免内存碎片常用手段;(4)什么是内存泄漏,预防与......
  • [转]PostgreSQL学习手册(目录)
       事实上之前有很长一段时间都在纠结是否有必要好好学习它,但是始终都没有一个很好的理由说服自己。甚至是直到这个项目最终决定选用PostgreSQL时,我都没有真正意识到学习它的价值,当时只是想反正和其它数据库差不多,能用就行了。然而有一天晚上,自己也不知道为什么,躺在床上开始......
  • 内核态内存映射
    内核态的内存映射机制,主要包含以下几个部分:内核态内存映射函数vmalloc、kmap_atomic是如何工作的;内核态页表是放在哪里的,如何工作的?swapper_pg_dir是怎么回事;出现了内核态缺页异常应该怎么办?内核页表的顶级目录init_top_pgt,定义在__INITDATA里面。它们都有代码段,还有一些初始......
  • Flink 内存配置学习总结
    设置进程内存(ProcessMemory)ApacheFlink通过严格控制其各种组件的内存使用,在JVM之上提供高效的工作负载。配置总内存(TotalMemory)FlinkJVM进程的总进程内存(totalprocessmemory)由Flink应用程序消耗的内存(总Flink内存(totalFlinkmemory))和JVM运行进程所消耗的内存......
  • JAVA多线程并发查询百万数据的内存占用问题?
    在Java中使用多线程并发查询百万数据时,内存占用是一个需要考虑的重要问题。以下是一些解决该问题的方案:分批查询:将数据分成较小的批次进行查询,而不是一次性加载全部数据。这样可以减少每个线程需要处理的数据量,降低内存占用。可以将查询结果分组或按需加载,以保持内存占用的合理范......
  • 一次压力测试引起的内存溢出排查(apollo)
    项目从nacos配置中心适配apollo后,线上压测运行4个小时,内存告警,FGC达到了惊人的100+次拿到压测dump文件使用mat分析发现com.ctrip.framework.apollo.spring.property.SpringValueRegistry占比达到91.68%,很明显SpringValueRegistry导致的内存泄漏 找到了导致内存泄漏的原因,那么......
  • Linux下内存buff/cache占用过多问题解决
    在Linux下经常会遇到buff/cache内存占用过多问题,如果buff/cache占用过大的,free空闲内存就很少,影响使用;通常内存关系是:普通机器:total=used+free虚拟机器:total=used+free+buff/cache这个时候可以看到buff/cache占用的内存非常大,这个时候可以使用一下命令去清除一下cache内存echo1>......
  • 用户态内存映射
    内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。对于堆的申请来讲,mmap是映射内存空间到物理内存。如果一个进程想映射一个文件到自己的......
  • 后台终端Screen使用
    1、查看sreen状态screen-lsAttached:表示当前screen正在作为主终端使用,为活跃状态。Detached:表示当前screen正在后台使用,为非激发状态。2、查询命令提示screen-help3、创建终端(1)使用-R创建,如果之前有创建唯一一个同名的screen,则直接进入之前创建的screen(2)使用-S创建和......
  • java进程后台运行
    实现Java进程后台运行的步骤流程图如下所示:创建Java程序编译Java程序将class文件打成jar包编写运行脚本后台运行脚本步骤一:创建Java程序首先,你需要创建一个Java程序,可以使用任何你熟悉的Java开发工具。假设你的Java程序是一个简单的HelloWorld程序,如下所示:publicclassHelloWorld......