达梦体系结构:进程架构
- 进程结构
- 监听线程
- 会话线程
- 工作线程
- IO线程
- 日志刷盘线程
- 日志归档线程
- 日志重做线程
- 调度线程
- 检查点线程
 
达梦数据库由数据库和实例构成:
- 数据库是指磁盘上存放的数据库文件的集合,包括参数文件、控制文件、数据文件、日志文件等。
- 实例是指一组运行的数据库进程/线程以及一块大型的共享内存。
进程结构
与Oracle多进程架构不同,达梦数据库采用的是单进程多线程的架构。
查看数据库进程:
[dmdba@localhost ~]$ ps -ef | grep dmserver
dmdba       1677       1  2 20:48 ?        00:00:02 /dm8/bin/dmserver path=/dm8/data/DAMENG/dm.ini -noconsole
dmdba       3349    3301  0 20:49 pts/1    00:00:00 grep dmserver[dmdba@localhost ~]$ ps -Tp 1677PID    SPID TTY          TIME CMD1677    1677 ?        00:00:02 dmserver1677    1776 ?        00:00:00 dm_sqllog_thd1677    1787 ?        00:00:00 dm_dpc_pthd1677    1788 ?        00:00:00 dm_dpc_pthd1677    1789 ?        00:00:00 dm_dpc_pthd1677    1790 ?        00:00:00 dm_dpc_pthd1677    1791 ?        00:00:00 dm_dpc_pthd1677    1792 ?        00:00:00 dm_dpc_pthd1677    1797 ?        00:00:00 dm_dpc_pthd1677    1798 ?        00:00:00 dm_dpc_pthd1677    1799 ?        00:00:00 dm_dpc_pthd1677    1800 ?        00:00:00 dm_dpc_pthd1677    1801 ?        00:00:00 dm_dpc_pthd1677    1802 ?        00:00:00 dm_dpc_pthd1677    1803 ?        00:00:00 dm_dpc_pthd1677    1807 ?        00:00:00 dm_dpc_pthd1677    1808 ?        00:00:00 dm_dpc_pthd1677    1809 ?        00:00:00 dm_dpc_pthd1677    2113 ?        00:00:00 dm_quit_thd1677    2133 ?        00:00:00 dm_io_thd1677    2134 ?        00:00:00 dm_io_thd1677    2135 ?        00:00:00 dm_io_thd1677    2136 ?        00:00:00 dm_io_thd1677    2137 ?        00:00:00 dm_io_thd1677    2138 ?        00:00:00 dm_io_thd1677    2139 ?        00:00:00 dm_io_thd1677    2140 ?        00:00:00 dm_io_thd1677    2141 ?        00:00:00 dm_io_thd1677    2142 ?        00:00:00 dm_io_thd1677    2143 ?        00:00:00 dm_io_thd1677    2144 ?        00:00:00 dm_io_thd1677    2145 ?        00:00:00 dm_io_thd1677    2146 ?        00:00:00 dm_io_thd1677    2147 ?        00:00:00 dm_io_thd1677    2148 ?        00:00:00 dm_io_thd1677    2153 ?        00:00:00 dmserver1677    2213 ?        00:00:00 dm_rsyswrk_thd1677    2214 ?        00:00:00 dm_rsyswrk_thd1677    2215 ?        00:00:00 dm_hio_thd1677    2216 ?        00:00:00 dm_hio_thd1677    2217 ?        00:00:00 dm_hio_thd1677    2218 ?        00:00:00 dm_hio_thd1677    2221 ?        00:00:00 dm_chkpnt_thd1677    2222 ?        00:00:00 dm_redolog_thd1677    2225 ?        00:00:00 dm_tskwrk_thd1677    2226 ?        00:00:00 dm_tskwrk_thd1677    2227 ?        00:00:00 dm_tskwrk_thd1677    2228 ?        00:00:00 dm_tskwrk_thd1677    2229 ?        00:00:00 dm_tskwrk_thd1677    2230 ?        00:00:00 dm_tskwrk_thd1677    2231 ?        00:00:00 dm_tskwrk_thd1677    2232 ?        00:00:00 dm_tskwrk_thd1677    2233 ?        00:00:00 dm_tskwrk_thd1677    2234 ?        00:00:00 dm_tskwrk_thd1677    2235 ?        00:00:00 dm_tskwrk_thd1677    2236 ?        00:00:00 dm_tskwrk_thd1677    2237 ?        00:00:00 dm_tskwrk_thd1677    2238 ?        00:00:00 dm_tskwrk_thd1677    2239 ?        00:00:00 dm_tskwrk_thd1677    2240 ?        00:00:00 dm_tskwrk_thd1677    2241 ?        00:00:00 dm_sqllog_thd1677    2242 ?        00:00:00 dm_sql_aux_thd1677    2243 ?        00:00:00 dm_purge_thd1677    2244 ?        00:00:00 dmserver1677    2245 ?        00:00:00 dm_trctsk_thd1677    2246 ?        00:00:00 dm_wrkgrp_thd1677    2247 ?        00:00:00 dm_wrkgrp_thd1677    2248 ?        00:00:00 dm_wrkgrp_thd1677    2249 ?        00:00:00 dm_wrkgrp_thd1677    2250 ?        00:00:00 dm_wrkgrp_thd1677    2251 ?        00:00:00 dm_wrkgrp_thd1677    2252 ?        00:00:00 dm_wrkgrp_thd1677    2253 ?        00:00:00 dm_wrkgrp_thd1677    2254 ?        00:00:00 dm_wrkgrp_thd1677    2255 ?        00:00:00 dm_wrkgrp_thd1677    2256 ?        00:00:00 dm_wrkgrp_thd1677    2257 ?        00:00:00 dm_wrkgrp_thd1677    2258 ?        00:00:00 dm_wrkgrp_thd1677    2259 ?        00:00:00 dm_wrkgrp_thd1677    2260 ?        00:00:00 dm_wrkgrp_thd1677    2261 ?        00:00:00 dm_wrkgrp_thd1677    2262 ?        00:00:00 dm_audit_thd1677    2263 ?        00:00:00 dm_audit_thd1677    2264 ?        00:00:00 dm_sched_thd1677    2265 ?        00:00:00 dm_lsnr_thd1677    3481 ?        00:00:00 dm_sql_thd
查看数据库进程资源消耗:
top -Hp 1677
与数据库进程相关的视图:
select * from v$process;select * from v$threads;
监听线程
监听进程对应的是 dm_lsnr_thd。监听进程用于在服务器端口上进行循环监听,一旦收到来自客户端的连接请求,监听进程被唤醒并生成一个会话进程,将申请的任务加入工作线程的任务队列,等待工作线程进行处理。
会话线程
会话线程对应的是 dm_sql_thd。每个会话对应一个会话线程。当数据库连接会话较多时,会话线程的数量也会很多。
会话对应的线程ID可以在视图V$SESSIONS中查到。
select sess_id,thrd_id,trx_id,sql_id,state from v$sessions;
工作线程
工作线程对应的是 dm_tskwrk_thd和 dm_wrkgrp_thd。工作线程是达梦的核心线程,默认有16个工作线程。
IO线程
IO线程对应的是 dm_io_thd。主要用于以下三种场景:
- 需要访问的数据页不在内存中时,通过物理读将磁盘中的数据页读到内存中。
- 缓冲区满或者数据库关闭时,将内存中的脏数据刷到磁盘中。
- 执行检查点时,将内存中所有脏数据落盘。
日志刷盘线程
对应的进程是 dm_redolog_thd。负责日志刷盘。主要用于在事务提交或者检查点时将日志缓冲区中的REDO日志写入到磁盘中的日志文件中。
日志归档线程
对应的进程是 dm_rsyswrk_thd。用于REDO日志的归档。
日志重做线程
主要用于数据库恢复,日志重做线程会根据REDO日志进行并行的故障恢复。
调度线程
对应的进程是 dm_sched_thd。用于定时调度任务。包括但不限于以下场景:
- 检查系统级的事件触发器;
- 清理SQL缓存、计划缓存中的失效项,或者超出缓存限制后淘汰不常用的缓存项;
- 动态缓冲区检查。根据需要动态扩展或收缩系统缓冲池;
- 自动执行检查点;
- 会话超时检测;
- 必要时执行数据更新页刷盘;
- 唤醒等待的工作线程。
检查点线程
对应的进程是 dm_chkpnt_thd。负责CHECKPOINT检查点操作。检查点时,IO线程会将脏数据页刷到磁盘数据文件中。