寻求有关新 SQL 服务器的帮助。
我的一个客户正在运行一台老旧的 SBS 2003 服务器(Xeon 3060,4GB RAM)和一个业务线应用程序,该应用程序带有一个使用 SQL Server 2005 的 25GB SQL 数据库。他们有 14 个同时用户。该服务器有 1 千兆位 NIC,所有内容都连接到一个 48 端口千兆位交换机。
规格:
我用运行 Hyper-V Server Core 2012 的新服务器(Xeon E5620、48GB RAM)替换了旧服务器。新服务器有 4 个 NIC,如下所示:
- 2 个 Intel 千兆网卡配置为 LBFO 组。该组与虚拟交换机连接,所有虚拟机都通过虚拟网卡与该交换机连接。
- 1 千兆位 NIC 用于 Hyper-V 管理
- 1 个用于 IPMI 的专用板载 NIC
虚拟机和分配的内存如下:
- “SBS2011”(16 GB)是他们的 DC、Exchange Server、DNS 等,也是他们的常规文件共享
- “SERVER2”(16 GB)正在运行 SBS Premium 附加组件(Server 2008 R2 + SQL Server 2008 Standard)并托管其业务线数据库和与该数据库相关的另一个文件共享。
- 我偶尔会使用一台虚拟 Win7pro(4G)机器作为测试工作站
- 我用于 Hyper-V 管理的虚拟 Win8pro(4 GB)机器(尽管我发现我更喜欢 powershell 命令)。
- 这样就剩下 8 GB 可供 Hyper-V 核心使用
症状:
当第一批用户进入并开始工作时,它的功能还算可以接受,但仅仅 5-10 分钟后,性能就开始下降。然后,他们需要花费 10-30 秒的时间在应用程序中切换“选项卡”。有线和无线客户端都会发生这种情况。
SQL 服务器分配了 16 GB 的 RAM,当然 SQL 服务立即占用了 15 GB。由于此服务器还服务于另外两个小型应用程序和一个文件共享,我认为将 SQL 内存限制为 10 GB 是明智的做法。问题仍然存在。
考虑到我需要以合乎逻辑的方式解决这个问题,我安装了软件来监控网络的各个方面,包括两台服务器上的内存和 CPU 使用率、两台服务器的带宽以及无线带宽。现在它已经收集了一些可供我使用的数据,我相信 SQL 服务器上仍然存在与内存相关的问题。
请记住,旧服务器在总共 4 GB 的 RAM 上运行相同的数据库以及 SBS 操作系统、Exchange、所有文件共享和 SQL 2005,因此我认为 16 GB 应该没问题。当然,我知道这是一个不同的操作系统和不同的软件。
我迄今所做的事情:
- 将 SQL 实例限制为 10G,以便为其他应用程序和开销留出资源
- 配置备份以在凌晨 12:30 关闭 SQL 服务并在凌晨 1:00 重新启动它(目的是释放资源)
客户员工大约在早上 7:30 开始上班,到 8:00 时绩效就开始下降。您可以在下面的服务器内存图中看到正在发生以下情况:
可用内存比前一天多了大约 4 GB 凌晨 12:30,SQL 服务停止,可用内存变为大约 15 GB。凌晨 1:00,SQL 服务启动,可用内存变为大约 5.5 GB 早上 7:30,员工到达 早上 7:50,可用内存开始下降(员工开始登录应用程序) 早上 8:10,绩效很差,员工不高兴,老板不高兴 = 我不高兴
我的想法和考虑:
这是一家全天接待患者的医疗办公室。超过一半的工作人员在患者就诊期间会短暂访问患者记录。长期缓存这些信息可能没有必要。其余工作人员会访问时间表、账单等。所有这些都来自同一个应用程序。
- 可用服务器内存似乎相关。同意/不同意?
- 我已阅读有关 Windows 文件系统缓存的文章,我希望获得有关这方面的建议。
- 我觉得我应该为 SQL Server 虚拟机分配更多内存。我可以将 Win8 和 Win7 VM 的内存减少到 1 GB,为 Hyper-V 核心留出 4 GB。这样我就有 10 GB 可以分配给 SQL 服务器,从而将其增加到 26 GB。
- 关于问题 #3,我想获得有关如何在服务器内分配此内存的建议。我应该将其分配给 2008 R2 OS、分配给 SQL 实例,还是将其分配给两者?
- 我还应该考虑做哪些事情来提高性能。
- 据我所见,CPU 使用率和带宽似乎不是问题,但请参阅 doaks.net/sqlhelp 上的资源截图和图形
任何意见,将不胜感激。
谢谢。
答案1
可用服务器内存可能与问题无关。SQL Server 应该占用所有内存并将其保留给自己。这是设计使然。
当您将 SQL Server 从 SQL 2005 升级到 SQL 2008 R2 时,是否更新了 SQL Server 数据库内表的统计信息?这需要完成,因为 SQL Server 2008 及更高版本不使用在 SQL Server 2005 中构建的统计信息。
您需要查看 SQL Server 内部以了解问题的来源。仅查看 CPU、内存和网络统计信息只能了解一半的情况。SQL Server 执行计划将告诉您有关正在发生的事情的大部分信息,特别是统计信息是否已过期(我猜是的),索引是否缺失。此外,您还需要查看索引碎片,以查看索引是否严重碎片化,从而导致内存浪费和额外的物理 IO。
您的 IO 工作负载是什么样的,特别是响应时间和每秒的 IO 数量(包括读取和写入)是多少?
SQL Server 中的 waitstats 是什么?运行查询时数据库内是否发生阻塞?
停止重新启动 SQL Server 实例?这样做只会让事情变得更糟,而且会使解决问题变得更加困难,而不是更容易。
应用程序中是否存在大量动态 SQL,或者全部都是通过存储过程完成的?
答案2
在 SQL Server 上投入硬件只能起到有限的帮助。配置错误的安装可能会降低性能,而 PerfMon 等工具却无法发现明显的原因。如果您没有丰富的数据库调优经验,请聘请 SQL Server 顾问。
如果系统在较少硬件上的表现尚可,则可能存在配置问题。有能力的顾问应该能够在 5 小时内解决问题。(https://www.google.com/?q=sql+server+consultant)
如果您仍想尝试解决问题,请查看以下有关基本性能故障排除的教程:
- 闪电战(自动诊断脚本)
- 使用 SQL Server 虚拟化的技巧
- 使用活动监视器,特别关注等待、IO 统计和等待任务
- 此指南介绍了 SQL Server 附带的大多数监视工具
另外,停止重新启动 - 您所做的一切都会导致 SQL Server 丢失它用于加快执行速度的所有有用的缓存。