SQL*_*ner 4 sql-server-2008 sql-server-2008-r2 sql-server-2012
我正在阅读 Christian Bolton、Brent Ozar 的一本关于 SQL 2008 内部结构和故障排除的书,以及已故 Ken Henderson 写的一本旧书,我对 SQL 服务器的动态内存管理器感到困惑和好奇。
有人可以确认我对 SQL Server 动态内存管理的理解是正确的吗?
在 SQL Server 2005/2008/2008R2 x64 中
a) 锁占用的最大内存量限制为缓冲池内存(最大服务器内存)的 60%。通过禁用锁升级并进行大量插入,我可以看到 SQL Server 在抛出错误号 1204(锁内存不足)之前可以占用多达 60% 的缓冲池内存
b) 计划缓存大小限制为
a) Number of plans in cache -- 160K
b) Plan Cache upper limit: 75% of server memory from 0-4GB + 10% of server memory from 4Gb-64GB + 5% of server memory > 64GB.
Run Code Online (Sandbox Code Playgroud)
一旦达到此阈值,SQL Server 将开始从缓存中驱逐执行计划,直到 SQL Server 不再看到内部计划缓存压力
c) 工作区内存限制为最大服务器内存的 75%,除非被资源调控器覆盖,否则单个查询不能超过(可用的最大工作区内存 75%)的 25%。
我的问题是
在惰性编写器开始将页面逐出内存之前,数据库页面缓存占用的最大内存是否有限制?它是如何控制的?通过查看缓冲区中的空闲页数……**
在将日志刷新到磁盘之前,sql server 如何控制“事务日志缓存”占用的内存?
提前致谢。
这不是一个完整的答案,因为我承认我不知道完整的答案,但无法发表评论。
绕道而行 - 关于 SQLOS 内存,有大量信息来自一个从事 SQL Server 存储团队内部工作的人 - Slava Oks。他在 MSDN 博客上有很多关于 SQLOS 内存管理器的文章,都值得一读。现在我知道我们正在使用 SQL Server 2012,但这些信息仍然很有价值。
现在,关于你的第一个问题,如果 db page cache 在被清除之前占用的最大内存有限制以及它是如何控制的,我会在上面引用他的话。
从文章SQLOS 的内存管理器和 SQL Server 的缓冲池:
缓冲池按需提交页面。根据内部内存要求和外部内存状态,它计算它的目标,它认为在进入内存压力之前应该提交的内存量。为了使系统脱离分页目标不断地重新计算。目标内存不能超过代表最大服务器内存设置的最大内存。即使您将 min server memory 设置为 max server memory,缓冲池也只会根据需要提交其内存。您可以通过监视相应的探查器事件来观察此行为。
从这篇文章的评论中我了解到 SQL Server 使用了 LRU 算法(LRU = 最近最少使用)。如果您真的需要深入了解,以下研究论文中特别介绍了 SQL Server 的 LRU 算法:The LRU-K Page Replacement Algorithm For Database Disk Buffering。
现在,对于您的第二个问题,日志缓存并未真正公开,因此无法更改/调整它们,因为它们是 SQLOS 内部内存结构的一部分。引用MSDN 论坛的回答:
本质上,每个数据库都有一个用于其事务日志的日志缓冲区/缓存,这是一个小的连续内存分配,大小为 60K,由活动事务使用,并在事务提交或缓冲区空间填满时刷新。多个活动事务可以交错在日志缓冲区中,如果任何一个事务提交,日志写入器将缓冲区内存写入事务日志文件。如果空间已满,则内容会刷新到磁盘,从而可以重用缓冲区/缓存内存。这就是为什么日志 IO 的范围可以从 512 字节到 64K(实际上是 60K),但它始终是连续的,因此不同的写入大小并不那么重要。日志记录的格式不同于 BOL ( http://msdn.microsoft.com/en-us/library/ms190925.aspx),所以日志记录的大小是可变的,但日志缓冲区/缓存的大小是一致的。
归档时间: |
|
查看次数: |
1544 次 |
最近记录: |