SQL Server 内存问题

Mik*_*ike 3 sql-server memory ssis sql-server-2012

我们有一个似乎正在泄漏内存的 SQL 服务器。内存消耗会随着时间线性增加,直到服务器完全耗尽内存,从而导致严重的性能问题。

SQL 服务器包含 6 个小型(平均超过 50MB)数据库和一个稍大一些(大约 2GB)的数据库。

该服务器目前是 VMware 5.1 中的虚拟服务器。它的平均工作负载非常轻(~1% cpu,<10 批请求/秒,< .5 mb/s IO 典型;峰值推到~10% cpu,300 批请求/秒,5 mb/s IO)。

目前,它有 8GB 分配给 VM。其中,4GB 设置为 SQL Server 中的最大服务器内存。但是,SQL 服务器进程使用的内存远不止于此——通常在重新启动后的 12 小时内使用大约 6GB。

除了主要的读取工作负载外,该服务器还运行许多 SSIS 包,以将数据传入和传出到公司结构内的其他系统。这利用 MySQL 通过 ODBC(安装了 5.2.6 驱动程序)连接到内部 MySQL 集群和 ConnX 以连接 OpenVMS 系统。

操作系统:Windows 2012 SQL:2012 Enterprise VM 设置:4 个 CPU 内核,8GB,用于操作系统、数据和日志的独立虚拟卷。

问题: 1) 关于为什么 SQL Server 进程不会遵循服务器上设置的限制的任何想法?2) 有没有人知道在 SQL Server 中分析内存使用情况的好方法?我们可以看到页面预期寿命正在下降,更多的内存被分配给进程,但是有什么方法可以查看 SQL 将内存分配给什么(即过程缓存、缓存结果等)。

Bre*_*zar 7

你在这里有几个问题:

1)关于为什么 SQL Server 进程不会遵循服务器上设置的限制的任何想法?

最大服务器内存是指缓冲池,但不是服务器使用内存的所有内容。例如,SSIS 不是 SQL Server 引擎的一部分 - 它是另一个应用程序,恰好随 SQL Server 一起免费提供。(与 SSAS 和 SSRS 相同。)最大服务器内存对 SSIS 没有影响。这是您经常听到建议将 SSIS 分离到其自己的实例的原因之一 - 特别是如果您在虚拟化中使用 SQL Server Enterprise。以每个内核 7000 美元的价格计算,您在这里谈论的是价值 28000 美元的许可,并且您正在使用大约 500 美元的 RAM。

2) 有没有人知道在 SQL Server 中分析内存使用情况的好方法?我们可以看到页面预期寿命正在下降,更多的内存被分配给进程,但是有什么方法可以查看 SQL 将内存分配给什么(即过程缓存、缓存结果等)。

是的,在 SQL Server 引擎中,您可以使用像 sys.dm_exec_memory_clerks 这样的 DMV。如果您使用 StackExchange 人员提供的免费 Opserver 工具进行 SQL Server 监控,请查看内存管理员列表。如果没有,您可以从它使用的内存管理员查询开始。

然而,在 SQL Server 引擎之外——就像你的 SSIS 包一样——SQL Server DMV 无能为力,因为这是在进程外发生的。您需要使用传统的系统管理工具进行进程监控并观察哪些进程使用 RAM。