写点什么

ASP.NET 性能监控和优化入门

  • 2016-10-30
  • 本文字数:4165 字

    阅读完需:约 14 分钟

关键要点:

  • 只有与应用指标相关联,基础设施指标才能最大发挥作用。
  • 高效性能优化的关键在于性能数据。
  • 一些 APM 工具为 ASP.NET 提供了开箱即用的支持,这样入门使用 ASP.NET 仅需最小限度的初始设置。
  • 代码分析工具为程序性能给出了最为详尽的视图。
  • 轻量级分析工具给出了网页性能的实时视图,可用在开发环境和生产环境中。

“这个网页打开太慢了!”,对 Web 网站这样的抱怨是经常性的和普遍性的,尤其是自从 Web 应用开始逐渐替代桌面应用以来。虽然 Web 带来了全球交付这样的理想特性,但是也在性能层面带来了相应的挑战。

数据采集与使用的基本原理

用户给了你一个“龟速”网页的 url,那好,你该怎么做呢?网页打开慢的问题是源自于哪里?是一开始就是这么慢吗?是对所有用户都很慢吗?要解决网页打开慢的问题并且确保在一周后不会再次变慢,有许多诸如此类的问题需要得到解决。

虽然在网上可以搜索到一些性能优化的资料,但它们通常都是关于 Jit、垃圾回收、SQL 查询优化、ORM 陷阱等这样一些特定主题的。考虑到实现优化的美好前景是诱人的,这里冒出了这样的一个问题:针对当前的性能问题,如何知道所选定的优化方法将会切实地产生好的结果?

无疑在这个工作中的某一环是有所缺失的。我们需要能可持续地找到性能问题所在的方法。通过使用该方法,我们能发现系统中较慢的部分,并有切实措施支持我们对性能问题的诊断。掌握了性能问题所在,我们就可以进一步地确定是否需要进行性能改进,并对利益相关者解释所有这一切。

对于所发现的上述性能问题,进行准确地甄别是更有效的处理方法。问题在一开始可能并非是一个网页加载慢的问题。在存在超时的情况下(例如负载均衡器可能几秒后才会为连接提供服务),完全无法被区分开这是一个死锁问题或是响应时间慢的问题,因为这两个问题导致了同样的结果,就是产生了超时。这需要数据去找到导致问题的真正原因。

为了阐明准确甄别性能问题的重要性,下面列举了一些导致 Web 应用响应慢的可能问题排查点:

  • JavaScript 响应慢;
  • 资源加载中的产生了阻塞;
  • 用户端存在代理;
  • DNS 问题;
  • ISP 或网络问题;
  • 交换机和路由器;
  • 负载均衡器;
  • 应用代码(包括第三方软件库);
  • HTTP 服务器(例如有时是 ASP.net 或 IIS);
  • 第三方服务,例如:支付服务提供商、地图服务提供商等;
  • 子系统,包括:SQL Server、Redis、Elasticsearch、Rabbit MQ 等。

还可以罗列出更多的性能问题排查点,这取决于需处理系统的复杂度和规模。在如此之多的系统组件都可影响性能优化问题的情况下,如何才能确诊性能问题呢?答案概括为一个词:数据。你需要来自于每个系统组件的、相关且有意义的数据。对于 Web 应用响应慢的问题,数据可以证明每个系统组件是对问题是有影响的还是完全无关的。

数据在手,就可以开始从上述列表中按你的思路去抽取问题排查点进行分析,这类似于在排序树中进行查找。每次在树中向下走一层,就越接近于性能问题的细节和实质,依次甄别性能问题是否存在于:

  • 客户端,服务器端或是两者之间的某处?
  • 响应慢的 JavaScript、渲染或是资源阻塞?
  • 负载均衡器、Web 服务器、任一子系统或是第三方软件?

在这样树中逐层下行时,性能问题会变得越来越清晰。对于每个层次上的问题排查点,定位性能问题所需的数据必须要与对应的问题精度相匹配。这时有必要去使用性能分析工具或 SQL 执行计划这样的工具。

为有效地利用时间,很有必要重申一下 Amdahl 定律:

无论一个任务改进的程度如何,该任务中没有从改进中受益的部分限制了理论上的任务加速。

例如在一个 Web 请求中,假定需要 100 毫秒的服务器处理时间和 5 秒的 SQL 查询时间。即使你可以将服务器处理时间优化到低于 1 毫秒,但是这对整体响应时间的改进很小,也就是从 5.1 秒变成 5 秒。改进 SQL 处理所需的 5 秒时间是潜在收益最大的优化。

架构问题

这种逐层厘清优化问题所在的自顶向下方法,对于局限在单一页面中的优化问题具有很好的效果。那么应用于跨越多个页面的优化问题上时效果又如何呢?例如,一些页面所存在的间歇性地打开慢问题,是由于子系统跟不上整体工作节奏,或是由于系统中存在某个再次重启可能就无法继续工作的老旧网络交换机。

