学习者:张源凯
目录
1、DM线程概括
DM服务器使用"对称服务器构架"的单进程,多线程结构。这里所指的线程即为操作系统的线程。线程分为多种类型,不同类型的线程完成不同的任务。DM数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。
DM进程中主要包括监听线程、IO线程、工作线程、调度线程、日志线程等,以下分别对它们进行介绍。
2、监听线程
监听线程主要任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。
DM服务器所有配置端口的范围为1024-65534。当客户端发起连接时,由操作系统为客户端工具自动分配一个端口用于与DM服务器进行通信。对于数据守护、DMDSC、DM MPP、和DMDPC等分布式数据库中各实例节点之间的通信,发起连接的节点也由操作系统自动分配端口,所以配置时,除了各实例指定的端口外,发起连接的实例也会有操作系统自动分配的用于与其它实例进行通信的端口。
3、工作线程
工作线程是DM服务器的核心线程,负责服务器各种类型任务的处理及所有实际的数据相关操作。工作线程包括任务工作线程和会话工作线程等。
任务工作线程复杂处理服务器内部生成并加入对应任务队列的各项任务。任务工作线程空闲时从任务队列依次摘取任务并进行处理,当任务队列中的任务堆积时,系统会增加任务工作线程数量以减少任务堆积。
会话工作线程负责处理会话的请求任务,分为非线程池模式和线程池模式。
非线程池模式是"一对一服务":每个会话都有自己专属的工作线程,从头到尾处理这个会话的所有任务,不用换"人",效率更高。
线程池模式是"共享团队服务":一开始有固定数量的工作线程,所有会话的请求先汇总到一个任务队列里,这些流程再轮流从队列里拿任务处理。
4、IO线程
当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把IO操作从工作线程中分离出来则是明智的做法。IO线程的职责就是处理这些IO操作。
DM Server需要进行IO操作的时机主要有以下三种:
- 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
- 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
- 检查点到来时,需要将所有脏数据页写入磁盘。
5、调度线程
- 调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,主要有:
- 检查系统级的时间触发器,如果满足触发条件则生成任务加到任务工作线程的任务队列由任务工作线程执行;
- 清理SQL缓存,计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
- 执行动态缓冲区检查;
- 自动执行检查点;
- 会话超时检测;
- 必要时执行数据更新页刷盘;
- 唤醒等待的工作线程。7、
6、日志FLUSH线程
任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知FLUSH线程进行日志刷盘。
7、日志归档线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。
将日志FLUSH线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离FLUSH线程来做,如果放在FLUSH线程中一起做会严重影响系统性能。
8、日志APPLY线程
在配置了数据守护的系统中,创建了一个日志APPLY线程。当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。
在数据库的各种活动中,用户常常需要数据库完成在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。
DM server需要进行定时操作的事件主要有以下几种:
- 逻辑日志异步归档;
- 异步归档日志发送;
- 作业调度。
9、MAL系统相关线程
MAL系统是DM内部高速通信系统,基于TCP/IP协议实现。服务器的很多功能都是通过MAL系统实现通信的,例如数据守护、MPP、远程日志归档等。MAL系统内部包含一系列线程,有MAL监听线程,MAL发送工作线程、MAL接收工作线程等。
10、线程信息的查看
V$THREADS:记录当前系统中活动线程的信息
V$PROCESS:记录服务器进程信息