dmserver、dmwatcher,通过 PID 区分。DmServiceDMSERVER。服务名称可以在注册时指定。DM8 数据库服务器采用单进程、多线程结构,一个实例对应一个 dmserver 进程。主备和集群环境中,各实例分别运行,并配有守护、集群管理等进程。
按部署用途分类如下,其中线程列在所属的 dmserver 下:
达梦运行组件
├─ 数据库实例:dmserver
│ ├─ 监听、工作、IO 线程
│ ├─ 调度、日志 FLUSH 线程
│ └─ 归档、APPLY、定时器、MAL 等线程
├─ 数据守护
│ ├─ dmwatcher:守护实例、处理主备故障
│ └─ dmmonitor:监视和管理主备系统
├─ DMDSC / DMASM
│ ├─ dmcss:集群监控和控制
│ ├─ dmasmsvr:共享存储管理
│ ├─ dmasmsvrm:镜像方案相关服务
│ └─ dmcssm:集群监视和管理
└─ 监控与辅助程序
├─ dmagent:DEM 代理
├─ dmamon / dmimon:审计、实例监控
└─ dmap:数据库辅助进程
单机、主备、DSC 和 DEM 使用的组件不同,按部署方案配置和启动。
| 进程 / 程序 | 所属架构或产品 | 主要工作 | 配置及说明 |
|---|---|---|---|
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_AP、EFC_USE_AP 等参数有关 |
dmserver 对外提供数据库服务,主要负责:
以上工作由 dmserver 内部的不同线程完成。
一台主机运行多个实例时,可通过启动参数中的 dm.ini 路径确认进程对应的实例。
实例是运行中的进程、内存和线程;数据文件、日志文件、控制文件等是磁盘上的持久化文件。停止实例后,文件仍然保留。
主库 dmserver ──归档传输──→ 备库 dmserver
守护与管理通信:
dmmonitor ↔ 主库节点 dmwatcher
dmmonitor ↔ 备库节点 dmwatcher
主库节点 dmwatcher ↔ 备库节点 dmwatcher
各节点 dmwatcher ↔ 本机 dmserver
dmwatcher 与它守护的实例部署在同一台主机上,配置文件为 dmwatcher.ini。主要负责:
dmmonitor 使用 dmmonitor.ini,用于查看和管理守护系统:
监视器分为普通监视器和确认监视器。普通监视器用于查看状态和人工管理;确认监视器还参与故障确认,并在满足自动接管条件时发起接管。
主库通过实时归档、异步归档等机制向备库传输 Redo,备库接收后进行重演。归档类型在 dmarch.ini 中通过 ARCH_TYPE 配置,dmwatcher 负责守护和状态管理。
归档传输的是 Redo 日志内容。其中,实时归档在主库联机日志刷盘前发送日志,无需先生成本地归档文件。相关原理见数据守护概述和故障恢复。
检查主备同步情况时,分别查看守护状态、归档发送、日志接收和重演进度。
采用 DMASM 的双节点 DMDSC 环境中,各节点有自己的 dmserver、dmcss 和 dmasmsvr。
组件的监控、管理关系如下(非数据读写路径):
dmcssm 集群监视器
├─ 节点 1:dmcss
│ ├─ 监控、管理 dmserver
│ └─ 监控、管理 dmasmsvr
└─ 节点 2:dmcss
├─ 监控、管理 dmserver
└─ 监控、管理 dmasmsvr
节点 1 dmcss ↔ 节点 2 dmcss
各节点的 dmcss 组成 DMCSS 集群,选出控制节点,负责:
dmasmsvr、dmserver 的启动;dmcssm 的管理指令。相关配置文件为 dmdcr.ini。集群启动异常时,检查 DMCSS 状态、心跳和 DCR 配置。
DMASM 是管理共享块设备和文件的分布式文件系统,dmasmsvr 是其服务进程,主要负责:
DMASM 处理文件级并发控制;数据库页的并发访问、SQL 解析和执行由数据库实例负责。
dmasmsvrm 是 DMASM 镜像方案的相关服务,普通 DMASM 部署不一定使用。
dmcssm 用于查看 DMCSS、DMASM、DMDSC 节点状态,并进行集群启停、自动拉起控制等管理操作,配置文件为 dmcssm.ini。
管理工具对应关系:dmmonitor 用于数据守护,dmcssm 用于 DMCSS / DMDSC。
dmagent 部署在纳入 DEM 管理的主机上,配置文件为 agent.ini。主要负责:
dmagent 随 DEM 管理需求部署,单机数据库可独立运行。DEM 显示主机离线时,先检查代理和网络,再确认数据库状态。
dmamon:Audit Monitor,监控数据库审计信息。dmimon:Instance Monitor,监控数据库实例状态。两个监控程序独立于 dmserver 运行。数据库内部另有审计写文件等线程,负责具体的后台处理。
dmap 主要承载备份还原插件、第三方备份接口、C 外部函数代理执行等辅助任务,相关配置文件为 dmap.ini。
相关参数:
BAK_USE_AP:控制备份还原是否使用辅助进程等执行方式。EFC_USE_AP:与 C 外部函数是否通过辅助进程执行有关。备份是否依赖 dmap,按当前版本的 BAK_USE_AP 设置确认。
以下为常见线程类型,实际名称、数量及是否启动,以当前版本、实例状态和功能配置为准。
| 线程类型 | 所属进程 / 使用场景 | 主要工作 | 说明 |
|---|---|---|---|
| 监听线程 | dmserver |
接收新连接,生成会话申请任务 | 后续请求交由工作线程处理 |
| 任务工作线程 | dmserver |
执行内部任务、异步任务 | 初始数量与 TASK_THREADS 有关 |
| 会话工作线程 | dmserver |
处理会话请求 | STHD_FLAG 控制是否采用线程池 |
| IO 线程 | dmserver |
读数据页、写脏页 | 关注数据文件 IO,配置涉及 IO_THR_GROUPS |
| 调度线程 | dmserver |
处理缓存维护、检查点、超时检查等调度事项 | 部分任务交给工作线程执行 |
| 日志 FLUSH 线程 | dmserver |
Redo 刷盘,参与实时归档发送 | 写入联机日志文件 |
| 日志归档线程 | dmserver,相应归档场景 |
本地、远程异步等归档处理 | 按归档类型执行任务 |
| 日志 APPLY 线程 | 数据守护实例,在备库承担重演工作 | 重演通过归档机制接收的主库 Redo | 关注备库重演进度 |
| 定时器线程 | dmserver,TIMER_INI=1 |
检查定时器,触发相应后台任务 | 每秒检查定时器链表 |
| MAL 相关线程 | dmserver,主备、MPP 等通信场景 |
节点间监听、发送、接收 | 使用 MAL 通信配置 |
| 其他线程 | dmserver,按功能配置 |
回滚段清理、审计写文件等 | 通过 V$THREADS 查看 |
线程分类及职责依据官方《DM8 系统管理员手册》:管理 DM 线程。
监听数据库端口,收到新连接后生成会话申请任务,交给工作线程处理。
客户端发起连接 → 监听线程接收 → 会话申请任务 → 后续连接处理
监听线程处理连接建立阶段;已有连接上的 SQL 请求由会话工作线程处理。
任务工作线程处理内部任务队列;会话工作线程处理客户端请求。
会话工作线程有两种工作方式:
内部任务:任务队列 → 任务工作线程
会话请求(线程池模式):
会话轮询线程接收 → 会话任务队列 → 会话工作线程执行
TASK_THREADS 控制任务工作线程初始数量;会话线程模式由 STHD_FLAG 控制,线程池初始规模还与 WORKER_THREADS、STHD_THREAD_NUM 有关。
脏页指内存中已修改、尚未写回数据文件的数据页。查询所需数据页已经在缓冲区中时,可以直接复用。
负责服务器内部周期性检查和调度,包括:
部分任务由调度线程生成并放入队列,再由任务工作线程执行。
IO 线程负责数据页读写,FLUSH 线程负责 Redo 刷盘,归档线程负责相应归档任务。
数据页写回磁盘前,相关 Redo 需要先持久化。事务提交时涉及日志刷盘,修改过的数据页可由后续刷盘过程写入数据文件。
工作线程修改数据
├─ 生成 Redo → 日志缓冲区 → FLUSH 线程 → 联机日志文件
└─ 产生脏页 → 数据缓冲区 → IO 线程 → 数据文件
写入顺序:相关 Redo 先落盘,数据页再落盘。
主备延迟按归档发送、日志接收、APPLY 重演三个环节检查,接收进度和重演进度分别确认。
通过 dm.ini 中的 TIMER_INI=1 设置实例启动时启用定时器线程。线程启动后,每秒检查定时器链表,满足条件时触发相应任务,例如部分异步归档任务。
调度线程处理检查点、缓存维护、会话超时等内部事项;定时器线程按注册的定时器条件触发任务。
MAL 是达梦内部基于 TCP/IP 的通信系统,数据守护、MPP、远程归档等功能会用到它。
相关线程包括 MAL 监听、发送工作线程和接收工作线程,负责节点间的消息、数据传输。MAL 监听服务于节点通信,数据库端口监听服务于客户端连接。
主备通信异常时,检查实例状态、MAL 配置、对应端口和网络连通性。
其他线程包括回滚段清理、审计写文件等。线程种类和数量会随版本、功能配置及实例状态变化,可通过 V$THREADS 查看。
连接已经建立时,一次需要访问数据页的查询,可简化为:
已连接的客户端提交 SQL
→ 会话工作线程处理
→ 检查所需数据页是否在缓冲区中
├─ 已在缓冲区:直接使用
└─ 不在缓冲区:通过 IO 读取数据文件,将数据页放入缓冲区
→ 继续执行查询
→ 向客户端返回结果
图中仅列出查询的数据页访问过程,省略了解析、优化和锁等待等细节。
相关参数配置在 dm.ini 中,取值和生效方式按当前版本手册确认。
| 参数 | 作用 |
|---|---|
TASK_THREADS |
任务工作线程的初始数量 |
STHD_FLAG |
会话线程工作模式,是否使用线程池 |
WORKER_THREADS |
会话连接处理及线程池初始规模相关参数,含义与线程模式有关 |
STHD_THREAD_NUM |
每个会话线程池的初始线程数量 |
IO_THR_GROUPS |
IO 线程数量相关配置 |
TIMER_INI |
是否在实例启动时启用定时器线程 |
调整前先检查 CPU、锁等待、执行计划和磁盘 IO,再确认是否需要增加线程数量。
以下命令用于 Linux 环境,数据库查询在 disql 或管理工具中执行。
# 查看数据库、守护、集群和 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
先看进程名,再看启动参数中的配置文件路径,确认进程对应哪个实例或组件。
根据进程查询结果,将 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 执行情况检查。
使用具有相应查询权限的账号,在 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 查询当前数据库服务器进程信息;主机上的 dmwatcher、dmcss 等独立进程使用 ps 查看。
| 现象 | 优先检查 |
|---|---|
| 数据库服务启动失败 | dmserver 启动日志、dm.ini 路径、端口占用、文件权限 |
| 客户端连接失败 | 实例状态、监听端口、网络、防火墙及认证错误 |
| SQL 请求积压 | 会话工作线程、CPU、锁等待、执行计划及 IO 等待 |
| 事务提交慢 | 日志 FLUSH、日志盘 IO、归档和主备同步等待 |
| 备库数据落后 | 归档发送、日志接收、APPLY 重演状态和 MAL 网络 |
| 主备状态异常 | dmserver、dmwatcher、守护配置和通信状态 |
| 未发生预期的自动接管 | 确认监视器、守护状态、接管条件和配置 |
| DSC 节点无法加入 | dmcss、dmasmsvr、心跳、共享存储及 DCR 配置 |
| DEM 显示主机离线 | dmagent 状态、DEM 地址、代理端口和网络 |
按表中方向检查后,结合组件日志、数据库视图和操作系统资源情况确认原因。
文章
阅读量
获赞
