达梦数据库之线程

达梦数据库使用的是单进程、多线程结构。DM实例由内存结构和一系列的线程组成,这些线程分别处理不同的任务。

达梦数据库的数据库线程主要包括监听线程、I/O线程、工作线程、调度线程、日志线程,可以通过动态性能视图查看线程的相关信息。

主要有以下4个视图:

1)V$LATCHES:查看正在等待的线程信息。

SQL> select * from v$latches;

未选定行

已用时间: 1.294(毫秒). 执行号:2114.

2)V$THREADS:查看当前系统中所有活动线程对对的信息。

SQL> select * from v$threads;

行号 ID NAME START_TIME

---------- -------------------- --------------- --------------------------

THREAD_DESC

-------------------------------------------------------------------------------------

1 5243 dm_tskwrk_thd 2022-09-07 22:03:10.000000

Task Worker Thread for SQL parsing and execution for sevrer itsel

2 5244 dm_tskwrk_thd 2022-09-07 22:03:10.000000

Task Worker Thread for SQL parsing and execution for sevrer itself

3 5245 dm_tskwrk_thd 2022-09-07 22:03:10.000000

Task Worker Thread for SQL parsing and execution for sevrer itself

......

3)V$WTHRD_HISTORY:记录自数据库启动以来,所有活动线程的相关历史信息。

4)V$PROCESS:查看当前数据库进程信息。

SQL> select * from v$process;

行号 PID PNAME TRACE_NAME TYPE$

---------- ----------- -------- ---------- -----------

1 4771 dmserver 1

已用时间: 2.047(毫秒). 执行号:7000.

从操作系统层面查看数据库进程和数据线程的命令如下:

[dmdba@dsc01 ~]$ ps -ef | grep dm.ini

dmdba 4771 1 1 Sep07 ? 00:06:20 /opt/dsc/dmdbms/bin/dmserver path=/opt/dsc/config/dsc0_config/dm.ini dcr_ini=/opt/dsc/config/dmdcr.ini

[dmdba@dsc01 ~]$ ps -T -p 4771

PID SPID TTY TIME CMD

4771 4771 ? 00:00:07 dmserver

4771 4774 ? 00:00:00 dm_sqllog_thd

4771 4776 ? 00:00:00 dm_quit_thd

4771 4777 ? 00:00:00 dm_io_thd

4771 4778 ? 00:00:00 dm_io_thd

4771 4779 ? 00:00:00 dm_io_thd

4771 4780 ? 00:00:00 dm_io_thd

4771 4781 ? 00:00:00 dm_io_thd

4771 4782 ? 00:00:00 dm_io_thd

4771 4783 ? 00:00:00 dm_io_thd

4771 4784 ? 00:00:00 dm_io_thd

4771 4785 ? 00:00:00 dm_io_thd

4771 4786 ? 00:00:00 dm_io_thd

4771 4787 ? 00:00:00 dm_io_thd

4771 4788 ? 00:00:00 dm_io_thd

4771 4789 ? 00:00:00 dm_io_thd

4771 4790 ? 00:00:00 dm_io_thd

4771 4791 ? 00:00:00 dm_io_thd

4771 4792 ? 00:00:00 dm_io_thd

4771 4793 ? 00:00:00 dmserver

4771 4794 ? 00:00:00 dm_mal_tsk_thd

4771 4795 ? 00:00:00 dm_mal_recv_thd

4771 4796 ? 00:00:19 dm_mal_tsk_thd

4771 4797 ? 00:00:00 dm_mal_tsk_thd

4771 4798 ? 00:00:00 dm_mal_recv_thd

查看所有线程的sql语句如下:

SQL> select distinct name,count(*),thread_desc from v$threads group by name,thread_desc order by 2 desc;

NAME COUNT(*) THREAD_DESC

--------------- -------------------- -------------------------------------------------------------------------------------

dm_io_thd 16 IO thread

dm_wrkgrp_thd 16 User working thread

dm_tskwrk_thd 16 Task Worker Thread for SQL parsing and execution for sevrer itself

dm_hio_thd 4 IO thread for HFS to read data pages

dm_mal_tsk_thd 3 Mail working thread

dm_mal_recv_thd 3 Thread for receiving Mail

dm_sql_thd 3 User session thread

dm_sqllog_thd 2 Thread for writing dmsql dmserver

dm_chkpnt_thd 1 Flush checkpoint thread

dm_sql_aux_thd 1 User session auxiliary thread

dm_quit_thd 1 Thread for executing shutdown-normal operation

dm_lsnr_thd 1 Service listener thread

dm_trctsk_thd 1 Thread for writing trace information

dm_sched_thd 1 Server scheduling thread,used to trigger background checkpoint, time-related triggers

dm_redolog_thd 1 Redo log thread, used to flush log

dm_audit_thd 1 Thread for flush audit logs

