DM 服务器使用“对称服务器构架” 的单进程、多线程结构。这种对称服务器构架在有
效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统
的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,
不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和
处理,以完成客户提交的各种任务。 DM 数据库服务器是共享的服务器,允许多个用户
连接到同一个服务器上,服务器进程称为共享服务器进程。 DM 进程中主要包括监听线
程、 IO 线程、工作线程、调度线程、日志线程等
监听线程
任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成
一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。
- 查看监听线程
SQL> select * from SYS."V$THREADS" WHERE NAME = 'dm_lsnr_thd';
[dmdba@dm1 ~]$ ps -ef|grep dms|grep -v grep
[dmdba@dm1 ~]$ ps -T -p 1096 |grep dm_lsnr_thd
- 修改监听端口
监听线程只有一个,监听端口范围为 1024 - 65534;默认端口为 5236, 此参数为静态参数修改
后,需重启数据库。[root@dm1 bin]# cat -n /dmdata/czw/dm.ini |grep -i port_num
工作线程
工作线程是 DM 服务器的核心线程, 它从任务队列中取出任务, 并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
DM8 的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,
以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话
上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会
话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,
加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。
- 查看工作线程
SQL> select * from SYS."V$THREADS" WHERE NAME = 'dm_wrkgrp_thd';
[dmdba@dm1 ~]$ ps -ef|grep dms|grep -v grep
[dmdba@dm1 ~]$ ps -T -p 6828 |grep dm_wrkgrp_thd
[dmdba@dm1 ~]$ ps -T -p 6828 |grep dm_wrkgrp_thd | wc -l
- 配置工作线程数
[root@dm1 bin]# cat -n /dmdata/czw/dm.ini |grep -i TASK_THREADS
[root@dm1 bin]# cat -n /dmdata/czw/dm.ini |grep -i worker_threads
修改为24,重启数据库
查看工作线程数,已经变成了24个
还有一个任务线程dm_tskwrk_thd, 主要负责完成服务端SQL的解析运行等任务,一般配置为与工作线程相等
IO 线程
在数据库活动中, IO 操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲
区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而
把 IO 操作从工作线程中分离出来则是明智的做法。 IO 线程的职责就是处理这些 IO 操作。
通常情况下, DM Server 需要进行 IO 操作的时机主要有以下三种:
1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
3. 检查点到来时,需要将所有脏数据页写入磁盘。
IO 线程在启动后,通常都处于睡眠状态,当系统需要进行 IO 时, 只需要发出一个 IO 请
求, 此时 IO 线程被唤醒以处理该请求,在完成该 IO 操作后继续进入睡眠状态。
- 查看IO线程
SQL> select * from SYS."V$THREADS" WHERE NAME = 'dm_io_thd';
IO 线程数为 16
- 查看IO线程配置
[root@dm1 bin]# cat -n /dmdata/czw/dm.ini |grep -i IO_THR_GROUPS
- 修改IO线程参数
修改IO_THR_GROUPS为4后,线程数为8
日志 FLUSH 线程
类似于 Oracle 中的劳模进程 LGWR,将日志缓冲区中的 buffer 写到在线重做日志。
flush 刷盘条件有 5 种:
1. 事务提交 commit
2. 检查点
3. 每 3 秒
4. 缓冲区没有剩余空间时
5. 数据库关闭时
如果系统配置了实时归档,在 FLUSH 线程日志刷盘前,会直接将日志通过网络发送到
实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。
日志归档线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由
日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取
出任务, 按照归档类型做相应归档处理
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由
日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取
出任务, 按照归档类型做相应归档处理。
将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远
程实时归档外,本地归档、 远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线
程中一起做会严重影响系统性能。
还有一些其他线程,如 dm_chkpnt_thd 即检查点线程; purge 线程,则主要是负责回滚段
的清理, 审计线程等等。
达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台