我们的数据库应用程序遇到了一个令人困惑的问题。我们在 3 个不同(但规格相似)的环境中运行该应用程序。
Select Insert
Env1 0.81ms 0.94ms
Env2 0.69ms 5.79ms
Env3 0.52ms 15.61ms
我们对 3 个环境中的磁盘和内存性能进行了基准测试。Env3 比 Env2 稍快,而 Env2 又比 Env1 稍快(不超过 10%)正如您所预料的那样,Env3 中的 Select 比 Env2 稍快,而 Env2 又比 Env1 稍快。但是,Env1 中的 Insert 比 Env2 稍快。快 5 倍比 Env2 中快 15 倍比 Env3 更差。什么原因可能导致 Env2 和 Env3 中的写入性能非常差?
一些背景信息,以防相关。
上面的数字是我们为尝试诊断问题而编写的测试应用程序收集的。选择和插入是基本的,并在单个小表上执行。
我们的测试应用程序...
a) 用 C# 编写,使用基于 System.Data.SqlClient.SqlConnection 的类。b
) 通过执行操作 1000 次并将所用时间除以 1000 来计算平均时间。c
) 以 2 种模式工作...
i。我们的代码调用了插入/选择/更新 1000 次
ii。我们的代码调用了一个存储过程,该存储过程调用了插入/选择/更新 1000 次
d) 在与数据库相同的机器上运行除了存储过程调用更新时,更新与插入类似。当存储过程在 Env3 中调用更新时,它比 Env1 慢 4 倍,但当客户端调用 1000 个更新时,它慢 17 倍。下面的扩展表说明了差异。环境。
Select SP Select Insert SP Insert Update SP Update Env1 0.81ms 0.015ms 0.94ms 0.72ms 0.83ms 0.04ms Env2 0.69ms 0.019ms 5.79ms 5.32ms 7.42ms 0.09ms Env3 0.52ms 0.020ms 15.61ms 14.37ms 15.27ms 0.15ms
我们设置了“环境 1”。我们的客户设置了“环境 2 和 3”。环境 2 是一个 VMWare 映像。当我们第一次注意到插入和更新有多慢时,我们将映像的副本带到了我们的托管中心。性能问题消失了。
每个环境都在 Windows Server 2008(64 位)上运行 SQL Server 2005 标准版(64 位)
环境之间的主要区别是
环境1:在配备 2 个四核 Intel Xeon E5520 处理器的 Dell T610 上的虚拟机管理程序中运行。(虚拟机有 3 个专用核心和 6GB 专用 RAM。)
环境2:在配备 4 个双核 2.8Ghz AMD Opteron 8220 处理器的 HP Proliant DL585 G2 上运行 VMWare VSphere。(该 VM 有 3 个专用核心和 6Gig 专用 RAM。)
环境3:在物理机上运行 - HP Proliant DL380 G5、2 * 双核 Intel Xeon 3Ghz 处理器、6GB RAM。
环境1使用 RAID0,环境 2 和 3使用 RAID5
当我们将 Env2 映像复制到我们的服务器时,我们使用 VMPlayer 运行它。我们无法复制性能问题。
环境1在我们的网络上运行。Env2 和 3 在我们的客户网络上运行。我们尝试了共享内存、命名管道和 TCP 作为通信机制,没有明显的区别。
我们尝试重建索引、删除并重新创建表等。所有表上的所有插入/更新都出现了性能不佳的情况。
我们有 2 个问题...
1) 什么可能导致 Env2 和 Env3 中的写入性能非常差? 2) 我们可以使用什么工具来查看所有这些额外的毫秒都用在了哪里?
感谢您对此给予我们的帮助。
答案1
我要调查的内容如下:“Env1 使用 RAID0,Env2 和 3 使用 RAID5”
RAID 5 的写入速度较慢。
请记住,数据库是磁盘驱动器的接口,磁盘更为重要,尤其是在小表上,然后是 RAM 或 CPU。
尝试更简单的设置并改变 RAID 设置,甚至可能尝试不使用 RAID 来获取完整的数据集。
快速编辑 为了进行更随机的测试,请确保您正在测试磁盘而不是 RAM 或 CPU,尝试使用较低的 RAM 和 CPU,以及一个包含 1 百万甚至 1000 万行的表,其中您随机选择行以增加服务器对每一行都访问磁盘的机会。
答案2
值得深思的是:SELECT 是从内存中提供的。INSERT 必须刷新日志磁盘。检查sys.dm_io_virtual_file_stats
在 3 个环境中。我预计您将发现该io_stall_write_ms
列中存在巨大差异。
答案3
两台服务器使用 RAID 5 肯定令人担忧(RAID 5 读取速度快/写入速度慢)。几乎任何其他 RAID 配置都可以获得更好的性能(尽管 RAID 0 没有容错能力)。
更改 RAID,您可能会获得想要的性能,但我想我会补充一些我认为尚未提到过的内容:
索引虽然非常适合选择,但会对任何写入操作的性能产生负面影响(您写入数据,索引也必须更新)。因此,即使更换 RAID 不能给您带来预期的性能,我接下来也会考虑索引。
答案4
我要做的第一件事就是确保每个环境中的索引完全相同,并查看每个数据库服务器的填充因子是多少。此外,每个环境中的数据量是否相同或接近?