如何识别哪些函数和sql过程导致主机服务器上的高CPU使用率

时间:2016-01-28 13:06:24

标签: c# asp.net stored-procedures sql-server-2014

我有一个c#/ asp.net Web应用程序(非mvc),它有一些页面可以使用存储过程和视图多次访问sql数据库。 该应用程序现在有5-10个用户,主机告诉我它在服务器上导致95%以上的CPU使用率。

我的问题是,如何确定哪些函数/过程/线程导致高CPU使用,以便我可以缓存或优化它们? 请注意,主机不允许我访问任何服务器日志,统计信息或服务器系统数据库表,只能访问我的应用程序数据库,这会引起严重的问题!

5 个答案:

答案 0 :(得分:3)

您可以使用SqlProfiler跟踪任何SQL过程,函数等的性能和行为。

您可以查看:SqlProfiler,因为它是一个非常有用的工具,它在增强sql存储过程性能方面对我有很大的帮助。

您将运行您的应用程序但在此之前转到您的sql探查器并将其配置为仅监听所需的事件,例如'程序已完成'并选择您的过滤条件,如数据库或执行用户,然后当您在应用程序中执行与数据库相关的任何操作时,探查器将跟踪并分析它。

您可以逐步检查here的使用情况。

关于与数据访问无关的C#函数,您可以使用秒表类来计算它的性能,以计算它的执行时间:

var watch = Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

或者你可以Analyze Performance While Debugging in Visual Studio 2015

答案 1 :(得分:1)

您需要单独分析.NET代码和SQL。我将解决SQL部分问题。

这是Pinal Dave's query的修改版本,可使用sys.dm_exec_query_stats查找最近的昂贵查询。我已经调整它以包含显示瓶颈的热门路径。查询计划将帮助您进一步细分。

SELECT TOP 50
  st.text AS [SQL Definition]
, SUBSTRING(
    st.text,
    qs.statement_start_offset / 2 + 1,
    ( CASE
        WHEN qs.statement_end_offset = -1 
        THEN LEN(CONVERT(NVARCHAR(MAX), st.text)) * 2 
        ELSE qs.statement_end_offset
      END - qs.statement_start_offset ) / 2
  ) AS [Hot Path]
, qs.execution_count AS [Execution Count]
, qs.total_worker_time / 1000000 AS [Total CPU (s)]
, (qs.total_worker_time / $1000000) / qs.execution_count AS [Average CPU (s)]
, qs.total_elapsed_time / 1000000 AS [Total Time (s)]
, qs.total_logical_reads / qs.execution_count AS [Average Logical Reads]
, qs.total_logical_writes / qs.execution_count AS [Average Logical Writes]
, qs.total_physical_reads / qs.execution_count AS [Average Physical Reads]
, ISNULL(qp.query_plan, '') AS [Query Plan]
  FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK)
 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
 CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
 ORDER BY [Total CPU (s)] DESC

这显然只是一个起点,但如果您的问题是由于查询效率低下或缺少索引,那么它会指向正确的方向。

答案 2 :(得分:0)

在本地部署应用程序并进行诊断。

如果您的应用程序可以阻塞服务器,它很可能也会杀死您的计算机。

答案 3 :(得分:0)

如果您从应用程序调用商店程序:

为应用程序添加详细跟踪日志选项(仅当您要按照描述检查方案时才启用它)。 跟踪时间,cpu ...为您怀疑导致问题的每种方法 (如果无法获取日志文件,请跟踪数据库的时间)。 从您方法的功能中,您可以找到商店程序

答案 4 :(得分:0)

如前所述,Sql Profiler是您最好的选择。但是,我认为您需要使用SQL Server的开发人员版本/工具才能使用它。

如果继续执行表扫描,Sql Server通常需要很长时间才能加载和/或使用高CPU。

向表中添加索引会有所帮助。 您还应该检查是否意外错过了为表创建主键的情况。

如果您认为某些字段可能是唯一的 - 那么请适当地指定唯一约束。例如,Customer表中的电子邮件地址字段可能是唯一的。

此外,请尝试避免在nvarchar字段上使用“like”。如果您是xml字段,请查看是否可以将最重要的字段分别存储在列中。例如,在我使用的Sql Server中,一个唯一的“id”字段位于XML列中 - 使得Sql查询变慢。