达梦7的线程
(2013-01-03 20:00:52)
标签:
达梦数据库dm7sqldbms并发与事务it |
DM7是一个单进程多线程服务器,查询v$threads, 可以看到当前正在运行的线程(主线程除外):
SQL>select count(*), name from v$threads group by name order by 1;
行号
---------- ------------------- --------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
aud_flush_thread
这个线程仅用于审计文件的刷新。当没有打开审计时,这个线程处于休眠状态。 系统中仅有一个aud_flush_thread.
Purg2_thread
这是一个非常重要的线程。Purg2_thread负责清理回滚段。它每隔一秒钟检查一次是否有可清理的回滚记录,如果有就立即清理。
uthr_db_thread
Apply_worker_thread
nsvr_lsnr_thread
ckpt2_flush_thread
nsvr_schedule_thread
rlog4_flush_thread
hio_thread
os_io_thread
rsys_work_thread
lthd_worker_thread
uthr_worker_thread
ntsk_worker_thread
工作组
批量列数据池(BDTA_COLDATA_POOL)。在执行SQL操作符时,需要创建BDTA用来在节电点之间传递数据,这些数据按照不同的数据类型,会申请/释放特定大小的空间。系统把这些以列的类型所决定的空间单位收集起来,放入一个池中,以便快速重用。这个重用池被称为批量列数据池。
SQL>select top 10 v_size, used,
where v_desc = 'RT_MEMOBJ_VPOOL' and v_size = 2097024;
行号
---------- ------------------- ------------------- ---------------
1
2
3
4
因为WORKER_THREADS = 4, 所以有4个组,上例中,每个池的使用率都不高。
另外,工作组的数量也决定了回滚段的数量,后者为工作组数加一。每组分配一个回滚段,另一个公共段用于异步执行的非用户连接事务。
用户态线程
操作系统内核感知不到用户态线程的存在, UTHR之间的多任务执行是一种协作并发模式,只有符合下列条件时才发生切换:
Ø
Ø
Ø
Ø
Ø
因此在任何时候,同一组内最多只有一个活动的UTHR。组内所有的UTHR都由工作组线程驱动执行,组内的共享资源不需要保护,所有的并发冲突都只可能发生在与其他组的UTHR发生竞争的时候。
使用用户态线程模式,系统使用有限的工作组线程来为所有的连接服务,这个模式可以极大减少线程的个数,提升大量连接下的并发性能。但是目前在非x86平台上,还有些缺陷,需要完善。
DM7用户态线程与DM6的固定工作线程模式非常类似,但是有所区别:
Ø
Ø
两者都是用固定的线程实现了大量连接的并发处理。
如果WORKER_CPU_PERCENT 不为0, 则在linux 平台下,系统试图为 工作组线程和工作线程(UTHR_DB_THREAD)指定CPU绑定,以进一步减少上下文切换。绑定的CPU个数由逻辑CPU个数 * WORKER_CPU_PERCENT / 100决定。
注意:用户态线程一般适合CPU/核的个数相对较少,而连接相对较多的应用。