注册
DM8 常见进程、服务与线程的职责
专栏/技术分享/ 文章详情 /

DM8 常见进程、服务与线程的职责

wwhhdd 2026/09/11 14 0 0
摘要

DM8 常见进程、服务与线程的职责

1. 进程、服务和线程的区别

  • 进程:运行中的程序,如 dmserverdmwatcher,通过 PID 区分。
  • 服务:用于管理程序的启动、停止等操作,如 DmServiceDMSERVER。服务名称可以在注册时指定。
  • 线程:进程内部处理任务的执行单元,如工作线程、IO 线程。

DM8 数据库服务器采用单进程、多线程结构,一个实例对应一个 dmserver 进程。主备和集群环境中,各实例分别运行,并配有守护、集群管理等进程。

按部署用途分类如下,其中线程列在所属的 dmserver 下:

达梦运行组件
├─ 数据库实例:dmserver
│  ├─ 监听、工作、IO 线程
│  ├─ 调度、日志 FLUSH 线程
│  └─ 归档、APPLY、定时器、MAL 等线程
├─ 数据守护
│  ├─ dmwatcher:守护实例、处理主备故障
│  └─ dmmonitor:监视和管理主备系统
├─ DMDSC / DMASM
│  ├─ dmcss:集群监控和控制
│  ├─ dmasmsvr:共享存储管理
│  ├─ dmasmsvrm:镜像方案相关服务
│  └─ dmcssm:集群监视和管理
└─ 监控与辅助程序
   ├─ dmagent:DEM 代理
   ├─ dmamon / dmimon:审计、实例监控
   └─ dmap:数据库辅助进程

单机、主备、DSC 和 DEM 使用的组件不同,按部署方案配置和启动。

2. 常见进程及职责

进程 / 程序 所属架构或产品 主要工作 配置及说明
dmserver DM8 实例,单机、主备、DMDSC、MPP 等都会使用 处理 SQL、事务、内存、文件读写及恢复 数据库核心进程,实例配置主要在 dm.ini
dmwatcher 数据守护 监视本地实例和主备状态,参与故障处理 与被守护实例同机部署;使用 dmwatcher.ini
dmmonitor 数据守护 查看主备状态,下发切换、接管等管理命令 普通监视器与确认监视器职责有区别;使用 dmmonitor.ini
dmcss DMCSS,服务于 DMDSC / DMASM 节点监控、控制节点选举、启动控制和故障处理 各集群节点配置;使用 dmdcr.ini
dmasmsvr DMASM 管理共享块设备上的磁盘组和文件 采用 DMASM 时使用,受 DMCSS 管理
dmasmsvrm DMASM 镜像方案 提供镜像相关服务 普通 DMASM 环境不一定有此进程
dmcssm DMCSS / DMDSC 查看和管理集群状态 使用 dmcssm.ini
dmagent DEM 企业管理系统 采集主机、实例信息,执行远程运维任务 是部署在被管理主机上的代理,使用 agent.ini
dmamon 审计监控工具 监控数据库审计信息 独立监控程序,按需使用
dmimon 实例监控工具 监控数据库实例状态 独立监控程序,按需使用
dmap 数据库辅助程序 承载备份还原插件、第三方备份接口、C 外部函数等辅助任务 是否使用与具体功能及 BAK_USE_APEFC_USE_AP 等参数有关

2.1 数据库实例:dmserver

dmserver 对外提供数据库服务,主要负责:

  • 接收客户端连接,管理会话;
  • 解析、优化和执行 SQL;
  • 管理事务、锁及并发访问;
  • 管理数据缓冲区等内存结构;
  • 读写数据文件、控制文件、联机日志文件;
  • 执行检查点、归档和故障恢复;
  • 在主备环境中通过归档机制传输 Redo,并在备库重演。

以上工作由 dmserver 内部的不同线程完成。

一台主机运行多个实例时,可通过启动参数中的 dm.ini 路径确认进程对应的实例。

实例是运行中的进程、内存和线程;数据文件、日志文件、控制文件等是磁盘上的持久化文件。停止实例后,文件仍然保留。

2.2 数据守护:dmwatcher、dmmonitor

主库 dmserver ──归档传输──→ 备库 dmserver

守护与管理通信:
dmmonitor ↔ 主库节点 dmwatcher
dmmonitor ↔ 备库节点 dmwatcher
主库节点 dmwatcher ↔ 备库节点 dmwatcher
各节点 dmwatcher ↔ 本机 dmserver