这种情况下,侧重于应用的监控方法显示出它的局限性所在。这需要更多的软件层面和硬件层面上的指标,用于对系统中的每个组件进行评估。

在硬件层面,首先所能想到就是 web 服务器和数据库服务器,但它们只是冰山的一角。必须要识别和监控所有系统中的硬件组件,这包括:服务器、网络交换机、路由器、负载均衡器、防火墙、SAN 等。

鉴于系统管理员的常规工作就是硬件监控,可能对于系统管理员而言上述的所有指标是显而易见的。但是这里有个重要警告:如果将这些硬件指标从软件指标中分离处理,那么从性能角度看所有这些硬件指标中的大部分是毫无用处的。换句话说,指标只有置于相应的环境中才能发挥最大作用。

例如,在一些情况下可能在数据库服务器上 CPU 占用率平均达 50% 是完全正常的,但是对于其它服务器而言这就是个定时炸弹。50% 的 CPU 占用率,如果是在峰值时刻这意味着仍有很大空间去运行更繁重的任务。但如果是在闲暇时间段中而 50% 的 CPU 占用率频繁发生,这就意味着应用可能无法承受传入请求的突发峰值。

底线就是,为评估系统的健康度,CPU、内存和磁盘等全系统范围指标必须要与应用指标相关联。为给出更完全的系统健康状况视图,可以对请求吞吐量这样的应用指标和 CPU 占用率这样的系统指标进行可视化。

应用性能管理(Application Performance Management,APM)工具

APM 工具提供数据采集、数据存储和数据可视化这些基础性操作。通常是由代理负责采集数据并将数据发送给数据存储,并使用 Web 界面以集中在 Web 请求上的仪表盘方式对数据进行可视化。

APM 可用于:

  • 对 Web 应用性能做整体可视化;
  • 对特定的 Web 请求性能进行可视化;
  • 在 Web 应用性能变差时或者多个错误出现时,自动发送告警;
  • 在业务量大时,对应用的响应方式进行验证。

这里给出了实例。

下面并非详尽地列出了支持对 ASP.NET 和 IIS 开箱即用的 APM 工具清单:

基础设施监控工具

基础设施监控工具在主机层面采集指标,这可更完整地反映性能。这些指标是在硬件和软件层面采集的。

轻量级分析工具

轻量级分析工具为特定 Web 请求提供了高层次的指标,并在开发人员浏览 Web 页面时就可提供实时反馈。这些工具可用于所有的环境类型中(包括开发环境、QA 验证、模拟环境、生产环境等),因此非常适合于对特定页面性能的快速评估。

与相应的具有完全功能的分析工具相比,轻量级分析工具的本质差异在于它们并非附属于过程,这意味着在使用轻量级分析工具时无需操心它们所产生的开销。

在开发环境中,轻量级分析工具对当前正编写的代码提供了实时反馈。这对于发现 N+1 或响应时间慢等问题是非常有用的,因为响应时间总是显示在页面的一角上。

用性能计数器填补空白

Windows 系统中的性能计数器(Performance counter)提供了硬件和软件层次上不同方面的指标。监控工具通常以性能计数器为报告方式,例如 CPU 和内存占用情况。但是通常会缺失一些有用的计数器,例如垃圾回收时间等。最切实可行的入门方法是使用基本列表并在迭代中添加必要的相关计数器。此外,使用 perfmon 对性能计数器进行实时地采集和可视化是可行的。在很多情况下,将用户定制指标或插件与 APM 工具进行集成也是可行的。

SQL 工具

由于在很多应用中普遍地使用了数据库,持久层(即 SQL 数据库)常常成为性能的瓶颈。用于 SQL 监控的专业工具可提供资源使用指标,以及一些特定的指标,例如等待时间、每秒编译次数等,在这里仅列举几个。

在提供下列数据情况下,可以发现一些类型的问题并可对性能进行改进:

  • 在一个或数个查询上存在过度的吞吐量;
  • 过度的 CPU 占用,这暗示了查询问题的存在或者是索引的缺失;
  • 可被缓存的高吞吐量查询。

SQL 监控工具包括:

其它的持久系统

所有子系统都需要在某种程度上进行监控。对于低吞吐量或非关键的系统,简单的数据采集和可视化即足矣。在此外的情况下则需要更加高级的、专业的监控。

代码分析工具

当已确诊某个特定页面或代码段检测是响应慢的,代码分析工具可为性能问题鉴定提供最详尽的视图。代码分析工具还可为数据库查询和 Web 请求这样的外部调用提供了精准视图。

分析工具:

内存分析工具

内存监控和垃圾回收指标有助于潜在问题的检测。但这些指标在显示了存在问题的同时,通常并未给出问题的所在。如果需要队内存和垃圾回收问题进行深入地探究,内存分析工具就可派上用场。

分析工具:

用户端分析工具

