Vac*_*ano 6 performance sql-server sql-server-2012 page-life-expectancy buffer-pool
我有一个产品“Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)”,它显示出奇怪的缓冲区和页面预期寿命 (PLE) 症状。
我每分钟都在我的服务器上运行这个(跟踪这个问题):
SELECT @ple = CAST([cntr_value] AS VARCHAR(20))
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'
SELECT @usedBufferPages = CAST(COUNT(*) /128 AS VARCHAR(20))
FROM sys.dm_os_buffer_descriptors
DECLARE @StartDate VARCHAR(8) = Convert(VARCHAR(8), GETDATE(), 14)
RAISERROR ('%s. PLE at %s and Used Buffers at %s at %s ', 0,
1,@runCountString ,@ple, @usedBufferPages, @StartDate) WITH NOWAIT
Run Code Online (Sandbox Code Playgroud)
这是一些示例输出:
16. PLE at 858 和 Used Buffers at 7290 at 09:51:42 17. PLE at 918 and Used Buffers at 7342 at 09:52:42 18. PLE at 978 和 Used Buffers at 7408 at 09:53:43 19. PLE at 1039 和 Used Buffers at 7547 at 09:54:43 20. PLE at 1100 和 Used Buffers at 7697 at 09:55:44 21. PLE at 1160 和 Used Buffers at 7901 at 09:56:45 22. PLE at 1221 和 Used Buffers at 7961 at 09:57:46 23. PLE at 1282 和 Used Buffers at 8012 at 09:58:46 24. PLE at 11 和 Used Buffers at 313 at 09:59:46 25. PLE at 31 和 Used Buffers at 966 at 10:00:46 26. PLE at 90 和 Used Buffers at 1580 at 10:01:47 27. PLE at 151 和 Used Buffers at 3072 at 10:02:47 28. PLE 211 和Used Buffers 3152 10:03:47 29. PLE at 271 and Used Buffers at 3729 at 10:04:47
在项目#24 SQL Server 报告 PLE 从1,282 到 11。SQL Server 还报告使用的缓冲区从8,012 到 313。
首先,我查找了运行不佳的查询,并找到了一些已修复的(对问题没有影响)。但是,我没有发现任何与我遇到 PLE/Buffer 问题的时间相关的问题查询。此外,如果它是一个糟糕的运行查询,那么我认为缓冲区将充满该查询的数据,而不是空/丢失/错误。
接下来,我认为发生这种情况时虚拟机的内存受到限制。但是我已经问过我的系统管理员,他向我保证内存不是动态的或以任何方式共享的。(它被分配了什么,它一直得到。)另外,我每 10 分钟运行一次这个脚本,当 PLE 报告小于 50 时:
SELECT * FROM sys.dm_os_sys_memory
Run Code Online (Sandbox Code Playgroud)
它在 PLE/Buffers 高和低时报告相同/相似的值。为了完整起见,这里是上面#24 之前和之后的值的示例:
total_physical_memory_kb available_physical_memory_kb total_page_file_kb available_page_file_kb system_cache_kb kernel_paged_pool_kb kernel_nonpaged_pool_kb system_high_memory_signal_state system_low_memory_signal_state system_memory_state_desc 20970996 4758672 24378868 7929404 4844160 686076 182752 1 0 可用物理内存高 20970996 4743468 24378868 7892632 4845000 686580 182688 1 0 可用物理内存高
我检查了系统健康会话,它没有显示任何相关内容。(它所拥有的只是模拟错误,它们的时间与 PLE/Buffers 显示问题的时间无关。
我跟踪了这种情况发生的频率,我看不到模式或将其与任何工作或预定活动联系起来。
这是显示 PLE 和 Buffers 超过 21 小时的图表:
所以我很难过。我认为问题的核心是缓冲区而不是 PLE。(我认为 PLE 得到了一个错误的低报告,因为所有缓冲区都以某种方式消失了。)
但我想不出任何方式会发生这种情况。或者下一步该怎么做。
我希望得到有关要检查的其他事项的建议或有关此问题可能是什么的建议。
评论中问题的更新:
那么,服务器给了多少内存?VM 有 20 GB 的内存。
什么是最大服务器内存?
名称 值 value_in_use 描述 最大服务器内存 (MB) 13000 13000 服务器内存的最大大小 (MB) min server memory (MB) 0 16 服务器内存的最小大小 (MB)
注意:我刚刚对此进行了一些阅读,似乎这些设置对我的服务器来说是错误的。
数据库有多大?这台服务器上运行着两个事务数据库(我正在让服务器隔离它们。)它们的大小是 383 GB 和 378 GB。
该服务器上正在运行哪些其他应用程序和服务?该服务器托管我的应用程序的数据。没有其他东西击中它。(我有一个用于报告等的复制操作数据存储。
什么是VM技术VM Ware。
此 VM 是否在仅托管具有类似资源分配的 VM 的主机上运行?我们公司有很多虚拟机。都是大小不一的。这是最大的之一。
你能确认你的系统管理员告诉你的关于内存分配的内容而不必相信他吗? 我不能。我无权使用这些工具。
(根据我的经验,系统管理员会说很多话来推卸责任并责怪应用程序或其他任何人,如果这意味着他们不必做任何事情。) 我完全理解这种情绪。
我同意这种模式显然是严重的记忆压力。我希望找到一些东西来证明 SQL 感受到了内存压力。所以我可以将它发送回系统管理员进行更多研究。
等待时间统计
WaitType Wait_S Resource_S Signal_S WaitCount 百分比 AvgWait_S AvgRes_S AvgSig_S -------------- ----------- ----------- ------ --- ---------- ------------ ---------- --------- ------ --- PAGEIOLATCH_SH 16250.10 16219.14 30.96 2171649 29.59 0.0075 0.0075 0.0000 CXPACKET 14214.03 13238.56 975.47 1187935 25.88 0.0120 0.0111 0.0008 PAGEIOLATCH_EX 6814.59 6806.21 8.38 638725 12.41 0.0107 0.0107 0.0000 写日志 5157.42 4873.44 283.98 3588476 9.39 0.0014 0.0014 0.0001 备份 2569.51 2538.12 31.39 1704119 4.68 0.0015 0.0015 0.0000 LCK_M_IX 2477.15 2477.10 0.05 113 4.51 21.9217 21.9213 0.0004 ASYNC_IO_COMPLETION 2079.99 2079.66 0.33 836 3.79 2.4880 2.4876 0.0004 备份缓冲器 1807.75 1759.11 48.64 380189 3.29 0.0048 0.0046 0.0001 IO_COMPLETION 986.23 985.84 0.39 116112 1.80 0.0085 0.0085 0.0000
您的缓冲池只有 13GB,而您的数据库有 383 GB 和 378 GB,您将它们归类为 OLTP - 小事务运行过于频繁。
上述情况,如果我必须想象如下:
您必须了解 SQL Server 如何存储信息:
SQL Server 将信息以一种称为内存缓存的结构存储在内存中。缓存中的信息可以是数据、索引条目、编译的过程计划和各种其他类型的 SQL Server 信息。为了避免重新创建信息,它会尽可能长时间地保留在内存缓存中,并且通常在它太旧而无法使用时,或者当新信息需要内存空间时从缓存中删除。删除旧信息的过程称为内存扫描。记忆扫描是一项频繁的活动,但不是连续的。
由于数据库大小庞大和缓冲池不足,您肯定会遇到内存不足的情况。参考 - 例如如何确定理想的内存?
推荐:
向服务器实例添加更多内存,并在具有足够内存的不同 VM 上分离两个数据库。
这里几乎不需要调试——您需要添加内存,在多个 VM 之间逻辑拆分数据库,或者了解您必须使用有限内存进行的改组将导致性能问题和不稳定的 PLE。试图将 800 GB 的数据放入 13 GB 的内存中,就像试图藏在背包里一样。
正如此 SE 线程中所讨论并由 OP 确认的那样。
\n\n该问题是由于 SQl Server 2012 中的错误引起的。该错误已在SQL Server 2012 SP1 CU4中修复。或者更安全地说,我建议您应用SQL Server 2012 SP2,而不是使用 CU4。
\n\n根据 Microsoft Bug 修复详细信息
\n\n\n\n您可能会遇到 SQL Server 2012 性能缓慢的情况。当您检查\n SQL Server 性能监视器工具时,您会看到以下内容:
\n\n\xe2\x80\xa2SQLServer:Buffer Manager\\页面预期寿命\n 性能计数器值快速下降。发生此问题时,计数器\n 接近 0。
\n