Java应用程序性能调优的神器 - Glowroot

in #cn4 years ago

最近遇到一个Java Web应用中的性能问题。在某个时段程序的响应时间过长。在分析了日志后没有任何头绪。于是祭出了Glowroot这个Java性能调优的神器,终于将问题找了出来。下面把这个强悍的工具向大家介绍一下。

image.png

安装及配置

首先在其官网下载压缩包。如果对其源码感兴趣的话,这里是其Github页面。将压缩文件下载并解压缩后会在相应子目录(glowroot)中看到glowroot.jar这个文件。

由于我是对Tomcat容器中的程序进行性能调优,因此需要将Glowroot对应子目录的所有者改为运行Tomcat的用户,我这里是”tomcat”。这么做的主要原因是因为Glowroot在运行时需要创建logs, tmp等子目录并要在其中创建文件。

sudo chown tomcat:tomcat glowroot

接下来需要在启动Tomcat的时候添加JVM的参数。如果是通过apt方式安装的Tomcat,那么配置文件在:/etc/default/tomcat8,添加如下内容:

-javaagent:/opt/york/digilib/glowroot/glowroot.jar

至此,就可以进行测试了。重新启动Tomcat,访问本机的4000端口:

http://localhost:4000

就可以看到Glowroot的主界面了:

image.png

主要性能指标

首先,在Glowroot中可以很方便的查看响应时间的瓶颈,甚至能定位到具体的某个类。比如,在下图中可以看到spring controller占用了响应时间的83.9%,这肯定不正常。其实,我性能调优最后的结论就是spring controller出的问题。最终的解决方案也是基于这个发现的。

image.png

还可以查看各个线程的资源使用,同样,其分析结果直指spring中的doGet方法:
image

除此之外,还有对各种REST API调用的分析等。

进一步配置

Glowroot有一个配置文件:admin.json。在刚安装的时候,你是找不到这个文件的。你可以选择自己手工创建它。但由于刚开始使用时不知道该如何进行配置,这里建议先不要管它,直接重新启动Tomcat,这样在Glowroot被首次启动后,就会在其目录下创建admin.json这个文件。这个时候你就可以在其基础上进行修改了,这样就会简单的多。

Glowroot的默认配置下,只能从本机访问,如果要从外部访问,可以更改这一段:

"bindAddress": "0.0.0.0",

如果要更改端口:

"port": 4000,

默认设置下,匿名账户具有管理员权限,这肯定是要改的。以下会添加新用户’admin’,将匿名用户(anonymous)的角色改为’Anonymous’,并添加一个新的角色“Anonymous”:
"users": [
{
"username": "admin",
"password": "xxxxxxxx",
"roles": [
"Administrator"
]
},
{
"username": "anonymous",
"roles": [
"Anonymous"
]
}
],
{
"name": "Anonymous",
"permissions": [
"agent:transaction",
"agent:error",
"agent:jvm:gauges",
"agent:jvm:threadDump",
"agent:jvm:heapHistogram",
"agent:jvm:mbeanTree",
"agent:jvm:systemProperties",
"agent:jvm:environment",
"agent:config:view",
"admin:view"
]
}

总结

之前也用过jvisualvm进行Java应用程序的性能调优,但感觉它特别吃内存,会严重影响服务器的性能。Glowroot似乎没有这个问题,添加这个模块后并没有感觉服务器的性能下降。同时,感觉Glowroot更加直观好用,能够迅速定位到出问题的类,以及相应的线程。从而帮助你快速找到问题的根源所在。

Coin Marketplace

STEEM 0.24
TRX 0.11
JST 0.032
BTC 61572.53
ETH 2995.53
USDT 1.00
SBD 3.73