Tempdb的并发阻塞

9.3 Tempdb的并发阻塞

在介绍Tempdb的并发问题前,先介绍几个比较特殊的数据页。

PFS(Page Free Space),用于标识数据页空间的使用情况,以字节标识,可以表示数据页使用百分比,例如使用百分五十,百分八十,百分九十五以及完全被使用,同时,还有一个字节位表示数据页的类型,例如IAM页等。一个PFS页,可以标识64MB的数据页空间使用情况。

GAM(Global Allocation Map),用于标识数据盘区(Extent)是否已分配,以位标识,当位为0时,表示盘区还未分配,当位为1时,表示盘区已经分配。一个GAM页可以标识大约4GB的数文件空间标识。

SGAM(Shared Global Allocation Map),用于标识混合数据盘区是否已分配,以位标识。混合空间中可能被存储数据,也可能存储索引。一个SGAM页可以标识大约4GB的数据文件混空间标识。

Tempdb中,临时表的数据特性如前面章节中介绍的,当会话中创建临时表并初始化时,分配数据空间,在会话中删除临时表,或会话结束,便会将空间回收。数据的新增和删除,都需要使用到数据页,当数据页的存储空间大小发生变化时,PFS的字节标识值就需要发生变化。当这样的操作频率地发生在相同的一块数据页空间区域内时。如前面讲闩锁时所知道的,内在页在更新时,是需要使用闩锁来实现互斥的,当并发操作累积到特定的数值时,将会频繁地出现闩锁等待,此时有可能会造成服务器CPU使用率上升,甚至发生CPU满负荷的情况。

出于这样的原因,通常建议将Tempdb的数据文件个数增加到与逻辑CPU个数相同。这样可以达到数据分流的目的,避免在相同的数据区域内频繁地擦写数据。

相同的情况也有可能发生在GAM和SGAM页上,只是GAM和SGAM要求临时表的数据量较大。

除了PFS,GAM以及SGAM几个root页的并发阻塞问题外,Tempdb还可能因为频繁地创建临时表而发生系统表阻塞的问题。例如,在高并发访问的某个存储过程中,使用SELECT INTO的方式创建临时表,当并发访问足够高,或者查询语句需要消耗的时间比较长且有一定的并发量时,可能导致系统的元数据表,比如sys.objects视图对应的系统元数据表sysschobjs或者sys.columns视图对应的这些系统元数据表syscolpars,这些系统元数据也有可能由于高并发以及较长的事务而产生大量的系统阻塞的情况。解决这样问题的方式便是,创建临时表时,不应该将创建临时表的语句包含在较长的事务当中。避免Tempdb的系统表被锁住,引起别的进程无法正常创建或操作临时表。

另外,在更高并发的情况下,为了达到Tempdb有更好的数据吞吐能力,建议将数据文件放在不同的磁盘上,以提高磁盘的吞吐量。

接下来,我们会使用到一个测试工具,工具名为ostress。是微软提供的SQL Server测试工具组件RML Utilities For SQL Server中的一个,大家可以到微软官网下载该工具,这个工具组件是免费的。

Tempdb并发示例

以下链接为64位工具下载地址:

http://www.microsoft.com/en-us/download/details.aspx?id=4511

以下是32位工具的下载地址:

http://www.microsoft.com/en-us/download/details.aspx?id=8161

下载完测试软件,并安装后,我们需要在数据库中,创建相应的存储过程,存储过程代码如代码清单9-5中所示,创建两个存储过程,usp_temp_table_test作为子存储过程,usp_loop_test_table_test循环调用它。

CREATE PROC dbo.usp_temp_table_test

AS

BEGIN

????CREATE TABLE #table(c1 INT,c2 CHAR(5000));

????DECLARE @i INT=1;

????WHILE(@i<=10)

????BEGIN

????????INSERT INTO #table (c1,c2)VALUES (@i,‘test‘);

????????SET @i+=1;

????END

END

GO

?

CREATE PROC dbo.usp_loop_temp_table_test

AS

BEGIN

????SET NOCOUNT ON;

????DECLARE @i INT=1;

????WHILE(@i<100)

????BEGIN

????????EXEC dbo.usp_temp_table_test;

????????SET @i+=1;

????END

END

GO

代码清单9-5 Tempdb并发阻塞测试

创建对应的代码后,使用ostress模拟用户并发的情况,执行下面的Windows批处理指令,如代码清单9-6中所示,使用ostress模拟300个并发执行我们创建的存储过程。

"C:\Program Files\Microsoft Corporation\RMLUtils\ostress.exe" -S(local)\SQL2012 -E -Q"exec [AdvantureWorks2008R2].dbo.usp_loop_temp_table_test;" -o"D:\output.txt" -n300

代码清单9-6 执行ostress工具

在执行ostress时,使用动态管理视图查看当前服务器内存中,Tempdb内存页的闩锁等待情况,全县下面的语句,查询动态管理视图sys.dm_os_waiting_tasks获取相应的阻塞信息,代码如代码清单9-7中所示。

;WITH waiting_tasks

AS (SELECT session_id,

???????????????????? wait_type,

???????????????????? wait_duration_ms,

???????????????????? blocking_session_id,

???????????????????? resource_description,

PageID = CONVERT(INT,RIGHT(resource_description,LEN(resource_description)-CHARINDEX(‘:‘,resource_description,3)))

FROM sys.dm_os_waiting_tasks

WHERE wait_type LIKE ‘PAGE%LATCH_%‘ AND resource_description LIKE ‘2:%‘)

SELECT session_id,

???? wait_type,

???? wait_duration_ms,

???? blocking_session_id,

???? resource_description,

