后台优化:使用应用性能管理工具

在没有应用性能管理工具(APM,即application performance management )的时候,当我们需要对应用优化,我们就需要不断的调试、阅读源码才能找到问题。如果这是一个多人协作的项目,对项目进行优化的难度,也会随着代码量的升高而不断加大。而了解应用性能瓶颈的最好方法就是:查看程序中运行时间最长的部分。在这时,我们就可以考虑使用性能管理工具来分析应用的性能。

这些性能管理工具运行在应用低一层的底层——语言层面,在应用运行的时候,他们的探针就会开始运行,并不断地收集应用的数据。这些数据将会被收集起来,发送给系统后台,这时我们就可以在后台上了解应用的运行状况。性能管理工具会分析应用的五个维度:

  • 终端用户体验监控,分析用户加载、渲染时间等等有关于用户体验的事项。
  • 应用运行时架构,监控应用程序的所有节点和服务器等等。
  • 用户自定义的事务分析,监控用户自定义的事务,或者一些与业务相关的 URL 页面定义等等。
  • 应用组件监控,对应用程序的中间件进行监控。
  • 报告及应用数据分析,为应用程序提供度量和报告,并对其进行可视化。

同时,性能管理工具将使用应用性能指数(英语 Apdex,全称:Application Performance Index),来衡量用户对于应用性能的满意值。

Apdex 定义了应用程序响应的最优时间为 T,同时根据这个目标时间 T 定义了三种不同的性能表现:

  • 满意:应用响应的时间低于或等于目标时间(T秒),用户的工作不会因为加载时间过长而受阻。
  • 可容忍:用户感觉到响应滞后,响应时间大于目标时间(T秒),但是用户能忍受这个过程。
  • 挫折:响应时间大于四倍的目标时间(T秒),用户无法忍受这个过程,便会离开网页。

下面我们将 New Relic 作为应用性能管理工具,来分析和展示应用程序的性能。

使用 New Relic 进行优化

New Relic 是国外知名的监控服务商,它可以实时地对应用进行监控和分析。我们选择使用 New Relic 的主要原因是,它提供了一个免费的、无期限基础版本。对于一般的小型 Web 应用来说,这个免费版本就够用了,这个版本里包含了一般应用需要的:吞吐量、应用响应时间、错误报告、数据库度量等等的功能。专业版里提供了一些高级的功能,这些功能更适合于中、大型的 Web 应用,如部署追踪、服务地图、衡量负载报告等等的功能。