dmwatcher 与它守护的实例部署在同一台主机上,配置文件为 dmwatcher.ini。主要负责:

  • 监控本机实例状态,获取主备同步情况;
  • 与其他守护进程、数据库实例、监视器交换信息;
  • 在这些组件之间转发相关消息;
  • 根据配置和当前状态,参与实例拉起、切换、接管及故障恢复流程。

dmmonitor 使用 dmmonitor.ini,用于查看和管理守护系统:

  • 查看数据库、守护进程和主备同步状态;
  • 查看故障处理期间实例模式、状态的变化;
  • 下发启动、停止、切换和接管等管理命令。

监视器分为普通监视器和确认监视器。普通监视器用于查看状态和人工管理;确认监视器还参与故障确认,并在满足自动接管条件时发起接管。

主库通过实时归档、异步归档等机制向备库传输 Redo,备库接收后进行重演。归档类型在 dmarch.ini 中通过 ARCH_TYPE 配置,dmwatcher 负责守护和状态管理。

归档传输的是 Redo 日志内容。其中,实时归档在主库联机日志刷盘前发送日志,无需先生成本地归档文件。相关原理见数据守护概述故障恢复

检查主备同步情况时,分别查看守护状态、归档发送、日志接收和重演进度。

2.3 DMDSC:dmcss、dmasmsvr、dmcssm

采用 DMASM 的双节点 DMDSC 环境中,各节点有自己的 dmserverdmcssdmasmsvr

组件的监控、管理关系如下(非数据读写路径):

dmcssm 集群监视器
├─ 节点 1:dmcss
│  ├─ 监控、管理 dmserver
│  └─ 监控、管理 dmasmsvr
└─ 节点 2:dmcss
   ├─ 监控、管理 dmserver
   └─ 监控、管理 dmasmsvr

节点 1 dmcss ↔ 节点 2 dmcss

dmcss:集群同步服务

各节点的 dmcss 组成 DMCSS 集群,选出控制节点,负责:

  • 写入、检查心跳信息,监控节点状态;
  • 选举 DMCSS 控制节点,选取 DMASM、DMDSC 控制节点;
  • 按配置管理 dmasmsvrdmserver 的启动;
  • 处理节点故障和重新加入;
  • 接收并执行 dmcssm 的管理指令。

相关配置文件为 dmdcr.ini。集群启动异常时,检查 DMCSS 状态、心跳和 DCR 配置。

dmasmsvr:自动存储管理服务器

DMASM 是管理共享块设备和文件的分布式文件系统,dmasmsvr 是其服务进程,主要负责:

  • 识别、加载 ASM 磁盘;
  • 管理磁盘组和 ASM 文件;
  • 为数据库实例提供共享文件访问;
  • 处理文件级全局并发控制;
  • 与其他 DMASM 节点通信。

DMASM 处理文件级并发控制;数据库页的并发访问、SQL 解析和执行由数据库实例负责。

dmasmsvrm 是 DMASM 镜像方案的相关服务,普通 DMASM 部署不一定使用。

dmcssm:集群监视器

dmcssm 用于查看 DMCSS、DMASM、DMDSC 节点状态,并进行集群启停、自动拉起控制等管理操作,配置文件为 dmcssm.ini

管理工具对应关系:dmmonitor 用于数据守护,dmcssm 用于 DMCSS / DMDSC。

2.4 DEM 代理:dmagent

dmagent 部署在纳入 DEM 管理的主机上,配置文件为 agent.ini。主要负责:

  • 采集 CPU、内存、磁盘、网络和进程信息;
  • 收集数据库信息并发送给 DEM;
  • 接收 DEM 下发的远程命令;
  • 执行授权范围内的进程启停、文件操作和部署维护任务。

dmagent 随 DEM 管理需求部署,单机数据库可独立运行。DEM 显示主机离线时,先检查代理和网络,再确认数据库状态。

2.5 审计、实例监控程序

  • dmamon:Audit Monitor,监控数据库审计信息。
  • dmimon:Instance Monitor,监控数据库实例状态。

两个监控程序独立于 dmserver 运行。数据库内部另有审计写文件等线程,负责具体的后台处理。

2.6 数据库辅助进程:dmap

dmap 主要承载备份还原插件、第三方备份接口、C 外部函数代理执行等辅助任务,相关配置文件为 dmap.ini

相关参数:

  • BAK_USE_AP:控制备份还原是否使用辅助进程等执行方式。
  • EFC_USE_AP:与 C 外部函数是否通过辅助进程执行有关。

备份是否依赖 dmap,按当前版本的 BAK_USE_AP 设置确认。

3. dmserver 内部线程及职责

以下为常见线程类型,实际名称、数量及是否启动,以当前版本、实例状态和功能配置为准。

