当前位置: 首页 > news >正文

【赵渝强老师】达梦数据库的线程结构

在这里插入图片描述

达梦数据库服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。执行下面的语句将查看当前达梦数据库中的线程信息。

SQL> select distinct name ,thread_desc from v$threads;

# 输出的信息如下:
行号 	NAME           	THREAD_DESC                                                                          
--- -------------- -------------------------------------------
1    dm_sql_thd     	User session thread
2    dm_sqllog_thd  	Thread for writing dmsql dmserver
3    dm_quit_thd    	Thread for executing shutdown-normal operation
4    dm_io_thd      	IO thread
5    dm_chkpnt_thd  	Flush checkpoint thread
6    dm_redolog_thd 	Redo log thread, used to flush log
7    dm_hio_thd     	IO thread for HFS to read data pages
8    dm_tskwrk_thd  	Task Worker Thread for SQL parsing and execution for sevrer itself
9    dm_purge_thd   	Purge thread
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

14 rows got

达梦数据库中主要包括监听线程、IO线程、工作线程、调度线程、日志线程等,以下分别对它们进行介绍。

视频讲解如下

【赵渝强老师】达梦数据库的线程结构

一、 监听线程

监听线程(dm_lsnr_thd)主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
DM服务器所有配置端口的范围为1024-65534。当客户端工具发起连接时,由操作系统为客户端工具自动分配一个端口用于与DM服务器进行通信。对于数据守护、DMDSC、MPP和DMTDD等分布式数据库中各实例节点之间的通信,发起连接的节点也由操作系统自动分配端口,所以配置主备/DSC/MPP/TDD时,除了各实例指定的端口外,发起连接的实例也会有操作系统自动分配的用于和其他实例进行通信的端口。

二、 I/O线程

在数据库活动中,IO操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把IO操作从工作线程中分离出来则是明智的做法。IO线程的职责就是处理这些IO操作。通常情况下,DM Server需要进行IO操作的时机主要有以下三种:

  1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
  2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
  3. 当检查点线程(dm_chkpnt_thd)生成检查点时,需要将所有脏数据页写入磁盘。

IO线程(dm_io_thd)在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。

《达梦数据库从零开始》

三、 工作线程

工作线程(dm_tskwrk_thd和dm_wrkgrp_thd)是DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。

DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。

四、 调度线程

调度线程(dm_sched_thd)用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:

  1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
  2. 清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
  3. 检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
  4. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
  5. 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作;
  6. 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
  7. 必要时执行数据更新页刷盘;
  8. 唤醒等待的工作线程。

五、 日志刷新线程

任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知日志刷新线程(dm_redolog_thd)进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散IO写入效率更高。日志刷新线程和IO线程分开,能获得更快的响应速度,保证整体的性能。DM8的日志刷新线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。

《达梦数据库从零开始》

相关文章:

  • 若依——基于AI+若依框架的实战项目(原理篇)
  • 23种设计模式-装饰器(Decorator)设计模式
  • C++类与对象-3.23笔记
  • 【Java】Springboot集成itextpdf制作pdf(内附pdf添加表格、背景图、水印,条形码、二维码,页码等功能)
  • 牛客春招刷题训练营 3月25日 Java 查找两个字符串a,b中的最长公共子串 构造C的歪
  • 基于docker-compose 部署可道云资源管理器
  • 系留无人机照明芯片迎来革新:80V耐压输入+FP7195千瓦级大功率调光IC方案落地
  • GitLab 中文版17.10正式发布,27项重点功能解读【三】
  • html方法收集
  • Java 集合操作详解与使用指南
  • UE4学习笔记 FPS游戏制作14 发射抛物线子弹
  • 多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题
  • 第四届能源、电力与电气国际学术会议(ICEPET 2025)
  • 后缀表达式 | 第十届蓝桥杯省赛C++B组
  • 如何使用Xshell连接Linux虚拟机
  • K8S学习之基础五十:k8s中pod时区问题并通过kibana查看日志
  • android Firebase Cloud Messaging (FCM) 接入
  • # 用 Paramiko,轻松掌控远程服务器
  • 0基础 | 制作麦克风音频放大电路
  • 使用redis设置店铺状态
  • 法国参议院调查委员会公布雀巢“巴黎水”丑闻调查报告
  • 照护者说|胡泳:向死而在,爱这个世界
  • 新冠阳性率升高,专家:新冠变异株致病力没太多变化
  • 优质文化资源下基层,上海各区优秀群文团队“文化走亲”
  • 全球前瞻|特朗普19日将与俄乌总统分别通话,英国脱欧后首开英欧峰会
  • 体育文化赋能国际交流,上海黄浦举办国际友人城市定向赛