ResourceType = CASE WHEN PageID=1 OR PageID%8088=0 THEN ‘PFS Page‘

WHEN PageID=2 OR PageID%511232=0 THEN ‘GAM Page‘

WHEN PageID=3 OR (PageID-1)%511232=0 THEN ‘SGAM Page‘

ELSE ‘Not PFS, GAM, or SGAM page‘

END

FROM waiting_tasks;

代码清单9-7 查看当前tempdb的Latch情况

通过查询语句,可以看到如图9-5中所示,此时服务器绝大部分是PFS数据页的闩锁等待。

图9-5 服务器的闩锁等待

从执行结果上看到,300个并发任务中,有297个正在等待数据页2:1:1,此处页为PFS数据页,其等待类型为PAGELATCH_UP类型。导致这样的原因这是因为Tempdb在实例中只有一个数据文件,高并发的情况下,导致数据页并发更新带来的阻塞。

9.3.1 配置Tempdb

如何配置Tempdb可以避免图9-5中的问题,在前面小节中我们已经有提到过了,提高并发的方法便是增加数据文件,将并发分开,避免对同一个文件进行操作。那么配置多个文件需要注意些什么事项呢?

SQL Server对于具有多个文件的数据库在写入数据时,数据库引擎将按照各个数据文件的大小比例进行数据分配,因此,当对Tempdb配置多个文件时,要保持Tempdb的数据文件大小保持一致,这样才能达到在存储Tempdb数据时,可以达到近乎平均使用和分配数据文件的作用,才能达到平均使用每个文件中的PFS,GAM以及SGAM这些root数据页的目的。

时间: 2024-10-05 04:44:50

Tempdb的并发阻塞的相关文章

深入浅出 Java Concurrency (25): 并发容器 part 10 双向并发阻塞队列 BlockingDeque[转]

这个小节介绍Queue的最后一个工具,也是最强大的一个工具.从名称上就可以看到此工具的特点:双向并发阻塞队列.所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表. 首先看下LinkedBlockingDeque的数据结构.通常情况下从数据结构上就能看出这种实现的优缺点,这样就知道如何更好的使用工具了. 从数据结构和功能需求上可以得到以下结论: 要想支持阻塞功能,队列的容量一定是固定的,否则无法在

Expert 诊断优化系列------------------给TempDB 降温

前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert for SQL Server 诊断系列 这篇我们来说说TempDB,这个系统数据库如何进行优化,怎么样平衡他的使用. 首先简单介绍一下TempDB:Tempdb是SQL Server里的一个重要的系统数据库.并且每个实例中只有一个TempDB,也就是当你在一个实例下创建了100个数据库,这100个数据库

并发级别

在看多核编程相关论文时,往往一个并发算法会说自己是wait-free的或者lock-free的,或者是 non-blocking 的,这些专有词汇其实表示的是并发的程度,或者说并发的级别.并发级别的理解是阅读各种并发算法设计论文以及并发数据结构实现的必备基础. 1.1  Wait-freedom 无等待并发 Wait-freedom 指的是每一个线程都一直运行下去而无须等待外部条件,整个流程中任何操作都能在一个有限的步骤内完成,这是最高的并发级别,没有任何阻塞. 结合之前原子操作部分的知识,可以

多线程之消费者生产者模式加入阻塞队列

队列相关资料: http://chenjumin.iteye.com/blog/2182322 http://blog.csdn.net/luohuacanyue/article/details/16359777 Queue ------------ 1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQ

阻塞队列和生产者-消费者模式、DelayQueue

1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue,                                         (延期阻塞队列)(阻塞队列实现了BlockingQueue接口) 5.ArrayBlockingQueue,           (基于数组的并发阻塞队列) 6.LinkedBlockingQueue,        (基

JUC——并发集合类

如果要进行多个数据的保存,无疑首选类集(List.Set.Queue.Map),在类集的学习的时候也知道一个概念:许多集合的子类都具有同步与异步的差别,但是如果真的要在多线程之中去使用这些类,是否真的可以用呢? 范例:观察一下类集的问题: package so.strong.mall.concurrent; import java.util.ArrayList; import java.util.List; public class ListDemo { public static void m

并发编程专题(四)

CountDownLatch(计数器) CountDownLatch 位于并发包下,利用它可以完成类似于计数器的功能,如果线程 A 需要等待其他 n 个线程执行完毕后才能执行,此时就可以利用 CountDownLatch 来实现这个功能,CountDownLatch 是通过一个计数器来实现的,计数器的初始值为线程数量,每当一个线程完成了自己的任务后,计数器的值就会减1,当计数器的值为0时,表示所有线程已经执行完毕,等待线程就可以恢复. package com.kernel; import jav

并发编程 - 总结

并发编程 核心: 并发,进程,线程,协程 并发与并行 并发:是伪并行,即看起来是同时运行.单个cpu+多道技术就可以实现并发并行:同时运行,只有具备多个cpu才能实现并行补充: 多道技术实现了单核下实现并发 同步 .异步 | 阻塞.非阻塞 同步 .异步: 是指任务提交的方式    同步:提交任务后原地等待任务执行完毕,拿到任务的返回值才能继续下一行代码,导致程序串行    异步:提交任务后不在原地等待,任务一旦执行完毕就会触发回调函数的执行,程序是并发阻塞 .非阻塞 : 指程序执行中的运行状态

java多线程系类:JUC集合:01之框架

概要 之前,在"Java 集合系列目录(Category)"中,讲解了Java集合包中的各个类.接下来,将展开对JUC包中的集合进行学习.在学习之前,先温习一下"Java集合包".本章内容包括:Java集合包JUC中的集合类 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3498454.html Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Colle