我正在研究如何解决本地内存压力问题。如果我错了,请纠正我,但据我了解,SQL Server 对缓存和用户存储使用 CLOCK 算法。每个时钟都有两根指针,一根是外部的,一根是内部的。
我的兴趣是内部时钟指针。如果访问缓存的工作人员注意到缓存大于内存的特定百分比,则内部时钟指针开始为该缓存释放内存。
使用 dmvdm_os_memory_cache_clock_hands
我可以看到有关时钟指针的信息。该列rounds_count
表示时钟指针扫描整个缓存的次数。last_tick_time
是手最后移动的时间。round_start_time
是最后一次扫描的时间。
last_tick_time
和 和有什么不一样round_start_time
?是不是手一动就没有清理缓存?
时钟的每个滴答声会删除多少条目?
有人可以帮我理解 SQL Server 中这个时钟算法的工作原理吗?
是的,几乎就像你所说的,但让我再补充一点。
Cache
并Userstores
共享称为最近最少使用(LRU)算法的通用成本计算和算法。这种 LRU 机制有所谓的“时钟算法”。该算法具有所谓的“手”。在 SQl Server 中有各种驱逐策略可以从 SQL Server 缓存中删除“旧”条目并帮助此 SQL Server 有 2 个时钟指针:外部:实施全球政策
内部:执行当地政策
在处理从缓存中删除旧条目时,您可以将策略视为规则。
发生的事情还有很多,不像内部时钟会在使用的总内存大于一定百分比后“仅”通过删除旧条目来释放内存,LRU 和内部内存压力也被考虑在内。
last_tick_time
- 时钟指针最后移动的时间。round_start_time
- 时钟指针开始当前回合的时间。它清扫缓存的回合。没有预定义的值,在 LRU 算法完成其任务后,其他线程会看到缓存中有多少条目是“旧的”,然后将其删除。如果存在内存压力,该值可能会增加,并且扫描可能会过于频繁。
Microsoft 的 Slava Oaks 已经写了很多关于它的文章。我会引用他的博客
补充阅读:缓冲区缓存的时钟指针