我正在尝试诊断 SQL Server 2012 Express 安装中 sqlservr.exe 进程的异常 CPU 使用情况。
安装在具有 Windows Server 2012 R2、8 核 Xeon E5 和 8GB RAM 的 VM 中运行。
CPU 负载(来自 ProcessExplorer 和任务管理器)始终保持在 12%-15% 左右。重新启动服务没有效果,重新启动几分钟后 CPU 使用率将立即回到同一水平。
我最大的问题是 SQL Server 与第三方软件捆绑在一起,而我没有对数据库的 SA 访问权限。我被授予了对软件数据库的只读访问权限(我只能访问视图,而不能访问表),但我无法从 SSMS 运行任何报告或执行这。
高 CPU 消耗肯定来自第三方应用程序(如果我停止它,负载就会回到空闲水平)但是他们的支持到目前为止对于解决这个问题毫无用处,我需要自己处理。
我还能尝试其他什么方法来查明 CPU 使用率过高的根源吗?
答案1
在考虑分析 SQL Server 内部的任何性能问题之前,您至少需要以下任一view server state
操作:view database state
用户可以使用 VIEW SERVER STATE 权限做什么?
由于您仅限于内置的 Windows 性能监视器,因此您可以监视以下计数器来确定任何基本问题:
- 内存 – 可用兆字节
- 物理磁盘 – 平均磁盘秒/读取
- 物理磁盘 – 平均磁盘秒/写入
- 物理磁盘 – 磁盘读取次数/秒
- 物理磁盘 – 磁盘写入次数/秒
- 处理器 – % 处理器时间
- SQLServer:常规统计信息 - 用户连接
- SQLServer:内存管理器 – 内存授予待定
- SQLServer:SQL 统计信息 - 每秒批量请求数
- SQLServer:SQL 统计信息 - 编译次数/秒
- SQLServer:SQL 统计信息 - 重新编译/秒
- 系统 — 处理器队列长度
这些计数器根据以下文章列出SQL Server Perfmon(性能监视器)最佳实践。
鉴于您的 CPU 负载,Brent 文章中的以下引述似乎足够了:
寻找明显的 CPU 瓶颈
首先,查看处理器队列长度以了解 CPU 压力。如果此数字平均为 1 或更高(如果您使用备份压缩,则在 SQL Server 的完整备份窗口期间除外),则意味着正在等待 CPU 可用。
当此数字超过 1 时,我会表示怀疑,因为这通常意味着人们在 SQL Server 上安装了其他软件,例如应用程序或网站。这是个问题。如果管理层拒绝购买新服务器,请指出 SQL Server Enterprise 许可的两个 CPU 成本约为 50-60,000 美元 - 这将为 Web 应用程序支付单独的服务器费用。如果您可以从 SQL Server 中消除应用程序,那么您就不必使用那么多 CPU 能力,而更少的 CPU 意味着更少的许可成本。
如果您看到出现处理器队列长度,则可以将更深入的 Perfmon 指标添加到您的捕获中,但对于初级 DBA,我建议的第一件事就是简单地通过远程桌面进入 SQL Server。右键单击任务栏,单击“任务管理器”,然后单击“进程”选项卡。选中显示所有用户的进程的复选框,然后单击 CPU 列以按 CPU 百分比从高到低排序。坐下来观察一两分钟。哪些进程正在使用 CPU 功率?如果是 SQLServer,那么我们需要做更多的研究,但很有可能是另一个应用程序,我们需要将该应用程序从该服务器上移除。一般来说,在 SQL Server 上启用超线程并不能解决此类问题。
如果 sqlserver.exe 进程是唯一一个具有 12-15% 负载的进程,那么您将需要额外的权限才能分析根本原因。