线程类型 所属进程 / 使用场景 主要工作 说明
监听线程 dmserver 接收新连接,生成会话申请任务 后续请求交由工作线程处理
任务工作线程 dmserver 执行内部任务、异步任务 初始数量与 TASK_THREADS 有关
会话工作线程 dmserver 处理会话请求 STHD_FLAG 控制是否采用线程池
IO 线程 dmserver 读数据页、写脏页 关注数据文件 IO,配置涉及 IO_THR_GROUPS
调度线程 dmserver 处理缓存维护、检查点、超时检查等调度事项 部分任务交给工作线程执行
日志 FLUSH 线程 dmserver Redo 刷盘,参与实时归档发送 写入联机日志文件
日志归档线程 dmserver,相应归档场景 本地、远程异步等归档处理 按归档类型执行任务
日志 APPLY 线程 数据守护实例,在备库承担重演工作 重演通过归档机制接收的主库 Redo 关注备库重演进度
定时器线程 dmserverTIMER_INI=1 检查定时器,触发相应后台任务 每秒检查定时器链表
MAL 相关线程 dmserver,主备、MPP 等通信场景 节点间监听、发送、接收 使用 MAL 通信配置
其他线程 dmserver,按功能配置 回滚段清理、审计写文件等 通过 V$THREADS 查看

线程分类及职责依据官方《DM8 系统管理员手册》:管理 DM 线程

3.1 监听线程

监听数据库端口,收到新连接后生成会话申请任务,交给工作线程处理。

客户端发起连接 → 监听线程接收 → 会话申请任务 → 后续连接处理

监听线程处理连接建立阶段;已有连接上的 SQL 请求由会话工作线程处理。

3.2 工作线程

任务工作线程处理内部任务队列;会话工作线程处理客户端请求。

会话工作线程有两种工作方式:

  • 非线程池模式:一个会话对应一个会话工作线程。
  • 线程池模式:会话请求进入队列,由线程池中的工作线程取出处理,连接数与工作线程数可不同。
内部任务:任务队列 → 任务工作线程

会话请求(线程池模式):
会话轮询线程接收 → 会话任务队列 → 会话工作线程执行

TASK_THREADS 控制任务工作线程初始数量;会话线程模式由 STHD_FLAG 控制,线程池初始规模还与 WORKER_THREADSSTHD_THREAD_NUM 有关。

3.3 IO 线程

  • 需要的数据页不在缓冲区时,从数据文件读取;
  • 缓冲区空间不足或实例关闭等情况下,将脏页写回数据文件;
  • 检查点触发时,执行相应的数据页刷盘。

脏页指内存中已修改、尚未写回数据文件的数据页。查询所需数据页已经在缓冲区中时,可以直接复用。

3.4 调度线程

负责服务器内部周期性检查和调度,包括:

  • 检查系统级时间触发条件;
  • 清理失效或超过缓存限制的缓存项;
  • 检查动态缓冲区,按需调整;
  • 按配置触发检查点;
  • 检查会话超时;
  • 唤醒等待的工作线程。

部分任务由调度线程生成并放入队列,再由任务工作线程执行。

3.5 日志 FLUSH、归档和 APPLY 线程

IO 线程负责数据页读写,FLUSH 线程负责 Redo 刷盘,归档线程负责相应归档任务。

数据页写回磁盘前,相关 Redo 需要先持久化。事务提交时涉及日志刷盘,修改过的数据页可由后续刷盘过程写入数据文件。

工作线程修改数据
├─ 生成 Redo → 日志缓冲区 → FLUSH 线程 → 联机日志文件
└─ 产生脏页 → 数据缓冲区 → IO 线程 → 数据文件

写入顺序:相关 Redo 先落盘,数据页再落盘。
  • FLUSH:将 Redo 写入联机日志;配置实时归档时,还在本地日志刷盘前向实时备库发送日志。
  • 归档线程:处理本地归档及远程异步等非实时归档任务;实时归档发送由 FLUSH 线程参与处理。
  • APPLY:在数据守护备库中重演通过归档机制接收的主库 Redo,使备库数据跟随主库变化。

主备延迟按归档发送、日志接收、APPLY 重演三个环节检查,接收进度和重演进度分别确认。

3.6 定时器线程

通过 dm.ini 中的 TIMER_INI=1 设置实例启动时启用定时器线程。线程启动后,每秒检查定时器链表,满足条件时触发相应任务,例如部分异步归档任务。

调度线程处理检查点、缓存维护、会话超时等内部事项;定时器线程按注册的定时器条件触发任务。

3.7 MAL 相关线程

MAL 是达梦内部基于 TCP/IP 的通信系统,数据守护、MPP、远程归档等功能会用到它。

