SQL Server 内部内存压力

Tra*_*vis 6 sql-server memory database-internals

我正在尝试确定内部内存压力的原因。据我所知,Resource Monitor Ring Buffer 返回一个内部压力指标。例如,通过使用此查询,

SELECT Top (1) *
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
Run Code Online (Sandbox Code Playgroud)

XML 结果(在资源监视器标记内):

<ResourceMonitor>
  <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
  <IndicatorsProcess>2</IndicatorsProcess>
  <IndicatorsSystem>0</IndicatorsSystem>
  <NodeId>0</NodeId>
  <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
  <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">100789</Effect>
  <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>
</ResourceMonitor>
Run Code Online (Sandbox Code Playgroud)

在Bob Dorr 的这篇文章中,来自 Memory Broker 的收缩信号可能会造成内部内存压力并反映在资源监视器通知中,IndicatorsProcess = 2 (IDX_MEMPHYSICAL_LOW)如上所示。

Slava Oks 的这篇文章展示了另一种使用RING_BUFFER_SINGLE_PAGE_ALLOCATOR. 我对这个特定的环形缓冲区了解不多,因为我从未在我的环境中见过它。

SELECT Top (1) *
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_SINGLE_PAGE_ALLOCATOR'
Run Code Online (Sandbox Code Playgroud)

这次的 XML 结果:

<Pressure status="0"><AllocatedPages>477</AllocatedPages>
  <AllAllocatedPages>477</AllAllocatedPages>
  <TargetPages>31553</TargetPages>
  <AjustedTargetPages>31553</AjustedTargetPages>
  ...
</Pressure>
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪些内部进程可能会导致内部物理内存压力,从而导致此问题indicator = 2 (IDX_MEMPHYSICAL_LOW)?我从内部物理内存压力的资源监视器指示中看到的内容包括:

  1. 可以通过内存代理环缓冲区识别的内存代理收缩操作(例如缓存清理),

  2. 最大服务器内存设置更改和,

  3. 缓冲池被盗页面 > 75%(因为我没有看到它从单页分配器环形缓冲区中反映出来)

但还有其他人吗?是否有任何记录/日志可以通过 DMV 或其他方式识别它们?

小智 3

我能找到的关于 RM 的最接近信息internal documentation来自 PSS 团队:它是如何工作的:RING_BUFFER_RESOURCE_MONITOR 告诉我什么?

\n\n

针对您的问题,which internal processes may contribute to changing the indicator没有具体的文档可以回答这个问题......我可以找到。文章引用实际上表明有一个8020可以使用的启动跟踪标志(with extreme caution ) 来缩小触发 RM 的范围。

\n\n

我认为上面文章的主要内容是这样的:

\n\n
\n

此时内存代理决策将发挥作用。该信息表明缓存或缓存\xe2\x80\x99s 的预测使用情况将超出内部目标,我们需要开始进行缓存清理。通过查看内存代理、环形缓冲区条目,您可以看到代理请求 RM 的行为。使用时钟指针,您可以看到内部和外部指针的运动。这将帮助您确定涉及哪些缓存。dbcc memorystatus() 还显示了良好的详细信息和最后的通知状态。

\n
\n\n

不确定这是否完全回答了问题,但与我在网上可以找到的内容差不多。

\n