1 单进程多线程架构
我们知道openGauss是在pg 9.2.4 的基础上进行魔改的:
[dave@www.cndba.cn ~]$ gaussdb -V
gaussdb (openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr
[dave@www.cndba.cn ~]$ gs_ctl -V
gs_ctl (openGauss) 9.2.4
[dave@www.cndba.cn ~]$
Postgres 9.2.4的总代码量约120W行,其中内核代码约95W行。而openGauss新增或修改了内核代码约70W行,内核代码修改比例约占总内核代码量的74%。保留了原先PostgreSQL的接口和公共函数代码(约25W行),仅对这些代码做了适当优化。
PostgreSQL和Oracle 一样,采用的是多进程方式,而openGauss和达梦、MySQL一样,是单进程多线程架构。客户端可以使用JDBC/ODBC/Libpq/Psycopg等驱动程序,向openGauss的主线程发起连接请求。
关于PG的进程结构参考之前的博客:
PostgreSQL 学习笔记(9) — PG 进程和内存结构说明
https://www.cndba.cn/dave/article/116381
由于数据库服务器的服务进程或线程间存在着大量数据共享和同步,而多线程可以充分利用多CPU来并行执行多个强相关任务,例如执行引擎可以充分的利用线程的并发执行以提供性能。
在多线程的架构下,数据共享的效率更高,能提高服务器访问的效率和性能,同时维护开销和复杂度更低,这对于提高数据库系统的并行处理能力非常重要。
使用多线程的三大主要优势:
优势一:线程启动开销远小于进程启动开销。与进程相比,它是一种非常“节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种“昂贵”的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。
优势二:线程间方便的通信机制:对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
优势三:线程切换开销小于进程切换开销,对于Linux系统来讲,进程切换分两步:1.切换页目录以使用新的地址空间;2.切换内核栈和硬件上下文。对线程切换,第1步是不需要做的,第2步是进程和线程都要做的,所以明显线程切换开销小。
2 线程说明
我们可以通过如下命令来查看openGauss中线程:
[dave@www.cndba.cn cndba]$ ps -ef|grep openG
omm 3297 1 8 20:59 ? 00:11:16 /data/openGauss/install/app/bin/gaussdb -D /data/openGauss/install/data/newcndba2
omm 28724 1 1 10:30 ? 00:11:57 /data/openGauss/install/app/bin/om_monitor -L /var/log/omm/omm/cm/om_monitor
omm 31520 2103 0 23:05 pts/5 00:00:00 grep --color=auto openG
[dave@www.cndba.cn dn_6001]$ ps -T -p 13106
PID SPID TTY TIME CMD
13106 13106 ? 00:00:01 gaussdb
13106 13107 ? 00:00:00 jemalloc_bg_thd
13106 13120 ? 00:00:00 gaussdb
13106 13121 ? 00:00:00 syslogger
13106 13122 ? 00:00:00 jemalloc_bg_thd
13106 13123 ? 00:00:00 alarm
13106 13124 ? 00:00:00 reaper
13106 13125 ? 00:00:00 jemalloc_bg_thd
13106 13126 ? 00:00:00 jemalloc_bg_thd
13106 13150 ? 00:00:00 gaussdb
13106 13151 ? 00:00:00 gaussdb
13106 13152 ? 00:00:00 gaussdb
13106 13164 ? 00:00:00 checkpointer
13106 13166 ? 00:00:00 Spbgwriter
13106 13168 ? 00:00:00 CBMwriter
13106 13170 ? 00:00:00 pagewriter
13106 13172 ? 00:00:00 pagewriter
13106 13173 ? 00:00:00 pagewriter
13106 13174 ? 00:00:01 pagewriter
13106 13175 ? 00:00:00 pagewriter
13106 13176 ? 00:00:00 WALwriteraux
13106 13177 ? 00:00:00 statscollector
13106 13178 ? 00:00:00 auditor
13106 13179 ? 00:00:00 CfsShrinker
13106 13180 ? 00:00:01 TrackStmtWorker
13106 13202 ? 00:00:00 worker
13106 13601 ? 00:00:00 WALwriter
13106 13602 ? 00:00:00 AVClauncher
13106 13603 ? 00:00:00 Jobscheduler
13106 13604 ? 00:00:00 asyncundolaunch
13106 13605 ? 00:00:00 globalstats
13106 13606 ? 00:00:00 applylauncher
13106 13607 ? 00:00:00 archiver
13106 13608 ? 00:00:00 txnsnapcapturer
13106 13609 ? 00:00:00 rbcleaner
13106 13610 ? 00:00:00 snapshotworker
13106 13611 ? 00:00:00 percentworker
13106 13612 ? 00:00:04 ashworker
13106 13613 ? 00:00:00 2pccleaner
13106 13614 ? 00:00:00 faultmonitor
13106 13616 ? 00:00:00 heartbeat
13106 13617 ? 00:00:01 undorecycler
13106 13618 ? 00:00:00 WalSender
13106 13625 ? 00:00:00 worker
13106 13688 ? 00:00:00 WalSender
[dave@www.cndba.cn dn_6001]$
我们可以看到在openGauss 5.0.0 版本中有31个线程,并且在不同的版本中,线程名称和数量还是有出入的:
- 2pccleaner:2 阶段清理
- alarm:告警检测
- applylauncher
- archiver
- ashworker:统计历史活动会话信息
- asyncundolaunch
- auditor:审计线程,将审计信息写到文件
- AVClauncher:启动维护清理进/线程对数据库回收清理。
- CBMwriter
- CfsShrinker
- checkpointer:检查点线程。进行检查点操作,完成数据库的周期性检查点和执行检查点命令。
- faultmonitor:监控系统故障
- gaussdb:初始化(内存,全局信息,信号,线程池等),启动辅助进/线程,循环监听辅助进/线程,处理客户端的连接请求,执行相关 sql 业务其他线程。
- globalstats
- heartbeat
- jemalloc_bg_thd:Jemalloc 开源库的后台线程
- Jobscheduler:根据 pg_job 表里面定义的 JOB 周期,对 JOB 进行调用
- pagewriter:后台数据写线程。周期性的把数据库数据缓冲区的内容同步到磁盘上。
- percentworker:根据 percentile 参数值计算 sql 响应时间百分比,目前 percentile 参数仅支持 80 和 95
- rbcleaner
- reaper:回收处于 die 状态的子线程
- snapshotworker:收集 snapshot 信息,用于生成 WDR 报告
- Spbgwriter
- statscollector:统计信息收集,负责收集、保存、持久化数据库运行中产生的各种 metric 信息,包括物理硬件资源使用信息、对象属性及使用信息、SQL 运行信息、会话信息、锁信息、线程信息等。
- syslogger:运行日志写。主要功能是把各个线程的运行日志信息写到运行日志文件中。
- TrackStmtWorker
- txnsnapcapturer
- undorecycler:回收 undo 空间数据。
- WALwriter:后台 WAL 写。主要功能是周期性的把日志缓冲区的内容同步到磁盘上。
- WALwriteraux:wal writer 辅助线程。
- WalSender:WAL 日志信息发送,负责物理复制和逻辑复制的 wal 文件信息发送。
- WALreceiver:下游接收 wal 信息,物理复制下游节点接受 wal 文件信息。
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 上一篇:openGauss VACUUM 说明
- 下一篇:openGauss 执行计划 说明