为什么需要定期重启才能保持我的实例良好运行?

Pau*_*ulJ 22 performance sql-server-2005 sql-server configuration

我们在 SQL 2005 上有一个生产数据库服务器。一切正常运行了一段时间,但几周后我们看到性能显着下降。只有重新启动 SQL Server 才能使性能恢复正常。

一些背景:

  • 运行超过 1200 个数据库(主要是单租户,一些是多租户)。在任何人讲到只迁移到多租户之前,保持这种结构是有正当理由的......
  • 内存为 16 GB。重新启动后,SQL Server 很快就会恢复到 15 GB 的使用量。
  • 活动数据库连接大约有 80 个连接——考虑到每个进程每个 Web 服务器有一个连接池,我们认为这是相当健康的——所以我们没有连接泄漏问题。

我们在非高峰时间尝试了几件事: - 运行 DBCC DROPCLEANBUFFERS(带有 CHECKPOINT)以清除数据缓存。它没有任何效果,也不会清除任何 RAM 使用量)。- 运行 FREEPROCCACHE 和 FREESYSTEMCACHE 以清除查询计划和存储的 proc 缓存。没有效果。

显然,在活跃的生产环境中重新启动 SQL Server 并不理想。我们缺少一些东西。还有其他人经历过这个吗?

更新:2012 年 4 月 28 日 仍在与这个问题作斗争。我已将 SQL Server 的内存降低到 10 GB,只是为了排除与操作系统的任何争用。我越来越接近缩小范围,但下一步需要一些帮助。

这是我发现的,重新启动 SQL Server 后,页面文件在 12.3 GB 和 12.5 GB 之间徘徊。它会保持这种状态好几天。服务器线程总数将在 850 到 930 之间挂起 - 在几天内也保持稳定和一致(sqlserver 稳定在 55 到 85 之间,具体取决于流量)。

然后,有一个“事件”。我不知道事件是什么,我在日志中看不到它,也看不到在星期几或它发生的时间有任何一致的东西,但是他的页面文件突然跳到了 14.1 或 14.2 GB,线程跳转到 1750 到 1785 之间。

发生这种情况时检查性能,其中超过 900 个线程是 sqlserver。所以我去 sp_who2 看看这些线程是从哪里来的......而且只有使用过的 80 个左右的 db 连接。

那么....有没有人知道我如何找到 SQL Server 上其余 900 个线程的位置,以及它们在做什么?

更新:2012 年 6 月 1 日 仍在与此问题作斗争。对于仍在阅读本文的任何人来说,线程跳跃的问题已经解决。这是由自动更新的 ComVault 备份软件引起的。它正在创建一个线程,试图备份不再存在的数据库(它维护以前数据库的列表),而不仅仅是备份当前数据库。

但是 - 问题仍然存在,我们必须每周重新启动,或者需要几天时间。与 Rackspace 团队合作,看看他们是否可以提供任何线索。

Dar*_*ait 7

你说一切都很好,然后几周后,性能下降。(通常,人们声称性能下降很快,或在特定时间,或以看似随机的间隔。这可能意味着糟糕的 I/O 性能或锁风暴或在奇怪的时间运行的 CPU 密集型查询,或重量级计划作业或缺乏索引或错误的统计数据导致 CPU 密集型查询或磁盘读取。或其他东西。)周是不寻常的。

我的假设是您服务器上的另一个应用程序正在泄漏内存。我已经在病毒软件(每个 DBA 最喜欢的服务器软件恶棍)和 3rd 方监控软件中看到了这一点。随着时间的推移,我会仔细检查 SQL Server 的内存使用情况,并且我也会获取盒子上所有其他应用程序的所有内存使用情况。如果您对 SQL Server 的内存使用设置了硬限制并将其设置为不允许分页,则可能是其他应用程序被分页并占用了 I/O 容量。

不难找。如果您还没有在服务器上保存指标,我会启动 Perfmon 并让它每 30 或 60 分钟抓取一个样本。几天后,您可能会看到另一个应用程序的内存使用量上升。

SQL Server 日志中是否有错误消息指出“sql server 的重要部分已被调出”?这也将是一个很大的线索。


Sta*_*hns 5

让我祝贺您能够在只有 16 GB 内存的 SQL 服务器的单个实例上运行 1200 个数据库,并且在顺利运行几周后只遇到这些类型的问题。在当地的 PASS 章节讲的好故事。

现在进行故障排除:SQL 和操作系统的 RAM 均为 16 GB。我假设您的最大内存设置为 15 GB 或最大值。这可能会导致缓冲池耗尽所有内存并阻塞操作系统。您是说清除缓冲池和缓存没有显示任何差异,而且您的 PLE 高于 300。这证明了内存瓶颈。服务器上的 CPU 和 IO 怎么样(规格/统计数据)?

运行select * from sys.dm_exec_request where session_id>50 and session_id<>@@spid,您看到的资源争用是什么(wait_type、wait_time、last_wait_type、wait_resource)。


DFo*_*k42 5

1200 个数据库、一个操作系统,可能还有其他东西?是的,我认为服务器本身需要超过 1gb 的内存才能运行,特别是考虑到,如果您将 15gb 设置为 SQL Server 的最大内存设置,它仍然需要15gb 之外的额外内存用于线程。

我会将 SQL Server 降低到 14GB,以便为服务器提供更多喘息空间。

此外,在“Professional SQL Server 2008 Internals and Troubleshooting”中给出了一个示例,用于在具有第三方备份实用程序和 16GB RAM 的 SQL Server 2008 x64 系统上的内存限额:

  • 2 GB 用于 Windows
  • 1GB 用于工作线程
  • 1GB 用于 MPA 等。
  • 1GB 用于备份程序
  • 11GB 用于 SQL Server

在书中,它展示了如何确定您可以拥有的最大线程数,以及如何计算它们将占用多少内存。运行此命令(更改服务器类型以匹配您的服务器)以确定您的线程需要多少内存。

declare @servertype int

set @servertype=1
/*
1: x86 (32-bit)
2: x64 (64-bit)
3: IA64

*/

select max_workers_count *
    (
        case @servertype when 1 then .5
            when 2 then 2
            when 3 then 4
            else .5
        end
    )
from sys.dm_os_sys_info
Run Code Online (Sandbox Code Playgroud)


小智 3

DBCC 命令只会清除内存缓冲区,不会将内存释放回操作系统。

你知道SQL Server实际上正在消耗内存吗?我建议查看设置 Perfmon 会话或在重新启动后开始收集 DMV 信息,以了解 SQL Server 正在做什么和正在做什么。另请注意,用户在收集期间是否比平时做更多的工作(例如月末处理等)。您是否在同一台服务器上运行 SSRS、SSIS 或 SSAS?

您的系统上有 1200 个数据库,您拥有的最大数据库大小是多少?