dm_dsc_recv_thd 1 Thread for receive Mail between dsc sites

dm_mal_lsnr_thd 1 Mail listening thread

dm_mal_mgr_thd 1 Thread for checking mail system or pre-commited transactions in MPP

dm_purge_thd 1 Purge thread

20 rows got

已用时间: 1.361(毫秒). 执行号:7101.

监听线程

监听线程(dm_lsnr_thd)循环监听服务器端口,当发现有客户端的连接请求时,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。监听线程的优先级比普通线程高,从而保障了大量连接时实例的响应时间。

工作线程

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

初始工作线程数量由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保证每个会话都有专门的工作线程处理请求。为了保证所有的请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。

当会话连接超过预设的阈值时,工作线程数目不再增加,转而由会话轮询线程接受所有的用户请求,加入任务队列;等待工作线程一旦空闲,便从任务队列依次摘取请求任务处理。

在dm.ini文件中,与工作线程有关的参数如下:

WORKER_THREADS = 16 #Number Of Worker Threads

工作线程的数量

TASK_THREADS = 16 #Number Of Task Threads

任务线程的数量

UTHR_FLAG = 0 #User Thread Flag

用户线程标志

SPIN_TIME = 4000 #Spin Time For Threads In Microseconds

线程的工作时间(以微妙为单位)

WORK_THRD_STACK_SIZE = 8192 #Worker Thread Stack Size In Kilobytes

工作线程的堆大小(以千字节为单位)

WORKER_CPU_PERCENT = 0 #Percent of CPU number special for worker thread

工作线程专用CPU的百分比

I/O线程

I/O线程(dm_io_thd)主要处理数据页的读写操作,主要有以下三种情况。

1)需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区。

2)缓冲区满或者系统关闭时,需要将部分脏数据页写入磁盘。

3)检查点到来时,需要将所有脏数据页写入磁盘。

I/O线程在启动后,通常都处于睡眠状态,当实例需要进行I/O操作时,会发出一个I/O请求,此时的I/O线程被唤醒并处理该请求,在完成该I/O操作后继续进入睡眠状态。

I/O线程处理I/O的策略根据操作系统的不同而不同。一般情况下,I/O线程使用异步I/O将数据页写入磁盘。此时,实例将所有的I/O请求直接递交给操作系统,操作系统在完成这些请求后再通知I/O线程。如果操作系统不支持异步I/O,那么I/O线程就需要完成实际的I/O操作。

DIRECT_IO = 0 #Flag For Io Mode(Non-Windows Only), 0: Using File System Cache; 1: Without Using File System Cache

I/O模式的标志(仅非WINDOWS操作系统),0,使用文件系统缓存。1,不使用文件系统缓存。

IO_THR_GROUPS = 8 #The Number Of Io Thread Groups(Non-Windows Only)

I/O线程组的数量(仅非windows系统)

HIO_THR_GROUPS = 2 #The Number Of Huge Io Thread Groups(Non-Windows Only)

HUGE缓冲区中线程组的数量(仅非windows系统)

FAST_EXTEND_WITH_DS = 1 #How To Extend File's Size (Non-Windows Only), 0: Extend File With Hole; 1: Extend File With Disk Space

如何扩展文件的大小(仅非windows系统),0,extend file使用孔扩展文件,1,使用磁盘空间扩展文件。

调度线程

调度线程(dm_sched_thd)接管实例中所有需要定时调度的任务。调度线程每秒钟轮询一次,主要负责以下任务。

1)检查系统级的时间触发器,如果满足触发条件则生成任务,将其加到工作线程的任务队列由工作线程执行。

2)清理SQL缓存,计划缓存中的失效的项,或者超出缓存限制后淘汰不常用的缓存项。

3)检查数据重演的捕获持续时间是否到期,到期则自动停止捕获。

4)执行动态缓冲区检查。根据需要动态扩展或者动态收缩系统缓冲池。

5)自动执行检查点,为了保证日志的及时刷盘、减少系统故障的恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作。

6)会话超时检测。当对客户连接设置了连接超时时,定期检测连接是否超时,若超时则自动断开连接。

7)必要时执行数据更新页刷盘。

8)换醒等待的工作线程。

日志FLUSH线程

数据库事务在运行时会往日志缓冲区中写入redo日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。因此在事务提交或者执行检查点时,实例会通知FLUSH线程(dm_redolog_thd)进行日志刷盘。

为了保证恢复的一致性,redo日志必须顺序写入,因此redo日志的写入效率比数据页的分散IO写入效率高。日志FLUSH线程和I/O线程分开,能获得更快的响应速度,保证整体的性能。

如果实例配置了实时归档,那么在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果实例配置了本地归档,那么生成归档任务,通过日志归档线程完成。

社区地址:https://eco.dameng.com

猜你喜欢

转载自blog.csdn.net/duanpian_dba/article/details/127000026