使用应用程序性能管理解决Java生产问题

Dan Delany最初出现在《 JAX》杂志上,与New Relic一起在大海捞针。

跟踪生产系统中的问题可能是一场噩梦,但是诸如New Relic之类的应用程序性能管理系统(将隔离的日志文件以及网络和数据库监视结合在一起)可以提供帮助。

在生产系统中查找和解决问题可能非常困难。 通常在问题出现时,用户已经在抱怨。 在管理人员的眼中解决这些问题对任何人都没有乐趣,尤其是当您不知道问题可能在哪里时。

您可能会或可能不会访问有问题的服务器,并且可能必须诊断涉及多个服务器的问题。 有时涉及第三方,例如数据库管理员(DBA)或托管公司,对您而言,问题不是优先考虑的事情。 根据日志文件的详细程度,您可能可以搜索它们并找到一些提示。 也可能是您的代码正在使用第三方jar,并且它们可能未记录您所需的详细程度。

APM如何提供帮助

通常可以从日志文件,网络监视,数据库服务器监视等中获取有用的信息。 那里的问题是您试图从已经决定记录的信息中推断出有关代码行为的信息。 如果您更改日志记录以添加更多信息,则为时已晚。 错误已经发生。

应用程序性能管理(APM)系统允许您远程检测代码并将数据连续记录到外部系统。 由于几个原因,这是有利的。 由于此数据收集和日志记录是在后台进行的,因此您无需在软件开发过程中考虑日志记录指标。 当您需要有关软件在生产中的性能的信息时,该信息已在系统正常运行期间为您收集。 它是在实际生产环境下的实际系统负载下收集的,与来自模拟负载下的测试系统的数据相反。 这也意味着,当生产中发生错误(例如性能问题或线程问题)时,有关该错误的数据已经收集并可用。

除了提供诊断问题的帮助之外,APM系统还可以通过提供有关访问频率最高的页面以及服务器生成这些页面所花费的时间的指标,提供对代码性能和使用模式的更多可见性。 一旦确定页面需要改进,APM可以帮助您深入了解服务器花费最多时间的位置。 这使您可以确定修复的优先级。

例如,此页面显示有关我们办公室站点的统计信息,其中显示了人们的联系信息。 这是一个很小的网站,但是它可以让您了解APM可以告诉您的内容。 我们看到使用量激增,可以看到在应用程序代码和数据库代码中花费了多少时间。 从图1中可以看出,PeopleController#phonenumbers页面是该站点上最慢的页面。

图1:摘要信息中心:显示有关New Relic中应用程序的常规统计信息

在本文中,我将演示如何使用New Relic的APM系统来帮助确定生产性能问题。 我使用单个servlet创建了一个演示应用程序,该servlet接受名字和姓氏,并使用Hibernate在数据库中搜索具有该名字的条目。 将APM添加到系统非常简单:首先,我只需要设置一个包含代码和配置的附加目录,其中包含从New Relic下载的zip文件的内容。

6:/opt/local/apache-tomcat-7.0.34/newrelic% ls
CHANGELOG               newrelic-extension-example.xml
LICENSE         newrelic-extension.xsd
README.text     newrelic.jar
logs            newrelic.yml
newrelic-api.jar
7:/opt/local/apache-tomcat-7.0.34/newrelic%

创建目录后,可以通过对启动脚本进行简单更改来激活New Relic。 在这种情况下,更改位于Tomcat的catalina.sh脚本中。

# ---- New Relic switch automatically added to start command on 2013 Jan 08, 11:43:26

NR_JAR=/opt/local/apache-tomcat-7.0.34/newrelic/newrelic.jar; export NR_JAR

JAVA_OPTS="$JAVA_OPTS -javaagent:$NR_JAR"; export JAVA_OPTS

图2:Web Transactions页面显示了四个非常慢的servlet调用

使用此新标志启动服务器后(请参见图2 ),它将向New Relic报告数据。 然后可以挖掘数据,以帮助您在代码运行时对其进行监视。

在这种情况下,很容易发现图3所示的性能问题。 我的单个servlet每次运行都需要8000到9000毫秒之间的时间。

图3:“事务跟踪”页面显示了在特定的Servlet调用中花费的时间

仪表板向我们显示问题出在运行长时间的QueryServlet上。 据透露,这是一个数据库查询,它占用了6ms的慢请求。 由于我在持久层中使用了Hibernate,因此它为我生成了SQL。 调整SQL代码可能不是一件容易的事( 图4 )。

进行更深入的了解可以确切地告诉我们哪个查询速度很慢:

select person0_.id as id0_, person0_.fname as fname0_, person0_.lname as lname0_, person0_.middlename as middlename0_ from person person0_ where frame+? and lname=?

图4:“事务跟踪”上的“ SQL详细信息”选项卡显示了New Relic捕获SQL

现在,我可以将该查询发送到我的DBA,并询问如何使该查询运行更快( 图5 )。 事实证明这是一个简单的解决方案。 该查询仅针对具有超过2100万行的单个表,并且该查询的“ where”子句中的任何列都没有索引。

图5:DBA工具显示查询的表未为我们的查询建立索引

DBA已在表中添加了一些索引。 现在,我可以再次运行该应用程序,并在 图6中 看到更改的结果

图6:事务跟踪显示添加表索引后的相同servlet调用
结论

我们将系统响应时间从8470ms缩短到20ms,这在一个简单的案例中是巨大的改进。 但最重要的是,我能够在浏览器中以有组织的方式获取所需的所有信息。 我没有浪费任何时间登录服务器,查看日志文件或类似的东西。 我也不需要更改源代码中的任何内容即可启用此数据收集。 我将New Relic jar添加到服务器启动脚本中,然后,我的服务器在后台将信息记录到New Relic。 在New Relic网站上,我能够找到我的性能问题。 我深入研究了缓慢的Web事务,查看了事务的不同部分以了解最慢的事务,并根据这些结果采取了行动。

这是一个简单的演示,其中,一旦识别出慢查询,就可以很明显地解决问题,但是它说明了应用性能管理的价值。 它不仅可以用来发现性能问题,还可以用来衡量生产环境中的应用程序,因此您可以知道在哪里花费时间和金钱来改善系统。

作者简介: Dan自1996年以来一直在编写Java代码,目前是位于Portland的New Relic的一名高级软件工程师。 当他不在工作时,他喜欢和儿子一起玩火车,并为他的iPhone编写与火车模型相关的软件。

本文首次发表在《 JAX杂志:套接字到他们》中。 对于其他先前的问题, 请单击此处


翻译自: https://jaxenter.com/fixing-java-production-problems-with-application-performance-management-106039.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值