SQL Server闩锁及其性能问题指示

SQL Server Latches and their indication of performance issues

我正在尝试了解数据库(SQL 2008)的潜在性能问题,尤其是一个性能计数器SQLServer:Latches \ Total Latch Wait Time总锁存等待时间(ms)。 我们看到数据库响应时间变慢,并且我可以匹配的唯一相关峰值是总锁存等待时间和锁存等待/秒的峰值。 我没有在磁盘IO,CPU使用率或内存中看到任何特定的瓶颈。

SQLServer闩锁的常见解释是它是轻量级的锁,但是我试图更详细地了解什么是闩锁,它与锁有何不同以及我看到的大量锁可能是 一个指标。


对于专业DBA来说,这可能是一个非常基本的错误……但这是我在遇到高闩锁问题时发现的,并且该线程在搜索结果中的排名很高。我以为我会分享我们的帮助,它可能会帮助别人。

在使用NUMA内存架构的新型双/多处理器服务器上,最大并行度应设置为每个处理器的实际核心数。在我们的示例中,我们有双氙气,每个氙气都有4个内核,并且具有超线程功能,它看起来像是SQL的16个逻辑处理器。

将此值从默认值0锁定为4会立即降低某些查询的高锁存器。

在某些情况下,我们的闩锁运行了1000ms +到30,000ms。


我建议您查看sys.dm_os_latch_stats,看看与先前的基准线相比,哪种类型的闩锁增加了争用和等待类型。

如果您看到BUFFER类型的闩锁中出现尖峰,则意味着它是由冲突驱动的,以修改同一页面而导致更新。其他闩锁类型在MSDN中也有简短说明,可以指导您解决问题的根本原因。对于标记为"仅供内部使用"的用户,您将不得不与MS一起开立支持案例,以详细说明它们的含义即将在NDA上使用。

您还应该查看sys.dm_os_wait_stats。如果您看到PAGELATCH_*增加,则与上面的BUFFER类型锁存器存在相同的问题,即试图修改同一页面(也称为争用)。作为更新热点。如果看到PAGEIOLATCH_*增加,那么您的问题就是I / O暂存器,那么在需要时将页面加载到内存中的时间太长。


从此博客引用:

使用sys.dm_db_index_operational_stats:

1
2
3
4
5
6
7
8
9
SELECT
    OBJECT_NAME(object_id)
    ,page_latch_wait_count
    ,page_latch_wait_in_ms
    ,tree_page_latch_wait_count
    ,tree_page_latch_wait_in_ms  
    ,Page_io_latch_wait_count
    ,Page_io_latch_wait_in_ms
FROM sys.dm_db_index_operational_stats (DB_ID(), NULL, NULL, NULL)

使用sys.dm_os_latch_stats:

1
2
SELECT * FROM sys.dm_os_latch_stats  
WHERE latch_class = 'buffer'

1
2
3
4
sp_configure 'max degree of parallelism', 8
go
reconfigure
go