【问题标题】:Performance logging tips性能日志记录提示
【发布时间】:2010-03-23 19:57:13
【问题描述】:

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

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

您建议使用哪些日志记录技巧和数据结构来发现导致性能问题的部分?

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

【问题讨论】:

    标签: asp.net sql-server performance logging windows-services


    【解决方案1】:

    不要为此使用日志记录,而是使用性能计数器。性能计数器的运行时影响很小,您可以简单地让它们始终打开。要收集和监控性能,您可以依赖现有的性能计数器基础架构(perfmon.exelogman.exerelog.exe 等)。

    我个人使用XML and XSLT to generate the counters。然后我可以用性能计数器跟踪正在运行的函数、平均调用持续时间、执行次数、每秒执行率等等来装饰我的所有代码。选择好的计数器将比日志记录更快地提供即时、准确的性能图。虽然日志记录可以更深入地了解某些事件路径(即导致某些状态的事件顺序),但日志记录很少会“始终开启”,因为它对性能的影响很大,不仅对性能,而且最重要的是对并发性的影响。现有的日志基础设施增加了争用。

    【讨论】:

      【解决方案2】:

      这不是记录的工作。这是剖析师的工作。

      尝试以下方法之一:

      【讨论】:

        【解决方案3】:

        虽然我(还没有)亲自尝试过,但可能值得一看 Gibraltar,它可以与 PostSharp 一起使用,将声明式性能日志记录到您的代码中。

        【讨论】:

        • 您可能还想为此研究 SmartInspect(也支持 PostSharp),因为它支持高分辨率计时器。
        • 除了 Jon 提到的高分辨率声明性性能日志记录之外,Loupe(原 Gibraltar)自动收集数十个对性能影响微乎其微的有用性能计数器,并与您网站的 ASP.NET Health Monitoring 集成支持 Windows 服务的日志记录和性能监控。最重要的是,Loupe Desktop(原 Gibraltar Analyst)现在是免费的。更多详情请访问我们的博客:rocksolid.gibraltarsoftware.com/announcements/…
        【解决方案4】:

        在处理此类问题时,我尽量不通过手动将日志记录/跟踪和计时添加到应用程序本身来增加任何额外的麻烦。如果您只想调整应用程序,那么我建议您获取一个分析器,它将向您显示哪些代码区域存在问题。我推荐Red-Gate'sAnt's Profiler

        现在,如果您想收集统计数据以用于监控或趋势分析,那么分析器不是正确的工具。我使用 PerformanceCounters 取得了成功,它可以让许多第三方工具从应用程序中提取性能信息。

        那么,您打算如何解决性能问题或监控以确保在性能问题变得严重之前发现它?

        编辑

        根据您的评论,我会考虑在代码的关键部分周围使用性能监视器,计算完成操作所需的时间。然后,您可以使用内置的性能监控工具或任意数量的第三方工具来监控和趋势统计数据。

        【讨论】:

        • 我正在尝试找出性能问题。当我测试应用程序时,它运行良好,但有时会开始占用资源,通常当我不在那里时会产生超时。所以我需要从日志中知道应用程序的哪个部分达到峰值以及何时达到峰值。
        【解决方案5】:

        SQL Server 会为您跟踪一些事情,因此请尝试在您的系统上运行其中一些查询:

        Wayback Machine: 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;
        

        该链接包含许多查询,包括:代价高昂的缺失索引、逻辑碎片索引、识别最常执行的查询等...

        【讨论】:

          【解决方案6】:

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

          例如,Linq2SQL 使用同步 I/O,这可能是可扩展性的一大瓶颈。因为它使用同步 I/O,所以窗口线程被阻塞,请求最终会等待。这通常是可疑的,可能不是真的。这是MSDN article 同步 I/O 如何影响可扩展性。

          如果 CPU 是一个问题,那么下一个问题是应用程序 CPU 受限?然后你可以使用上面提到的分析器之一。还要寻找在另一个常见的嫌疑人 GC perfmon 计数器上花费的时间?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-06
            • 1970-01-01
            • 1970-01-01
            • 2010-12-05
            相关资源
            最近更新 更多