达梦线程学习

mac2025-10-18  7

达梦线程学习,全部参照官方文档。

DM服务器使用“对称服务器架构”的单进程、多线程结构。线程即操作系统线程,服务器在运行过程中由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务,通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。DM进程中主要包括:监听线程、IO线程、工作线程、调度线程、日志线程等。监听线程的主要任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。监听线程在系统启动完成后才启动,并在系统关闭时首先被关闭。为保证在处理大量客户链接时具有较短的响应时间,监听线程比普通线程优先级更高。(会话处于CREATE状态和这个有没有关系?是不是加入了任务队列但还没有被工作线程处理的?但是有些CREATE状态的会话能看到SQL_TEXT信息啊)工作线程是DM服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。DM8的初始工作线程个数由ini参数指定(WORKER_THREADS?)随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有的请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会话连接超过预设的阈值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户的请求,加入任务队列,等待工作线程一旦空闲,从任务队列一次摘取请求任务处理。(上面说的初始工作线程数和预设阈值到底是通过哪个参数控制的?WORKER_THREADS和MAX_SESSIONS?但是查询V$THREADS时,看到dm_wrkgrp_thd一直都只有WORKER_THREADS设置的大小,不管是系统刚启动无连接还是链接数已经超过了WORKER_THREADS。)在数据库活动中,IO操作历来都是最为耗时的操作之一,当事务需要的数据页不在缓冲区中时,若在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把IO操作从工作线程中分离出来则是明智的做法,IO线程的职责就是处理这些IO操作。IO线程在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。IO线程的个数可通过ini参数IO_THR_GROUPS来配置。IO线程处理IO的策略根据操作系统平台的不同会有很大差异,一般情况下,IO线程使用异步的IO将数据页写入磁盘,此时系统将所有的IO请求直接递交给操作系统,操作系统在完成这些请求后才通知IO线程,这种异步IO的方式使得IO线程需要直接处理的任务很简单,即完成IO后的一些收尾处理并发出IO完成通知,若操作系统不支持异步IO,此时IO线程就需要完成实际的IO操作。调度线程用于接管接管系统中所有需要定时调度的任务,调度线程每秒钟轮询一次。任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或执行检查点时,会通知FLUSH线程进行日志刷盘。若系统配置了实时归档,在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库;若配置了本地归档,则生成归档任务,通过日志归档线程完成;日志归档线程包含异步归档线程,负责远程异步归档任务,若配置了非实时归档,由日志FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应的处理。在配置了数据守护的系统中,创建了一个日志APPLY线程。当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致。在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份。定时器线程就是为这种需求而设计的。逻辑日志归档用于DM8的数据复制中,包含本地逻辑日志归档线程和远程逻辑逻辑日志归档线程。MAL系统是DM内部告诉通信系统,基于tcp/ip协议,服务器的很多重要功能都是通过MAL系统实现通信的,如:数据守护、数据复制、MPP、远程日志归档等。MAL系统内部包含一系列线程,有MAL监听线程、MAL发送工作线程、MAL接收工作线程等。DM数据库中还包含一些其它线程,如:回滚段清理PURGE线程、审计写文件线程、重演捕获写文件线程等。可以通过以下动态性能视图查看系统中线程相关信息:V$LATCHES(记录当前正在等待的线程信息)、V$THREADS(记录当前系统中活动线程的信息)、V$WTHRD_HISTORY(记录自系统启动以来,所有活动过线程的相关历史信息)、V$PROCESS(记录服务器进程信息)。

不是很懂工作线程,它到底做什么工作,感觉很多工作都有专门的线程做了呀。

最新回复(0)