一点背景知识: 我们在服务器上有 17 个不同的 TempDB 数据库文件和 6 个 TempDB 日志文件。它们分布在不同的驱动器上,但托管在 2 个驱动器阵列上。

我看到磁盘 IO 响应时间超过了建议的限制。通常你希望你的磁盘在 5-10 毫秒内响应,没有超过 200 毫秒。我们在 TempDB 文件上看到了长达 800 毫秒的随机峰值,但仅限于一个驱动器阵列。

建议的解决方案: 重新启动 SQL 服务器。当 SQL 服务器关闭时,重新启动承载大部分 TempDB 文件的驱动器阵列。此外,当 SQL 关闭时,重做网络连接以绕过网络交换机,以消除硬件上的任何缓慢来源。

这是一个好主意还是黑暗中的一个镜头?有任何想法吗?
提前致谢。

最佳答案

17?这个数字是谁想出来的? Please read thisthis - 很少有> 8 个文件会有所帮助的情况,特别是如果您只有 2 个底层数组/ Controller 。一些建议:

  • 使用偶数个文件。大多数人从 4 或 8 个开始,只有当他们证明他们仍然存在争用时才会增加(并且还知道他们的底层 I/O 实际上可以处理更多文件并随它们一起扩展;在某些情况下,它没有效果或完全相反的效果 - 不同的驱动器号并不一定意味着更好的 I/O 路径)。
  • 确保所有数据文件的大小相同,并且具有相同的自动增长设置。拥有 17 个具有不同大小和自动增长设置的文件将打败循环 - 在很多情况下,由于 SQL Server 执行比例填充的方式,只会使用一个文件。有一个奇数似乎......好吧,对我来说很奇怪。
  • 删除 5 个额外的日志文件。 They are absolutely useless
  • 使用跟踪标志 1117 来确保所有数据文件同时增长并且(因为 2.)以相同的速率增长。请注意,此跟踪标志适用于所有数据库,而不仅仅是 tempdb。 More info here
  • 您也可以考虑使用跟踪标志 1118 来更改分配,但请使用 read this first
  • 确保 instant file initialization 已打开,以便文件在扩展时不必归零。
  • 预先调整 tempdb 文件的大小,以便它们在正常的日常事件中不必增长。不要缩小 tempdb 文件,因为它们突然变大了 - 这只是冲洗和重复操作,因为如果它们变大一次,它们会再次变大。在此期间,您不可能出租回收的空间。
  • 如果可能,在其他地方执行 DBCC CHECKDB。如果您经常运行 CHECKDB,那太好了!拍拍自己的后背。但是,这可能会对 tempdb - please see this article on optimizing this operation 造成影响,并在可行的情况下将其从生产实例中移除。
  • 最后,验证您看到的争用类型。你说 tempdb 性能爬行,但以什么方式爬行?你如何衡量这个? Some info on determining the exact nature of tempdb bottlenecks hereherehereherehere

  • 您是否考虑过显式地减少使用 tempdb(更少的 #temp 表、@table 变量和静态游标 - 或完全使用游标)?您是否大量使用 RCSI、MARS 或 LOB 类型的局部变量?

    关于sql-server - TempDB 性能爬取;我们应该重新启动吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14697128/

    10-13 09:46