签到成功

知道了

CNDBA社区CNDBA社区

openGauss 单进程 多线程 架构 说明

2023-04-18 09:29 813 0 原创 openGauss
作者: dave

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的进程结构参考之前的博客:

http://www.cndba.cn/dave/article/116558
http://www.cndba.cn/dave/article/116558

PostgreSQL 学习笔记(9) — PG 进程和内存结构说明
https://www.cndba.cn/dave/article/116381

由于数据库服务器的服务进程或线程间存在着大量数据共享和同步,而多线程可以充分利用多CPU来并行执行多个强相关任务,例如执行引擎可以充分的利用线程的并发执行以提供性能。

在多线程的架构下,数据共享的效率更高,能提高服务器访问的效率和性能,同时维护开销和复杂度更低,这对于提高数据库系统的并行处理能力非常重要。

http://www.cndba.cn/dave/article/116558

使用多线程的三大主要优势:

  1. 优势一:线程启动开销远小于进程启动开销。与进程相比,它是一种非常“节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种“昂贵”的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间。http://www.cndba.cn/dave/article/116558

    http://www.cndba.cn/dave/article/116558
    http://www.cndba.cn/dave/article/116558

  2. 优势二:线程间方便的通信机制:对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。

    http://www.cndba.cn/dave/article/116558

  3. 优势三:线程切换开销小于进程切换开销,对于Linux系统来讲,进程切换分两步:1.切换页目录以使用新的地址空间;2.切换内核栈和硬件上下文。对线程切换,第1步是不需要做的,第2步是进程和线程都要做的,所以明显线程切换开销小。

2 线程说明

我们可以通过如下命令来查看openGauss中线程:http://www.cndba.cn/dave/article/116558

[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个线程,并且在不同的版本中,线程名称和数量还是有出入的:

http://www.cndba.cn/dave/article/116558
http://www.cndba.cn/dave/article/116558

  1. 2pccleaner:2 阶段清理
  2. alarm:告警检测
  3. applylauncher
  4. archiver
  5. ashworker:统计历史活动会话信息
  6. asyncundolaunch
  7. auditor:审计线程,将审计信息写到文件
  8. AVClauncher:启动维护清理进/线程对数据库回收清理。
  9. CBMwriter
  10. CfsShrinker
  11. checkpointer:检查点线程。进行检查点操作,完成数据库的周期性检查点和执行检查点命令。
  12. faultmonitor:监控系统故障
  13. gaussdb:初始化(内存,全局信息,信号,线程池等),启动辅助进/线程,循环监听辅助进/线程,处理客户端的连接请求,执行相关 sql 业务其他线程。
  14. globalstats
  15. heartbeat
  16. jemalloc_bg_thd:Jemalloc 开源库的后台线程
  17. Jobscheduler:根据 pg_job 表里面定义的 JOB 周期,对 JOB 进行调用
  18. pagewriter:后台数据写线程。周期性的把数据库数据缓冲区的内容同步到磁盘上。
  19. percentworker:根据 percentile 参数值计算 sql 响应时间百分比,目前 percentile 参数仅支持 80 和 95
  20. rbcleaner
  21. reaper:回收处于 die 状态的子线程
  22. snapshotworker:收集 snapshot 信息,用于生成 WDR 报告
  23. Spbgwriter
  24. statscollector:统计信息收集,负责收集、保存、持久化数据库运行中产生的各种 metric 信息,包括物理硬件资源使用信息、对象属性及使用信息、SQL 运行信息、会话信息、锁信息、线程信息等。
  25. syslogger:运行日志写。主要功能是把各个线程的运行日志信息写到运行日志文件中。
  26. TrackStmtWorker
  27. txnsnapcapturer
  28. undorecycler:回收 undo 空间数据。
  29. WALwriter:后台 WAL 写。主要功能是周期性的把日志缓冲区的内容同步到磁盘上。
  30. WALwriteraux:wal writer 辅助线程。
  31. WalSender:WAL 日志信息发送,负责物理复制和逻辑复制的 wal 文件信息发送。
  32. WALreceiver:下游接收 wal 信息,物理复制下游节点接受 wal 文件信息。

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2239
    原创
  • 3
    翻译
  • 546
    转载
  • 186
    评论
  • 访问:6603267次
  • 积分:4248
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