相关线程包括 MAL 监听、发送工作线程和接收工作线程,负责节点间的消息、数据传输。MAL 监听服务于节点通信,数据库端口监听服务于客户端连接。

主备通信异常时,检查实例状态、MAL 配置、对应端口和网络连通性。

3.8 其他功能线程

其他线程包括回滚段清理、审计写文件等。线程种类和数量会随版本、功能配置及实例状态变化,可通过 V$THREADS 查看。

4. 查询执行过程

连接已经建立时,一次需要访问数据页的查询,可简化为:

已连接的客户端提交 SQL
  → 会话工作线程处理
  → 检查所需数据页是否在缓冲区中
    ├─ 已在缓冲区:直接使用
    └─ 不在缓冲区:通过 IO 读取数据文件,将数据页放入缓冲区
  → 继续执行查询
  → 向客户端返回结果

图中仅列出查询的数据页访问过程,省略了解析、优化和锁等待等细节。

5. 线程相关参数

相关参数配置在 dm.ini 中,取值和生效方式按当前版本手册确认。

参数 作用
TASK_THREADS 任务工作线程的初始数量
STHD_FLAG 会话线程工作模式,是否使用线程池
WORKER_THREADS 会话连接处理及线程池初始规模相关参数,含义与线程模式有关
STHD_THREAD_NUM 每个会话线程池的初始线程数量
IO_THR_GROUPS IO 线程数量相关配置
TIMER_INI 是否在实例启动时启用定时器线程

调整前先检查 CPU、锁等待、执行计划和磁盘 IO,再确认是否需要增加线程数量。

6. 查看进程和线程

以下命令用于 Linux 环境,数据库查询在 disql 或管理工具中执行。

6.1 查看进程和服务

# 查看数据库、守护、集群和 DEM 相关进程 ps -ef | grep -E '[d]mserver|[d]mwatcher|[d]mmonitor|[d]mcss|[d]masmsvr|[d]magent' # 查看审计、实例监控和辅助进程 ps -ef | grep -E '[d]mamon|[d]mimon|[d]map' # systemd 环境:查看已加载的相关服务,包括非运行状态 systemctl list-units --type=service --all | grep -i dm # 查看已安装的相关服务单元文件 systemctl list-unit-files --type=service | grep -i dm

先看进程名,再看启动参数中的配置文件路径,确认进程对应哪个实例或组件。

6.2 查看 dmserver 内部线程

根据进程查询结果,将 12345 替换为目标实例的 PID:

DM_PID=12345 # PID 是进程号,TID 是线程号 ps -L -p "$DM_PID" -o pid,tid,comm,pcpu,stat # 实时查看线程资源占用,按 q 退出 top -H -p "$DM_PID"

操作系统显示的线程名称可能截断;需要结合数据库视图进一步确认。

查询结果中,PID 为进程号,TID 为线程号。同一实例的线程具有相同 PID、不同 TID。通过 top -H 找到 CPU 占用较高的线程后,再结合会话和 SQL 执行情况检查。

6.3 在数据库内查看

使用具有相应查询权限的账号,在 disql 或管理工具中执行:

-- 当前实例的活动线程 SELECT * FROM V$THREADS; -- 当前服务器进程信息 SELECT * FROM V$PROCESS; -- 线程相关参数 SELECT NAME, TYPE, VALUE, SYS_VALUE, FILE_VALUE FROM V$PARAMETER WHERE NAME IN ( 'TASK_THREADS', 'STHD_FLAG', 'WORKER_THREADS', 'STHD_THREAD_NUM', 'IO_THR_GROUPS', 'TIMER_INI' );

V$PROCESS 查询当前数据库服务器进程信息;主机上的 dmwatcherdmcss 等独立进程使用 ps 查看。

7. 常见现象与检查方向

现象 优先检查
数据库服务启动失败 dmserver 启动日志、dm.ini 路径、端口占用、文件权限
客户端连接失败 实例状态、监听端口、网络、防火墙及认证错误
SQL 请求积压 会话工作线程、CPU、锁等待、执行计划及 IO 等待
事务提交慢 日志 FLUSH、日志盘 IO、归档和主备同步等待
备库数据落后 归档发送、日志接收、APPLY 重演状态和 MAL 网络
主备状态异常 dmserverdmwatcher、守护配置和通信状态
未发生预期的自动接管 确认监视器、守护状态、接管条件和配置
DSC 节点无法加入 dmcssdmasmsvr、心跳、共享存储及 DCR 配置
DEM 显示主机离线 dmagent 状态、DEM 地址、代理端口和网络

按表中方向检查后,结合组件日志、数据库视图和操作系统资源情况确认原因。

8. 参考资料

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服