达梦数据库(DM8)采用的是单进程、多线程的架构。这意味着整个数据库实例只运行一个操作系统进程(DmServer),但内部包含许多功能不同的线程,它们分工协作,共同完成数据库的所有工作。
监听线程(dm_lsnr_thd)主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
DM服务器所有配置端口的范围为1024-65534。当客户端工具发起连接时,由操作系统为客户端工具自动分配一个端口用于与DM服务器进行通信。对于数据守护、DMDSC、MPP和DMTDD等分布式数据库中各实例节点之间的通信,发起连接的节点也由操作系统自动分配端口,所以配置主备/DSC/MPP/TDD时,除了各实例指定的端口外,发起连接的实例也会有操作系统自动分配的用于和其他实例进行通信的端口。
在数据库活动中,IO操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把IO操作从工作线程中分离出来则是明智的做法。IO线程的职责就是处理这些IO操作。通常情况下,DM Server需要进行IO操作的时机主要有以下三种:
需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
当检查点线程(dm_chkpnt_thd)生成检查点时,需要将所有脏数据页写入磁盘。
IO线程(dm_io_thd)在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。
dm_wrkgrp_thd:负责处理用户会话的所有实际操作,是执行SQL查询和事务的核心线程。
dm_tskwrk_thd:专门负责SQL的解析和执行等内部任务。
工作线程(dm_tskwrk_thd和dm_wrkgrp_thd)是DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。
调度线程(dm_sched_thd)用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作;
会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
必要时执行数据更新页刷盘;
唤醒等待的工作线程。
任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知日志刷新线程(dm_redolog_thd)进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散IO写入效率更高。日志刷新线程和IO线程分开,能获得更快的响应速度,保证整体的性能。DM8的日志刷新线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。
主要职责:
将日志缓冲区中的日志和数据缓冲区中的脏数据页全部写入磁盘,以保证当前日志所“保护”的数据页都已安全写入磁盘,这样日志文件即可被安全重用。
工作流程:
① 触发:当服务器启动和关闭时,系统都会产生检查点。服务器运行过程中,系统会自动判断是否需要执行检查点;当空闲日志空间不足时,系统自动产生一个检查点;系统调度线程也会定时产生检查点;还可以通过调用系统函数 CHECKPOINT 主动生成检查点。
② 刷脏页:检查点线程开始工作,将系统缓冲区中的一批“脏页”(Dirty Pages)写入磁盘上的数据文件。
③ 推进日志:当一个脏页被安全写入磁盘后,它对应的REDO日志就不再需要用于恢复。系统会推进一个名为CKPT_LSN(检查点日志序列号)的指针。这个指针之前的所有REDO日志,其占用的磁盘空间就可以被新日志覆盖重用了。
dm.ini相关参数:
CKPT_FLUSH_RATE:控制每次检查点刷新的脏页比例(如5%),避免单次刷盘过多影响性能。
CKPT_FLUSH_PAGES:规定了检查点每次刷新的最小脏页数。即使按比例计算出的页数小于该值,也会按此值执行,确保检查点能有效推进。
CKPT_WAIT_PAGES:控制检查点刷盘时单次I/O操作的最大页数。当需要刷新的总页数很多时,系统会分多批进行,每批写入不超过该值的页数,避免瞬间I/O压力过大。
备份使用:
在执行联机数据库备份过程中,如果报错归档不完整,则需要首先刷新检查点,才能正常备份。例如:select checkpoint(50);
文章
阅读量
获赞