性能问题也可能来自于前端。当前这个问题十分常见,因为以 JavaScript 主导的单页应用的大量涌现。所有的主流浏览器都已嵌入了诸如代码分析和内存分析这样的工具。显示事件和请求的序列的工具有利于一眼就确定问题是源于前端还是后端。

工具:Tools:

页面分析工具

高层次客户端工具为发现并解决性能问题的提供了便利着手点。这些工具可以针对响应时间问题的产生根源提供高层次的视图,并给出一些相应的建议。例如 Google 的 PageSpeed Insights 就是这样的一个免费工具。

系统性能相关的因素和工具的数量是非常之多,这看上去似乎十分复杂。但是它们可以用一个词进行概括:数据。对系统有一个清晰的和准确的视图,这使得推理性能问题成为可能。这也使你可以在现场学习如何去解决性能问题,因为性能指标和图表将会引导你去发现到底是什么影响了系统性能。

关于作者

Pierre-Luc Maheu 是一位软件开发人员,过去五年中先后供职于 VoIP、cloud hosting 和 e-commerce。现供职于 Amilia 公司,一家提供在线注册管理 SaaS 平台的公司。他当前的兴趣在于监控、性能和规模化及 F#。在闲暇时间喜欢去做室内攀岩、Animal Flow 运动和剑道,这样有利于清空大脑。

查看英文原文: Getting Started with ASP.Net Performance Monitoring and Optimization


感谢百占辉对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-10-30 17:025180
用户头像

发布了 227 篇内容, 共 74.9 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

线上环境大规模RocketMQ集群不停机优雅升级实践,面试字节跳动Java工程师该怎么准备

Java 程序员 后端

终于彻底搞清楚了 MySQL spin-lock 之一次CPU问题定位过程总结

Java 程序员 后端

网络编程六-网络编程相关面试题汇总,nginx运行原理

Java 程序员 后端

绝了!你一直想要的数据库界的里程碑,Alibaba技术官内部私藏MySQL笔记

Java 程序员 后端

网关性能大PK,Spring Cloud Gateway让人大失所望!,java教程pdf百度云下载

Java 程序员 后端

老生常谈:MySQL高可用,java泛型原理

Java 程序员 后端

聊聊多线程(一)线程的基础,linux集群架构师

Java 程序员 后端

精通springcloud:服务发现,Eureka API,java技术上难以解决的问题

Java 程序员 后端

系统性能典型案例分析:高性能队列Disruptor,一文深入理解(1)

Java 程序员 后端

老夫面试两个月真实经历:面试了20家大厂之后,发现这样介绍项目经验

Java 程序员 后端

聊聊MyBatis的历史,mysql原理详解

Java 程序员 后端

系统性能典型案例分析:高性能队列Disruptor,一文深入理解

Java 程序员 后端

网络协议从入门到底层原理(11)网络爬虫,线程池底层实现原理

Java 程序员 后端

美团二面:聊聊线程池设计与原理,由表及里趣味解析,linux操作系统实用教程课后答案

Java 程序员 后端

群晖DS218+做maven私服(nexus3),mysql性能调优

Java 程序员 后端

老大让我优化数据库,我上来就分库分表,他过来就是一jio

Java 程序员 后端

聊聊MySQL主从复制的几种复制方式,上岸蚂蚁金服

Java 程序员 后端

终于彻底搞清楚了 MySQL spin-lock 之一次CPU问题定位过程总结(1)

Java 程序员 后端

[ CloudWeGo 微服务实践 - 04 ] 尝试操作数据(1)

baiyutang

golang 微服务 10月月更

网页制作工具之------Dreamweaver界面,springmvc教程下载

Java 程序员 后端

老面试官问我:LRU 和 Innodb Buffer Pool 有什么关系?

Java 程序员 后端

系统性能百倍提升典型案例分析:高性能队列Disruptor(1)

Java 程序员 后端

系统性能百倍提升典型案例分析:高性能队列Disruptor,linux服务器架构师

Java 程序员 后端

绝杀!3位阿里大牛发布这份800页MySQL性能优化法则笔记

Java 程序员 后端

精雕细琢!阿里大师53天悉心打磨出来的MyBatis+设计模式架构指南

Java 程序员 后端

终于等到了!十位Java架构师整理的“阿里P7,看完老板哭着让我留下来

Java 程序员 后端

缓存穿透及解决方案(干货篇),java基础入门第二版第二章答案

Java 程序员 后端

网络协议从入门到底层原理(5)传输层,java编程项目实例教程

Java 程序员 后端

老板,运维和开发又打起来了!,你连基础的JVM运行时内存布局都忘了

Java 程序员 后端

聊聊RabbitMQ RabbitMQ相关面试题,kafka入门教程步骤

Java 程序员 后端

聊聊多线程(四)线程安全之AtomicInteger类,最全面试考点与面试技巧

Java 程序员 后端

ASP.NET性能监控和优化入门_.NET_Pierre-Luc Maheu_InfoQ精选文章