目录标题
- 达梦数据库(DM)线程管理笔记
- 一、DM 线程架构概述
- 二、DM 主要线程类型及功能
- (一)监听线程
- (二)工作线程
- (三)IO 线程
- (四)调度线程
- (五)日志 FLUSH 线程
- (六)日志归档线程
- (七)日志 APPLY 线程
- (八)定时器线程
- (九)MAL 系统相关线程
- (十)其他线程
- 三、线程信息查看
- 附录:线程&进程
- 使用`ps`命令查看线程
- 1. **显示所有线程**
- 2. **显示所有线程的详细信息**
- 3. **查看所有进程的线程**
- 使用`top`命令查看线程
- 使用`htop`命令查看线程
- 使用`pthread`库的线程
- 总结
达梦数据库(DM)线程管理笔记
一、DM 线程架构概述
- 架构类型:DM 服务器采用“对称服务器构架”的单进程、多线程结构。
- 优势:有效利用系统资源,提供较高可伸缩性。
- 线程定义:线程即操作系统线程,通过同步机制对数据结构并发访问处理,完成客户任务。
- 服务器进程:共享服务器进程,允许多个用户连接。
二、DM 主要线程类型及功能
(一)监听线程
dm_lsnr_thd:Service listener thread
- 核心任务:在服务器端口循环监听,接收客户端连接请求。
- 工作流程:被唤醒后生成会话申请任务,加入工作线程任务队列。
- 启动与关闭:系统启动后启动,关闭时首先被关闭。
- 优先级:比普通线程优先级高,保证响应时间短。
- 端口说明:配置端口范围 1024-65534,客户端工具及分布式数据库中各实例节点间通信端口由操作系统自动分配。
(二)工作线程
dm_wrkgrp_thd :User working thread
dm_tskwrk_thd:Task Worker Thread for SQL parsing and execution for sevrer itself
dm_lpq_thd: Local parallel working thread
- 功能定位:核心线程,处理服务器各种任务及数据操作。
- 分类:
- 任务工作线程:处理内部生成任务,初始个数由 INI 参数 TASK_THREADS 指定,任务堆积时自动增加数量。
- 会话工作线程:处理会话请求任务,分为非线程池模式(每会话对应一线程,减少切换代价)和线程池模式(由会话轮询线程接收请求,工作线程从任务队列处理,初始数量由 WORKER_THREADS * STHD_THREAD_NUM 指定)。
(三)IO 线程
dm_hio_thd: IO thread for HFS to read data pages
dm_io_thd: IO thread
- 职责:处理数据库活动中的 IO 操作,避免工作线程直接读写数据页导致性能下降。
- IO 触发时机:
- 数据页不在缓冲区,需读入缓冲区。
- 缓冲区满或系统关闭,脏数据页写入磁盘。
- 检查点到来,所有脏数据页写入磁盘。
- 工作状态:启动后通常睡眠,有 IO 请求时被唤醒处理,完成后继续睡眠。
- 配置:个数可配置,通过 dm.ini 文件的 IO_THR_GROUPS 参数设置,默认 2 个。
- IO 策略:根据操作系统平台不同有差异,一般使用异步 IO 写入磁盘,操作系统完成请求后通知 IO 线程,简化 IO 线程任务。
(四)调度线程
dm_sched_thd: Server scheduling thread,used to trigger background checkpoint, time-related triggers
- 功能:接管系统中所有定时调度任务,每秒轮询一次。
- 负责任务:
- 检查并触发系统级时间触发器生成任务。
- 清理 SQL 缓存、计划缓存中失效项或淘汰不常用项。
- 执行动态缓冲区检查,根据需要动态调整系统缓冲池。
- 自动执行检查点,保证日志及时刷盘,减少故障恢复时间。
- 会话超时检测,超时自动断开连接。
- 必要时执行数据更新页刷盘。
- 唤醒等待的工作线程。
(五)日志 FLUSH 线程
dm_redolog_thd: Redo log thread, used to flush log
- 作用:处理数据库修改产生的 REDO 日志刷盘,保证数据故障恢复一致性。
- 工作流程:事务运行时 REDO 日志保留在日志缓冲区,事务提交或检查点执行时通知 FLUSH 线程刷盘。
- 性能优化:日志顺序写入效率高,DM8 进一步优化,刷盘前合并不同缓冲区日志,减少 IO 次数。
- 归档相关:实时归档时,日志通过网络发送到实时备库;本地归档时,生成归档任务由日志归档线程完成。
(六)日志归档线程
dm_rsyswrk_thd: Asynchronous archiving thread
- 功能:包含异步归档线程,负责远程异步归档任务。
- 任务处理:非实时归档时,日志 FLUSH 线程产生的任务加入该线程任务队列,按归档类型处理。
- 分离目的:与日志 FLUSH 线程分开,避免影响系统性能,除远程实时归档外,本地归档、远程异步归档可脱离 FLUSH 线程。
(七)日志 APPLY 线程
- 应用场景:配置数据守护的系统中存在。
- 工作方式:服务器作为备库时,接收主库物理 REDO 日志生成 APPLY 任务,APPLY 线程从队列取出任务在备库重做日志,保持与主库数据同步一致,备库数据对用户只读,可承担报表、查询任务,均衡主库负载。
(八)定时器线程
- 设计目的:满足用户在特定时间点或时间段内进行操作的需求,如备份、作业调度等。
- 工作原理:启动后每秒检测定时器链表,查看定时器是否满足触发条件,满足则执行相应任务。
- 启动配置:默认不启动,可通过设置 dm.ini 文件的 TIMER_INI 参数为 1,在系统启动时启动。
(九)MAL 系统相关线程
dm_mal_lsnr_thd: Mail listening thread
dm_mal_mgr_thd: Thread for checking mail system or pre-commited transactions in MPP
dm_mal_recv_thd: Thread for receiving Mail
- 系统介绍:MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现,很多重要功能通过该系统通信,如数据守护、MPP、远程日志归档等。
- 线程组成:包含 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
(十)其他线程
- 说明:DM 数据库系统中还存在其他线程,如回滚段清理 PURGE 线程、审计写文件线程等,用于特定功能,此处未详细列出。
三、线程信息查看
- 动态性能视图:DM 提供 V L A T C H E S 、 V LATCHES、V LATCHES、VTHREADS、V$PROCESS 等动态性能视图,用户可通过它们直观了解当前系统中工作线程及相关信息。
- 详细定义:视图详细定义可参考本手册附录 2“动态性能视图”。
参考资料:管理 DM 线程
ps -L -p 223 | awk 'NR > 1 { print $5 }' | sort | uniq -c | sort
ps -L -p 223 | awk 'NR > 1 { count++ } END { print "Total threads: " count }'
SELECT * FROM V$PROCESS;
SELECT * FROM V$THREADS;
SELECT DISTINCT name, THREAD_DESC FROM V$THREADS ORDER BY name ASC;
dm_audit_thd Thread for flush audit logs
dm_chkpnt_thd Flush checkpoint thread
dm_dpc_pthd Worker thread for DPC
dm_dw_bro_thd Thread for brocasting instance information
dm_hio_thd IO thread for HFS to read data pages
dm_io_thd IO thread
dm_lpq_thd Local parallel working thread
dm_lsnr_thd Service listener thread
dm_mal_lsnr_thd Mail listening thread
dm_mal_mgr_thd Thread for checking mail system or pre-commited transactions in MPP
dm_mal_recv_thd Thread for receiving Mail
dm_mal_tsk_thd Mail working thread
dm_purge_thd Purge thread
dm_quit_thd Thread for executing shutdown-normal operation
dm_redolog_thd Redo log thread, used to flush log
dm_rsyswrk_thd Asynchronous archiving thread
dm_sched_thd Server scheduling thread,used to trigger background checkpoint, time-related triggers
dm_sql_aux_thd User session auxiliary thread
dm_sql_thd User session thread
dm_sqllog_thd Thread for writing dmsql dmserver
dm_trctsk_thd Thread for writing trace information
dm_tskwrk_thd Task Worker Thread for SQL parsing and execution for sevrer itself
dm_utsklsnr_thd Thread for listening net
dm_wrkgrp_thd User working thread
附录:线程&进程
使用ps
命令查看线程
1. 显示所有线程
要查看某个进程的所有线程,可以使用ps
命令的-L
选项。例如:
ps -L -p <进程ID>
-L
:显示线程信息。-p <进程ID>
:指定要查看的进程ID。
示例:
假设你想查看进程ID为1234的所有线程,可以运行:
ps -L -p 1234
输出示例:
PID LWP TTY TIME CMD
1234 1234 pts/0 00:00:00 myapp
1234 1235 pts/0 00:00:00 myapp
1234 1236 pts/0 00:00:00 myapp
- PID:进程ID。
- LWP:线程ID(Light Weight Process)。
- TTY:终端设备。
- TIME:累计CPU时间。
- CMD:命令名称。
2. 显示所有线程的详细信息
如果你想查看更详细的线程信息,可以结合ps
的其他选项。例如,使用-o
选项可以指定要显示的字段:
ps -L -p <进程ID> -o pid,lwp,tid,comm,psr
-o
:指定要显示的字段。pid
:进程ID。lwp
:线程ID。tid
:线程ID(与lwp
相同)。comm
:命令名称。psr
:线程当前运行的CPU编号。
示例:
ps -L -p 1234 -o pid,lwp,tid,comm,psr
输出示例:
PID LWP TID COMMAND PSR
1234 1234 1234 myapp 0
1234 1235 1235 myapp 1
1234 1236 1236 myapp 0
3. 查看所有进程的线程
如果你想查看系统中所有进程的线程,可以省略-p
选项:
ps -L -o pid,lwp,tid,comm,psr
这将列出系统中所有线程的详细信息。
使用top
命令查看线程
top
命令也可以用来查看线程信息。通过按H
键,top
会切换到线程视图,显示每个线程的详细信息。
示例:
- 启动
top
命令:top
- 按
H
键切换到线程视图。
使用htop
命令查看线程
htop
是一个更友好的进程查看工具,它默认显示线程信息。你可以通过以下命令安装htop
(如果尚未安装):
sudo apt-get install htop # Debian/Ubuntu
sudo yum install htop # CentOS
启动htop
后,你可以直接看到每个进程的线程信息。
使用pthread
库的线程
如果你在编写C/C++程序并使用pthread
库创建线程,可以通过pthread_self()
函数获取当前线程的ID,并通过pthread_getattr_np()
函数获取线程的详细属性。
总结
- 使用
ps -L
可以查看指定进程的所有线程。 - 使用
ps -L -o
可以指定要显示的字段,获取更详细的线程信息。 - 使用
top
或htop
可以动态查看线程的运行状态。
希望这些信息对你有帮助!