1 DM 线程说明
在Oracle 数据库中,有很多的进程,每个进程负责不同的功能。 而DM 数据库使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。
[root@dm1 dm]# ps -ef|grep dmserver
dmdba 21285 1 0 18:02 ? 00:00:04 /dm/dmdbms/bin/dmserver /dm/dmdbms/data/cndba/dm.ini -noconsole
root 21638 21435 0 23:52 pts/1 00:00:00 grep dmserver
[root@dm1 dm]#
服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。
DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等,可以通过DM 的动态性能视图查看线程的相关信息。主要 相关的线程有如下4个:
V$LATCHES 记录当前正在等待的线程信息
V$THREADS 记录当前系统中活动线程的信息
V$WTHRD_HISTORY 记录自系统启动以来,所有活动过线程的相关历史信息。
V$PROCESS 记录服务器进程信息
[dave@www.cndba.cn ~]$ disql SYSDBA/SYSDBA
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time: 8.169(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT
Connected to: DM 7.1.6.95
#查看当前进程:这里看到只有一个进程
SQL> select * from v$process;
LINEID PID PNAME TRACE_NAME TYPE$
---------- ----------- -------- ---------- -----------
1 21285 dmserver 1
used time: 1.282(ms). Execute id is 99.
SQL>
#线程比较多,v$threads 视图会记录线程启动,已经对线程的功能描述:
SQL> select distinct name,count(1) from v$threads group by name order by 2 desc;
LINEID NAME COUNT(1)
---------- -------------- --------------------
1 dm_tskwrk_thd 16
2 dm_wrkgrp_thd 16
3 dm_hio_thd 4
4 dm_io_thd 4
5 dm_rsyswrk_thd 3
6 dm_sql_thd 2
7 dm_purge_thd 1
8 dm_sqllog_thd 1
9 dm_chkpnt_thd 1
10 dm_trctsk_thd 1
11 dm_audit_thd 1
12 dm_sched_thd 1
13 dm_lsnr_thd 1
14 dm_rapply_thd 1
15 dm_redolog_thd 1
16 dm_qwatch_thd 1
16 rows got
used time: 2.590(ms). Execute id is 104.
SQL> select DISTINCT name, thread_desc from v$threads;
LINEID NAME THREAD_DESC
---------- -------------- -------------------------------------------------------------------------------------
1 dm_qwatch_thd Thread for monitoring the exit/quit/ctrl-c signal in posix
2 dm_io_thd IO thread
3 dm_chkpnt_thd Flush checkpoint thread
4 dm_redolog_thd Redo log thread,used to flush log
5 dm_rapply_thd Log apply thread which receive redo-logs from primary site by standby site
6 dm_sqllog_thd Thread for writing dmsql dmserver
7 dm_purge_thd Purge thread
8 dm_hio_thd IO thread for HFS to read data pages
9 dm_tskwrk_thd Task Worker Thread for SQL parsing and execution for sevrer itself
10 dm_trctsk_thd Thread for writing trace information
11 dm_wrkgrp_thd User working thread
12 dm_audit_thd Thread for flush audit logs
13 dm_sched_thd Server scheduling thread,used to trigger background checkpoint, time-related triggers
14 dm_lsnr_thd Service listener thread
15 dm_rsyswrk_thd Asynchronous archiving thread
16 dm_sql_thd User session thread
16 rows got
#查看当前正在等待的线程信息
SQL> select * from V$LATCHES;
no rows
used time: 0.527(ms). Execute id is 112.
SQL>
#查看自系统启动以来,所有活动过线程的相关历史信息。
SQL> select * from V$WTHRD_HISTORY;
no rows
used time: 0.736(ms). Execute id is 114.
SQL>
从v$threads 的查询结果可能,这里的环境共有16个线程,因为只是单机环境,线程也不全,我们这里看主要的几个线程。其他线程如回滚段清理 PURGE 线程、审计写文件线程、重演捕获写文件线程等不在描述。
2 监听线程
监听线程名是dm_lsnr_thd, 监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。
它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
3 工作线程
工作线程有2个:dm_tskwrk_thd和 dm_wrkgrp_thd, 他们数量是对应关系。DM7中这2个线程各16个。
工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
DM7 的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。
当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。
在dm.ini 文件中,与线程有关的参数如下:
#thread
WORKER_THREADS = 16 #Number Of Worker Threads
TASK_THREADS = 16 #Number Of Task Threads
UTHR_FLAG = 0 #User Thread Flag
FAST_RW_LOCK = 1 #Fast Read Write Lock flag
SPIN_TIME = 4000 #Spin Time For Threads In Microseconds
WORK_THRD_STACK_SIZE = 1024 #Worker Thread Stack Size In Kilobytes
WORKER_CPU_PERCENT = 0 #Percent of CPU number special for worker thread
C_STYLE_NESTED_COMMENT = 0 #flag for C stype nested comment
4 IO 线程
IO相关的线程有2个:dm_io_thd和dm_hio_thd,当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把 IO 操作从工作线程中分离出来则是明智的做法。IO 线程的职责就是处理这些 IO 操作。
通常情况下,DM Server 需要进行 IO 操作的时机主要有以下三种:
- 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
- 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
- 检查点到来时,需要将所有脏数据页写入磁盘。
IO 线程在启动后,通常都处于睡眠状态,当系统需要进行 IO 时,只需要发出一个 IO请求,此时 IO 线程被唤醒以处理该请求,在完成该 IO 操作后继续进入睡眠状态。
IO 线程处理 IO 的策略根据操作系统平台的不同会有很大差别,一般情况下,IO 线程使用异步的 IO 将数据页写入磁盘,此时,系统将所有的 IO 请求直接递交给操作系统,操作系统在完成这些请求后才通知 IO 线程,这种异步 IO 的方式使得 IO 线程需要直接处理的任务很简单,即完成 IO 后的一些收尾处理并发出 IO 完成通知,如果操作系统不支持异步 IO,此时 IO 线程就需要完成实际的 IO 操作。
在dm.ini 中,与IO有关的参数如下:
#IO
DIRECT_IO = 0 #Flag For Io Mode(Non-Windows Only), 0: Using File System Cache;
1: Without Using File System Cache
IO_THR_GROUPS = 2 #The Number Of Io Thread Groups(Non-Windows Only)
HIO_THR_GROUPS = 2 #The Number Of Huge Io Thread Groups(Non-Windows Only)
FAST_EXTEND_WITH_DS = 1 #How To Extend File's Size (Non-Windows Only), 0: Extend File With Hole; 1: Extend File With Disk Space
5 调度线程
线程名:dm_sched_thd, 调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
- 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
- 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
- 检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
- 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
- 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI参数设置的自动检查点执行间隔定期执行检查点操作;
- 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
- 必要时执行数据更新页刷盘;
- 唤醒等待的工作线程。
#checkpoint
CKPT_RLOG_SIZE = 100 #Checkpoint Rlog Size, 0: Ingore; else: Generate With Redo Log Size
CKPT_DIRTY_PAGES = 10000 #Checkpoint Dirty Pages, 0: Ingore; else: Generate With Dirty Pages
CKPT_INTERVAL = 300 #Checkpoint Interval In Seconds
CKPT_FLUSH_RATE = 5.00 #Checkpoint Flush Rate(0.0-100.0)
CKPT_FLUSH_PAGES = 1000 #Minimum number of flushed pages for checkpoints
CKPT_WAIT_PAGES = 128 #Maximum number of pages flushed for checkpoints
FORCE_FLUSH_PAGES = 8 #number of periodic flushed pages
6 日志 FLUSH 线程
线程名:dm_redolog_thd,任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的 REDO 日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散 IO 写入效率更高。日志 FLUSH 线程和 IO 线程分开,能获得更快的响应速度,保证整体的性能。DM7 的日志 FLUSH 线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了 IO 次数,进一步提高了性能。
如果系统配置了实时归档,在 FLUSH 线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。
#redo log
RLOG_BUF_SIZE = 512 #The Number Of Log Pages In One Log Buffer
RLOG_POOL_SIZE = 128 #Redo Log Pool Size In Megabyte
RLOG_PARALLEL_ENABLE = 0 #Whether to enable database to write redo logs in parallel mode
RLOG_APPEND_LOGIC = 0 #Whether to write logic records in redo logs
RLOG_APPEND_SYSTAB_LOGIC = 0 #Whether to write logic records of system tables in redo logs when RLOG_APPEND
_LOGIC is set as 1
RLOG_RESERVE_SIZE = 40960 #Number of reserved redo log pages for each operation
RLOG_CHECK_SPACE = 1 #Whether to check that the available space in redo logs is enough
RLOG_SAFE_SPACE = 128 #Free redo log size in megabytes that can be considered as a save value
RLOG_SAFE_PERCENT = 25 #Percent value of free redo log space that can be considered as a save value
RLOG_SEND_APPLY_MON = 64 #Monitor recently send or apply rlog_buf info
REDO_PRE_LOAD = 128 #Redo pre load size(M)
REDO_PWR_OPT = 1 #Whether to enable PWR optimization when system restarted after failure
REDO_IGNORE_DB_VERSION = 0 #Whether to check database version while database is redoing logs
ELOG_REPORT_LINK_SQL = 0 #Whether to write the SQLs that sent to remote database by DBLINKs into error
log file
REDOS_BUF_SIZE = 1024 #The max buffer size of rlog redo for standby In Megabyte
REDOS_MAX_DELAY = 1800 #The permitted max delay for one rlog buf redo on standby In Second
REDOS_BUF_NUM = 4096 #The max apply rlog buffer num of standby
REDOS_PRE_LOAD = 32 #Number of pre-load apply rlog buffer for standby
7 日志归档线程
线程名:dm_rsyswrk_thd, 日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。
将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线程中一起做会严重影响系统性能。
8 日志 APPLY 线程
在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。
9 定时器线程
在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。
通常情况下,DM Server 需要进行定时操作的事件主要有以下几种:
- 逻辑日志异步归档;
- 异步归档日志发送(只有在 PRIMARY 模式下,且是 OPEN 状态下);
- 作业调度。
定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务,如逻辑日志异步归档等。
默认情况下,达梦服务器启动的时候,定时器线程是不启动的。用户可以设置 dm.ini中的 TIMER_INI 参数为 1 来设置定时器线程在系统启动时启动。
相关参数可以参考dmtimer_example.ini文件。
10 逻辑日志归档线程
逻辑日志归档用于 DM7 的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。
10.1. 本地逻辑日志归档线程
本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。
10.2. 远程逻辑日志归档线程
远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。任务的类型包括同步发送和异步发送。
11 MAL 系统相关线程
MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
MAL 的配置可以参考dmmal_example.ini 文件。
版权声明:本文为博主原创文章,未经博主允许不得转载。