由于我们的应用在线上的数据比较少,我将继续使用我的博客(https://www.phodal.com/)的数据来展示:如何用 New Relic 来进行分析。我博客也是基于 Django 来开发的,因此不需要担心与这里内容不符合的问题。博客每天的访问量在 500 左右,因些数据本身也是足够用的。

New Relic 安装

在开始之前,我们希望读者已经注册好了一个 New Relic 账号,注册地址:https://newrelic.com/signup。

登录 New Relic 之后,我们就可以集成 New Relic 到我们的应用里。New Relic 可以支持基于 Ruby、PHP、Java、.NET、Python、Node.js、Go 等语言或者技术的应用,我们使用的是 Python,选择完后就可以开始进行相关的设置。这个设置的过程是:

  • 获取一个密钥
  • 再用这个密钥生成一个配置文件
  • 重新运行我们的应用

如官网的步骤所示:

New Relic 设置步骤

我们在网页端获取密钥,随后安装 newrelic 的库

sudo pip install newrelic

再根据我们的密钥来生成相应的配置文件,命令如下:

newrelic-admin generate-config <your-key-goes-here> newrelic.ini

可以将我们的配置文件放到项目的相应位置,然后我们就可设置这个环境变量,并运行程序:

export NEW_RELIC_CONFIG_FILE=newrelic.ini newrelic-admin run-program gunicorn -w 2 growth_studio.wsgi

这里的 newrelic-admin run-program就会在我们的应用与语言的底层之间,创建一个钩子(Hook)来监听应用对函数的调用等等的内容。在我们完成设置的几分钟过后,我们就可以在后台看到我们的数据,并根据这些数据来分析应用的情况。

使用 New Relic 分析应用

现在我们可以打开 New Relic 的后台来,在 APM 页面我们就可以看到应用信息的基本信息:

基本信息

如图所示,左侧是服务端处理的响应时间,即从我们的应用接受到请求,到返回 HTML 给 HTTP 服务器的时间。图中分为两个颜色:较大的那部分是 Python 语言运行的时间,即运行我们的应用逻辑所说的时间:平均每个请求大概需要 200 ms 左右。而数据库相关部分则需要花费 30+ ms。图中的右上部分:显示的就是 Apdex 值,右下则显示的是网站的吞吐量。

对于大型应用来说,其瓶颈应该是相反的:即处理数据库花费更长的时间,而应用花费的时间会更短。对于我的博客来说,因为服务器性能的问题,所以运行逻辑代码的时间会比较长一些。

在概览的下方,我们就能看到页面的处理函数及服务器响应时间的关系,如下图所示:

不同函数的响应时间

从图中,我们就可以看到不同函数的处理时间。图中 mezzanine.blog.views 模块中的 blogpostlist 函数处理请求需要 690 ms,这个页面是博客的列表页。因此我们就能针对性的,了解一下为什么这个方法需要这么多的时间?于是,我们就可以点击进入这个函数的详细信息,就可以得到类似下图的一个分析页:

响应时间图表

从上图中,我们就可以看到 blog_post_list_post_content块花费了相当多的时间来执行。我们也可以看到一些更详细的信息,如下就是模板文件中不同函数的执行时间:

除了上面的应用性能分析,New Relic 还可以查看页面的渲染时间。与 Google Analytics 相比,New Relic 在分析渲染时间的粒度上会更细。如下图所示:上面的表格说明了,我们的应用时间主要花费在渲染页面上。在我们的列表页上,我们需要渲染多篇博客、关键字信息、按时间来分类等等的信息,因此需要比较长的时间。同时,这也说明了这个页面还有优化的空间。尽管我们无法避免用户访问这个页面,但是我们可以使用缓存等等的方法,来尽量减少执行这个方法的次数。这样一来,我们就可以大大地提高应用的性能。

New Relic 页面渲染

上图中的加载时间,分为了四部分:

  • 应用程序的处理时间
  • 网络传输时花费的时间
  • DOM 解析时间
  • 页面渲染的时间

由于网络原因,这个渲染时间并不是那么准确。建议读者参考就好了,或者关注于类似 PageSpeed 这样的网页性能优化。

节选自《全栈应用开发:精益实践》第七章《数据分析和性能优化》

原文发布于微信公众号 - phodal(phodal-weixin)

原文发表时间:2017-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

微服务架构组件分析

服务描述:服务调用首先解决的问题就是服务如何对外描述。 常用的服务描述方式包括 RESTful API、XML 配置以及 IDL 文件三种。

15540
来自专栏Linyb极客之路

微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发持续集成的流程。平台提供基础设...

66710
来自专栏FreeBuf

炫酷的渗透系统Parrot Security OS

Parrot Security OS是一款基于Debian渗透测试系统,集成了诸多流行渗透测试工具,并以其漂亮的UI而出名。 部分内置工具 aircrack-n...

35360
来自专栏ImportSource

消费者驱动的微服务契约测试套件Spring Cloud Contract

在微服务架构下,你的服务可能由不同的团队提供和维护,在这种情况下,接口的开发和维护可能会带来一些问题,比如服务端调整架构或接口调整而对消费者不透明,导致接口调用...

434120
来自专栏ChaMd5安全团队

【荐】Web Application Penetration Testing中文译作

(英文原版地址:https://www.exploit-db.com/docs/english/44319-web-application-security-t...

18240
来自专栏做全栈攻城狮

Python教程:操作数据库,MySql的安装详解

本教程是基于Python语言的深入学习。本次主要介绍MySql数据库软件的安装。不限制语言语法,对MySql数据库安装有疑惑的各位同仁都可以查看一下。

13820
来自专栏進无尽的文章

基础篇-服务器工作实现的浅析

对于一个前端开发的人员来说,了解服务器的基础知识,个人觉得是非常必要的,于是就有一个这篇侧重于Java的服务器相关知识的文章,只是简单介绍对于我也是一个拓展。

16120
来自专栏CodingToDie

分布式事务解决方案

Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及...

68750
来自专栏EAWorld

微服务之服务调用与安全控制

近年来,大多数企业IT软件均在向微服务架构转型,由于微服务架构采用了更细粒度的分布式拆分,对于服务调用安全方面的问题更复杂,更需要重视,需要整体的系统化解决方案...

23030
来自专栏CDA数据分析师

工具 | Python Web 开发的十个框架

Python 是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外,Python标准 ...

337100

扫码关注云+社区

领取腾讯云代金券