我怎样才能看到 SQL 服务器正在做什么?

我怎样才能看到 SQL 服务器正在做什么?

因为我是一名开发人员,所以我是开发机器上 SqlServer 的用户,我很少能看到服务器上发生的情况。

但是在这个项目中,客户还管理它自己的生产 SqlServer,有时我们会看到机器“繁忙”。

我说的繁忙是指 CPU 处于 100% 状态的时间超过 30 秒。那么首先,当服务器正常运行时,有时会将所有核心设置为 100%,这是正常行为吗?

由于我们(作为非 SQL 专家)得出的结论不是这样,因此我们想检查“SQL 服务器在做什么?”

同一台服务器上可能有 6 个应用程序在运行,有些每 5 分钟运行一次,一个是持续连接的网站,一个每分钟计算数据等等。

那么当 CPU 达到 100% 时,我们如何检查是哪些应用程序导致了这种情况?

我们当然可以使用 SQL Profiler 来检查发送到 SQL 服务器的内容,但是其中包含太多行,我们不知道从哪里开始分析。

有没有什么办法可以帮助我们开始呢?

(这就像您有时在家里的台式机上遇到的情况:您什么都没做,CPU 占用了 50%,您听到硬盘发出嘎嘎声,然后您会想:您在做什么!?)

该服务器是两台机器集群之一(一台用于使用,一台用于故障转移),两台机器都是四核处理器,配备 16GB RAM。

答案1

那么首先,当服务器正常运行时,有时会将所有核心设置为 100%,这是正常行为吗?

作为开发人员,您应该知道,对此问题的唯一答案是“视情况而定”。一个进程是否可能在相当长的时间内耗尽所有 CPU - 猜猜怎么着,答案是肯定的。

因此,问题主要是 - SQL Server 在那里做什么(以及有哪些工具可以找出答案)。连接,查看 SQL 语句执行了多长时间。

那么当 CPU 达到 100% 时,我们如何检查是哪些应用程序导致了这种情况?

使用 SA 帐户连接,查看动态视图以了解 SQL Server 当前正在忙于处理什么。可能附加跟踪。

但首先要确保它是 SQL Server。SQL Server 很少受到 CPU 限制。第一个瓶颈通常是磁盘子系统。

答案2

使用 SQL Profiler 可以方便地过滤掉噪音 - 添加过滤器以仅显示执行时间超过 x 秒的语句。这样,您可以发现运行时间较长的内容,并忽略所有顺利完成的事务。

在许多情况下,一种更简单的方法是,当您处于 100% CPU 时间的某个时间段时,查看 SQL 活动监视器(或执行 sp_who2)。浏览列出的连接以查看哪些是活动的。您是否看到有东西在等待?其中是否有项目被阻止,如果有,是什么导致了阻止?

如果您无法将问题归结为特定的应用程序或语句集,那么您可以开始深入研究运行性能监视器以查看一些计数器,以尝试发现硬件瓶颈或可能正在酝酿的故障。

动态视图还提供了查询正在发生的事情的便捷途径。

然后也许可以看看一些提示这里

答案3

如果您使用的是 SQL Server 2005 或更高版本(我根据您的标签假设您使用的是更高版本),则可以使用 SQL Server 数据管理视图(通常称为 DMV)。这些将为您提供有关系统中正在发生的事情的一系列视图。在您的特定情况下,您可能需要运行以下查询(或其某些分支):

从 sys.dm_exec_query_stats 中选择 total_physical_reads、total_logical_reads、total_logical_writes、execution_count、total_worker_time、total_elapsed_time、total_elapsed_time/execution_count avg_elapsed_time、creation_time、last_execution_time、st.text,
按 qs 交叉应用 sys.dm_exec_sql_text(qs.sql_handle) st 按 total_elapsed_time/execution_count DESC 排序;

-- order by 子句将按照最高平均运行时间进行排序。

HTH,丹

答案4

也许可能性不大,但 MySQL 有一项称为慢查询日志的功能,可以记录执行时间超过 1 秒(可配置)的任何查询。SqlServer 可能也有相同的功能?

使用慢查询日志,您可以确定您的系统上是否有任何运行缓慢的查询,或者至少您可以验证没有。

相关内容