达梦数据库采用的单进程多线程的方式。
我们先不介绍到底有哪些线程?他们具体分别是做什么用的?我们先看下实际的情况:
1、查看它的后台进程
ps aux |grep dmserver dmdba 6569 3.0 41.9 4634008 417692 ? Sl 10:56 0:01 /home/dmdba/dmdbms/bin/dmserver path=/home/dmdba/dmdata/DAMENG/dm.ini -noconsole
2、获取到对应的线程(注意看上面的进程号)
ps -T -p 6569 | awk '{ print $5}' | uniq | sort CMD dm_audit_thd dm_chkpnt_thd dm_hio_thd dm_lpq_thd dm_lsnr_thd dm_osio_thd dm_pthd_thd dm_purge_thd dm_pwr_thd dm_quit_thd dm_redolog_thd dm_rsyswrk_thd dm_sched_thd dmserver dmserver dm_sql_aux_thd dm_sqllog_thd dm_sqllog_thd dm_trctsk_thd dm_trxbro_thd dm_tskwrk_thd dm_wrkgrp_thd nlgn_task_threa
上面是我学习环境中,部署的单机。在我去重后,所有的线程数。大家看起来是不是很多,其实不用慌。现在回到正题,待学习完后,就会有基本的了解。
从手册中得知,DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等。
监听通俗理解,就是数据库启动后,启动的监听端口。给外面连接数据库使用时的端口。所以在启动时,它是最后,但是关闭前,它是最前。
在数据库活动中,IO 操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把 IO 操作从工作线程中分离出来则是明智的做法。IO 线程的职责就是处理这些 IO 操作。
通常情况下,DM Server 需要进行 IO 操作的时机主要有以下三种:
1、需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
2、缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
3、检查点到来时,需要将所有脏数据页写入磁盘。
工作线程是 DM 服务器的核心线程,负责服务器各种类型任务的处理及所有实际的数据相关操作。工作线程包括任务工作线程和会话工作线程等。
任务工作线程负责处理服务器内部生成并加入对应任务队列的各项任务,如调度线程生成的清理缓存任务、异步执行的任务等,其初始个数由 INI 参数 TASK_THREADS 指定。任务工作线程空闲时从任务队列依次摘取任务并进行处理,当任务队列中的任务堆积时,系统会增加任务工作线程数量以减少任务堆积。
会话工作线程负责处理会话的请求任务,分为非线程池模式和线程池模式,由 INI 参数 STHD_FLAG 控制。非线程池模式下每一个会话对应一个会话工作线程,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。线程池模式初始工作线程个数由 INI 参数 WORKER_THREADS*STHD_THREAD_NUM 指定,由会话轮询线程接收所有用户请求,加入会话任务队列,会话工作线程从会话任务队列依次摘取请求任务进行处理。
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
1、检查系统级的时间触发器,如果满足触发条件则生成任务加到任务工作线程的任务队列由任务工作线程执行;
2、清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
3、执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
4、自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
5、会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
6、必要时执行数据更新页刷盘;
7、唤醒等待的工作线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理
任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO 日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的 REDO 日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘。
在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。
MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
回到我们开头查询的线程,就会发现DM 数据库系统中还不止以上这些线程,在一些特定的功能中会有不同的线程,例如回滚段清理 PURGE 线程、审计写文件线程等。
VTHREADS(记录当前系统中活动线程的信息) 和 VPROCESS(记录服务器进程信息)
通过简单的了解,想必大家对前面的那么多线程,回过头来看,已经不慌了吧。很轻松就可以区分并认识它们。
以上内容为个人对达梦学习的初步认知,受限于视角与经验,不足之处恳请指正
文章
阅读量
获赞
