2010-03-23 50 views
0

我正在开发通过LINQ2Sql使用Microsoft SQL Server 2005的大型数据收集ASP.Net/Windows服务应用程序对。 表现始终是问题。性能日志记录提示

目前应用程序被分成多个较大的处理部分,每个部分记录他们的工作持续时间。这不是详细的,并没有帮助我们任何事情。有一些数据库表包含应用程序本身从其自身行为收集的统计信息会很好。

您推荐哪些日志提示和数据结构来发现导致性能问题的部分?

编辑: 大多数情况下,我正在寻找可以在过度使用时削弱整个系统的应用程序的某些部分。白天有高峰期,应用程序的某些部分负载很重。一些高级日志记录将帮助我隔离需要更多关注和优化的部分。

回答

2

不要对此使用日志记录,而是使用性能计数器。性能计数器的运行时影响很小,您可以简单地将它们始终打开。要收集和监控性能,可以依靠现有的性能计数器基础结构(perfmon.exe,logman.exe,relog.exe等)。我个人使用XML and XSLT to generate the counters。然后,我可以使用跟踪正在运行的函数的性能计数器,平均调用持续时间,执行次数,每秒执行速率等来装饰我的所有代码,等等。好的计数器选择会比记录的速度快得多,速度更快,性能更准确。虽然日志记录可以更好地了解某些事件路径(即导致某种状态的事件顺序),但由于对性能的影响很大,不仅会影响性能,而且最重要的是影响并发性,因此日志很少会“始终打开”现有的日志基础设施增加了争用。

1

虽然我没有(还)为我自己试了一下,可能值得看看Gibraltar,可以用PostSharp来声明性能ogging到你的代码。

+0

因为它支持高分辨率定时器,所以您可能也想要查看SmartInspect(也支持PostSharp)。 – 2010-03-25 10:56:49

+0

除了Jon提到的高分辨率声明性性能日志记录之外,Loupe(以前称为Gibraltar)自动收集了几十个有用的性能计数器,对性能影响可以忽略不计,并且与您的网站的ASP.NET Health Monitoring集成,并支持您的日志记录和性能监视Windows服务。 最重要的是,放大镜桌面(以前直布罗陀分析)现在是免费的。在我们的博客更多详细信息: http://rocksolid.gibraltarsoftware.com/announcements/our-best-log-viewer-is-now-free – 2013-05-09 15:59:59

1

的SQL Server跟踪的一些事情给你,所以尝试运行某些查询您的系统上:

Uncover Hidden Data to Optimize Application Performance

这里是链接的例子:

--Identifying Most Costly Queries by I/O 
SELECT TOP 10 
[Average IO] = (total_logical_reads + total_logical_writes)/qs.execution_count 
,[Total IO] = (total_logical_reads + total_logical_writes) 
,[Execution count] = qs.execution_count 
,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
     (CASE WHEN qs.statement_end_offset = -1 
      THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
      ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) 
     ,[Parent Query] = qt.text 
,DatabaseName = DB_NAME(qt.dbid) 
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt 
ORDER BY [Average IO] DESC; 

的链接包含许多查询,其中包括以下用途:成本高的缺失索引,逻辑碎片索引,识别最常执行的查询等...

1

当处理这样的问题时,我尝试通过手动添加日志/跟踪&时间到应用程序本身来避免增加任何额外的麻烦。如果你想要调整应用程序,那么我建议你得到一个分析器,它会告诉你哪些代码是一个问题。我推荐Red-Gate'sAnt's Profiler

现在,如果您想要收集统计数据以进行监视或趋势分析,那么分析器不是正确的工具。我已经使用PerformanceCounters取得了成功,许多第三方工具都将性能信息从应用程序中提取出来。

那么你想要做什么来解决性能问题或监视器,以确保你在性能问题变得严重之前就能捕捉到它?

编辑基于您的评论

,我想看看周围使用的代码关键部分的性能监控,定时过了多长时间才能完成的操作。然后,您可以使用内置的性能监视工具或任何数量的第三方工具来监视和趋势统计信息。

+0

我试图找出性能问题。当我测试应用程序时,它表现良好,但它有时会开始占用资源,通常在我不在时产生超时。所以我需要从日志中了解应用的哪些部分达到峰值和什么时候。 – Germstorm 2010-05-09 07:55:32

0

我会开始诊断perf性能问题的真正原因是什么?是CPU,内存,磁盘还是IO。这可以通过几个perfmon计数器来识别。

例如,Linq2SQL使用Sync I/O,这可能是可扩展性的瓶颈。因为它使用同步I/O窗口线程被阻塞,并且请求最终会等待。这是通常的嫌疑犯,可能并非如此。以下是MSDN article同步I/O如何影响可伸缩性。

如果CPU是一个问题,那么下一个问题是应用程序CPU绑定?然后你可以使用上面提到的其中一个分析器。同时寻找花在GC perfmon柜台上的时间,这是另一个常见的嫌疑犯?