我们在同一个磁盘驱动器上有用户和系统数据文件。( io_stall_write_ms / ( 1.0 + num_of_writes ) ) 对于用户文件低于 2,但 tempdb 文件通常超过 400。我在几台服务器上看到了这一点,我很好奇是否存在写入 tempdb 需要更长时间的原因比一个普通的数据库数据文件。
SELECT DISTINCT UPPER(LEFT(mf.physical_name, 1)) AS Directory,
( io_stall_write_ms / ( 1.0 + num_of_writes ) ) as result,
io_stall_write_ms, num_of_writes,
fs.database_id,
fs.[file_id]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]
Run Code Online (Sandbox Code Playgroud)
谢谢,
Mik*_*lsh 18
简短回答:看到更高的 IO 停顿本身可能是也可能不是问题。如果您有问题,您需要查看更多信息来确定。它看起来确实有点高,是的,但是你在受苦吗?如果是这样,这可能是因为您的 IO 系统没有正确处理负载(因为它不能正确处理负载,因为您将所有内容都放在一个驱动器上或其他原因),或者您在 TempDB 中做得太多(改变第一个问题 - IO 性能 - 可能是一个更容易和更有效的修复,但首先确定你是否有问题)
更长的讨论/答案:
这里有两个问题在起作用——
首先,“高”在旁观者的眼中。如果您要问 10 位 DBA,IO 停顿“太高”是什么意思,您可能会得到 2-3 个不同的答案,其中包含数字,5-6 个“视情况而定”的答案和一个茫然的凝视。我的假设是这里的平均 400 毫秒可能太高了,尤其是当其他 DB 的平均停顿时间为 2 毫秒或更低时。
无论哪个数据库看到高位,您都应该以相同的方式处理它。IO 停顿就是它听起来的样子... IO 请求花费的时间比预期的要长.. 停顿。这些发生。它们一直发生在资源共享且资源有限的系统中(实际上是我们所有的系统)。当停顿成为性能问题或导致它们时,它们就会成为问题。因此,我相信您将此处视为监控的主动部分,或者因为您遇到了正在排除故障的性能问题。我们也不想迷失在 IO 停顿中。我们正在研究拼图的一部分,而不是大局。自 SQL 上次重新启动以来,只查看等待统计数据或文件统计数据可能会很麻烦,因为您一直在查看,并且某些维护窗口或重负载窗口可能会使计数器倾斜。因此,请务必查看完整图片。
但是,当我怀疑我有磁盘性能问题或在这样的查询中看到某些东西时,我通常会遵循如下流程:
PAGEIOLATCH_*,IO_COMPLETION,WRITELOG等?)。如果您这样做,则表明您有一些与 IO 相关的性能问题,就像 IO 停顿一样。但它在这里为您提供了另一种形式的协议。Physical Disk:Avg Disk Sec/Read和Avg Sec Disk Sec/Write计数器。这些测量您的延迟。在保存到性能日志文件的一段时间内观察这些计数器。你看到的平均值是什么?如果您看到的数字超过 0.020 秒(20 毫秒),这可能是一个问题。如果您看到平均超过 40-50 毫秒或更高的数字,则更明确地表明存在问题。还看看你的尖峰?它们能爬多高,能持续多久?如果您看到数百毫秒的峰值并且它们持续数十秒或数十秒或更长时间和/或频繁发生,则您的工作负载的 IO 性能更有可能出现问题。(注意:对于这个等待统计分析和性能分析 - 查看不同时期和使用类型。晚上的使用统计与白天不同吗?批处理窗口?维护窗口重建大量索引?在每个时期查看这些工具并了解您所看到的每个工具)
这里的另一个 IO 性能考虑 -
所以 TempDB 是一个数据库,它可以像我刚刚讨论的任何其他数据库一样有 IO 停顿。但是 TempDB 可以具有更高读取的一些原因是什么?(并非详尽无遗,我欢迎在编辑、其他答案或评论中添加或想法)-
关键是 - TempDB 以多种方式使用,将它视为您最繁忙的数据库之一,如果不是最繁忙的数据库,我一点也不感到惊讶。当我认为它在客户站点的所有数据库中拥有最多数量和最高平均档位时,我也不会感到惊讶。有时这是其工作量的性质。看看我在这里提到的一些事情肯定可以帮助您确定这些数字是否表明存在问题,如果是,则如何更深入地解决它。
Ste*_*ven -3
TempDB 在实例上的所有数据库之间共享。因此,TempDB 中有时可能会出现某些页面的争用:SGAM、GAM和PFS。简而言之,这些页面跟踪到目前为止 TempDB 中使用的内容以及可用于新用途的空间。
通常,这是通过向 TempDB 添加多个数据文件来解决的。关于正确的数字有几种不同的理念,但所有人都同意你应该有多个。
以下是一些要运行的查询...
这将显示 TempDB 有多少个文件以及它们所在的位置。
-- tempdb layout
use tempdb
go
exec sp_helpfile
go
Run Code Online (Sandbox Code Playgroud)
这将显示您有多少个 CPU 和核心。
-- cores and hyperthreading
select cpu_count, hyperthread_ratio
from sys.dm_os_sys_info
go
Run Code Online (Sandbox Code Playgroud)
这将显示您拥有多少个 NUMA 节点以及每个 NUMA 节点的核心数。
-- numa nodes and schedulers
select node_id, online_scheduler_count
from sys.dm_os_nodes
order by node_id
go
Run Code Online (Sandbox Code Playgroud)
这将显示 TempDB 中哪些页面正在等待。
-- see if anything is waiting on tempdb
select *
from sys.dm_os_waiting_tasks
where resource_description like '2:%'
go
Run Code Online (Sandbox Code Playgroud)
这是一篇更深入地讨论页面争用问题的文章。
好的,现在是哲学部分......:-)
对于我自己来说,如果我在SMP系统上,我只需要与总核心数一半一样多的文件。
如果我在NUMA系统上,那么我只需要与每个 NUMA 节点的核心数一样多的文件。
但是,我很少看到 TempDB 拥有四个以上文件有任何改进。因此,我通常从四个开始并监视争用,如我链接的文章中所述。
如果我继续发现问题,那么我会再添加两个。再次检查,添加更多,然后重复,直到争用消失。
| 归档时间: |
|
| 查看次数: |
18837 次 |
| 最近记录: |