我怎么能调试一个缓冲区的问题?
-
29-09-2020 - |
题
我有一个生产"Microsoft SQL Server2012年(SP1)11.0.3128.0(64)",是出奇怪的缓冲器和网页的预期寿命(者)的症状。
我正在运行这一每一分钟在我的服务器(跟踪这一问题):
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
这是一些例子产出:
16. PLE at 858 and 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 and Used Buffers at 7408 at 09:53:43 19. PLE at 1039 and Used Buffers at 7547 at 09:54:43 20. PLE at 1100 and Used Buffers at 7697 at 09:55:44 21. PLE at 1160 and Used Buffers at 7901 at 09:56:45 22. PLE at 1221 and Used Buffers at 7961 at 09:57:46 23. PLE at 1282 and Used Buffers at 8012 at 09:58:46 24. PLE at 11 and Used Buffers at 313 at 09:59:46 25. PLE at 31 and Used Buffers at 966 at 10:00:46 26. PLE at 90 and Used Buffers at 1580 at 10:01:47 27. PLE at 151 and Used Buffers at 3072 at 10:02:47 28. PLE at 211 and Used Buffers at 3152 at 10:03:47 29. PLE at 271 and Used Buffers at 3729 at 10:04:47
在项目第24SQL服务器的报告所者从去 即1 282至11.SQL服务器还报告说,使用缓冲区去 8,012 313.
第一我看了可怜的运行查询,并且我发现了一个固定的几个(没有影响的问题)。但是,我没有找到任何问题的查询相关联的时代,我有者/缓冲区的问题。此外,如果它是一个贫穷的运行查询,然后,我将认为的缓冲区将充分查询的数据,而不是空的/丢失/误.
接下来,我认为,虚拟机是获得其存储器的限制时发生这种情况。但我已要求我的系统管理员和他向我保证存储器不是动态的或以任何方式共享。(它是什么分配,它得到,所有的时间。) 此外,我经营这个脚本每10分钟时所者的报告少于50:
SELECT * FROM sys.dm_os_sys_memory
它报告相同或类似价值观时,者/缓冲区都高的及时候他们都很低。为完整起见,这里是一个例子值之前和之后#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 Available physical memory is high 20970996 4743468 24378868 7892632 4845000 686580 182688 1 0 Available physical memory is high
我已经检查系统健康的会议,它表示没有相关。(它有的是模拟falures,以及他们的时间没有关联的时代所者/缓冲区显示的问题。
我已经跟踪你如何经常发生这种情况,我无法看到一个模式或将它连接到任何工作或计划的活动。
这里是一个图表,显示了者和缓冲区在21小时:
所以我难倒。我认为,问题的核心是缓冲区不者.(我认为者越来越虚假报告的低,因为所有的缓冲区是不知怎的消失了。)
但我想不出以任何方式,这可能发生。或者接下来要做什么。
我会的爱情建议在其他事情要检查或建议的什么这个问题可能。
更新的问题的意见:
因此,多少内存服务器? VM有20GB的存储器。
什么是最大的服务器记忆?
name value value_in_use description max server memory (MB) 13000 13000 Maximum size of server memory (MB) min server memory (MB) 0 16 Minimum size of server memory (MB)
注:我有做一点上阅读这只是现在,而且似乎这些设置错了我的服务器。
有多大的数据库? 有两个事务数据库上运行这个服务器(I am过程中获得的服务器,将它们隔离开。) 它们的尺寸是383GB和378GB。
什么其他应用程序和服务上运行,服务器? 这个服务器主机数据对我的应用程序。有没有其它事情打击。(I有一个复制的运作的数据储存的报告。
什么是VM技术 VM具。
是这个虚拟机运行的主机上唯一举办虚拟机具有类似资源的分配? 我们有许多虚拟机在我们的公司。所有不同大小。这是最大的一个。
你能确认你的系统管理员是告诉你关于存分配,而不只是具有相信他吗? 我不能。我没有访问这些工具。
(在我的经验,系统管理员会说很多事情要通过降压和责任应用程序或其他任何人,如果它意味着他们没有做任何事情。) 我完全可以理解这个观点。
这一模式肯定似乎是严重的存储器中的压力 我同意。我是希望能够找到证明SQL是感觉记忆的压力。所以我可以把它送回到系统管理员为更多的研究。
等待时间的统计数据
WaitType Wait_S Resource_S Signal_S WaitCount Percentage 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 WRITELOG 5157.42 4873.44 283.98 3588476 9.39 0.0014 0.0014 0.0001 BACKUPIO 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 BACKUPBUFFER 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
解决方案
如上讨论过 这本身线 并确认,任择议定书》。
该问题是由于在错误SQl服务器2012年。部份错误是固定在 SQL服务器2012年SP1CU4.或是在更安全的说我建议你适用 SQL服务器2012年SP2 而不是去CU4.
为每微软修正的细节
你可能会遇到慢性能在SQL服务器2012年。当你检查 SQL服务器的性能监测工具,你看看下面的:
•迅速下降的Sql server:缓冲区管理\页的预期寿命 业绩计数值。当这个问题发生时,该计数 近0.
其他提示
你的缓冲池 只13GB 和你的数据库383GB和378GB,你必须归类为只读-小事务运行过于频繁。
上述情况,如果我们想象的是像如下:
你必须了解如何SQL服务器中存储的信息:
SQL服务器的信息存储在内存在的结构称为记忆缓存。 缓存中的信息可以是数据、索引条目编制过程的计划,以及各种其他类型的SQL服务器的信息。 为了避免重新创建的信息,这是保留的记忆缓存尽可能长的时间是 经常从高速缓存在是太老是有用的,或者当存储空间,是需要为新的信息。过删除旧的信息被称为一个存储器扫描。 记忆扫描频繁的活动,但不是连续的。
你肯定experienceing存饥饿由于纯粹数量的数据库的大小和不充分的缓冲池。参考- 如何确定理想的存储器,为实例?
收集 等待统计数据 和 检查性问题的产生是从浪费了缓冲池的存储器
建议:
添加更多内存服务器的实例和单独两个数据库在不同的虚拟机有足够的存储器。
有非常小的调试这里-你需要增加存储器,从逻辑上分割你的数据库跨多个虚拟机,或者了解洗牌你必须要做到有限的记忆将会导致业绩问题和挥发性者.试图融800GB的数据为13GB的记忆就像是试图偷渡在一个背包。
仔细的查询正在执行。存储器使用单独的数据库通常是太粗指标,以改善东西。假设你不会影响的查询(黑盒子应用程序),它仍然是值得理解什么是影响内存使用情况。例如批处理过程可能会去和使用所有的缓冲区空间在一个单一的打击通过查询所有数据在大规模表。
特别是寻找任何失踪的索引,因为完整的表格的扫描-因为他们可以有效地冲上的高速缓存服务器。
SQL服务器具有优良的设置的分析仪工具,可以监测在实时,我怀疑你会看到的东西坚持喜欢一个痛拇指一旦您深入研究。
不,我建议改变该数据库模式,但有一件事看出来是过于庞大varchar fields-他们真的可以吸取缓空间上的大型数据库。