背景
最近因为线上项目的定时任务用的是同一个线程,两个定时任务 一个在3点跑,一个在4点跑,结果3点的那个异常之后,4点的就没跑(已经找到原因:因为配置定时器默认走的一个线程,当3点哪个异常之后 4点的就不会跑了,解决方法可以配置线程池,让每个定时都重新建新的线程,详情可以百度),所以就想着找一个能监控服务器线程、内存、cpu的手段,百度了半天 ,网上有的是用jdk的原生工具,有的是在linux命令,但是我发现,都不够直观。
然后找到一个之前我再本地测试用的工具Jprofiler,因为之前是在本地跑的,没有在linux服务器搞过,所以在网上找了半天教程,好多教程要么没说明白,要么照着弄了之后,发现还不行,然后我就在各个版本的说法中,结合好几个教程上的说法,终于成功了,所以决定写一篇博客整合一下,然后分享给大家,亲测可用哦
Jprofiler介绍
在此之前给大家先介绍下Jprofiler
JProfiler是由ej-technologies GmbH公司开发的一款性能瓶颈分析工具(该公司还开发部署工具)。
- 使用方便
- 界面操作友好
- 对被分析的应用影响小
- CPU,Thread,Memory分析功能尤其强大
- 支持对jdbc,noSql, jsp, servlet, socket等进行分析
- 支持多种模式(离线,在线)的分析
- 跨平台
具体安装
关于这个软件的具体使用我个人还在摸索中(等我自己用的熟练了,可以写一个具体的使用说明),现在给大家说一下如何在你本地安装这个软件监控线上的项目:
-
登录官网下载JProfiler的客户端[https://www.ej-technologies.com/download/jprofiler/files]
由于我自己是mac系统,所以我下载的是mac版本的
-
将下载下来的软件安装到你的本地电脑上(安装步骤就不再说明)
-
根据自己的服务器系统类型,给服务器也下载一个[没错,不仅要在你电脑上装,还需要在服务器装],由于我服务器的系统是linux的,所以我装的是linux版本的
注意:linux版本的Jprofiler是不需要序列号,只有你本地装的软件是需要序列号的,这里还是不建议大家使用破解版的。 -
将下载到的软件安装到linux服务器上
我的安装目录是在/opt/jp 下面
-
安装完成只有,选择你要监控的tomcat,然后修改你tomcat的启动文件bin/catalina.sh 里面加上这一段代码
export CATALINA_OPTS="-agentpath:/opt/jp/jprofiler9/bin/linux-x64/libjprofilerti.so=port=10001,nowait"
10001是监听端口 你电脑Jprofiler想监听线上tomcat,就靠这个端口
/opt/jp/jprofiler9/bin/linux-x64/libjprofilerti.so 这个是你这个软件在你服务器的路径,我的是装在了/opt/jp 里面 -
然后重启tomcat,看见日志打印有这个,就代表成功了。
-
打开你本地的Jprofiler,然后新建一个连接
-
选择远程连接服务器,并且选择你的服务器的系统版本
-
选择服务器上的JVM供应商和版本号
-
选择模式,选择中间的
关于他们三个菜单的解释-
Wait for JProfiler GUI模式
JVM将等待JProfiler Agent接收到JProfiler GUI发送的配置信息后再进行启动( 即Lauch Type连接模式 ,启动一个新的JVM实例) -
Prepare for profling模式
立即启动JVM,稍后再与JProfiler GUI进行连接并向JProfiler Agent发送配置信息( 数据的采集方式、过滤器、触发器等信息 )
*若使用此模式则需要让JVM在启动时自动加载JProfiler Agent,因此需要在startup.bat/startup.sh文件中添加命令startup.bat:set CATALINA_OPTS=-agentpath:{JProfiler安装目录}\bin\windows-x64\jprofilerti.dll=port=8849,nowait %CATALINA_OPTS% startup.sh:CATALINA_OPTS=-agentpath:/{JProfiler安装目录}/bin/linux-x64/libjprofilerti.so=port=8849,nowait $CATALINA_OPTS export CATALINA_OPTS
-
Profile Offine模式
离线分析,JProfiler GUI无法与JProfiler Agent进行连接,因此需要将数据的采集方式、过滤器、触发器等信息打包成config.xml配置文件,在启动该JVM实例时加载JProfiler Agent以及配置文件,使用此模式需要配合triggers触发器使用,当发生指定的事件后触发指定的操作.
若使用此模式则需要让JVM在启动时自动加载JProfiler Agent和context.xml配置文件,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat: set CATALINA_OPTS=-agentpath:{JProfiler安装目录}\bin\windows-x64\jprofilerti.dll=port=8849,nowait,config=C:\Users\{用户名}\.jprofiler9\config.xml %CATALINA_OPTS% startup.sh: CATALINA_OPTS=-agentpath:/{JProfiler安装目录}/bin/linux-x64/libjprofilerti.so=port=8849,config={预定义目录}\config.xml $CATALINA_OPTS export CATALINA_OPTS ```
-
-
将服务器ip填上
-
将你jprofiler在服务器上安装路劲填上
-
填写监听端口 端口在第5步的时候在tomcat启动文件那儿配的,和那儿保持一致就行
-
最后选择稍后启动,然后点击完成就行
-
然后点击start Center,在弹出来的页面就可以看到你刚才配置的连接了,然后点击start
-
点击之后,会弹出一个页面,让你选择模式,然后你根据自己需要了解的数据需求来选择
- Instrumentation重构模式
JProfiler将对需要分析的class字节码文件中写入自己的bytecode,对于正在运行的JVM实例选择此模式将会重新加载字节码文件到JVM的运行时数据区域结构中.
这是JProfiler全功能模式,在此设置中,调用堆栈信息是准确的,但是CPU开销可能很高( 取决于Filter的控制 ),若要分析的类较多,则对应用的性能产生影响,因此使用此模式一般配合Filter使用,只对特定的类或包进行分析. - Sampling抽样模式
此模式对CPU的开销非常低,但不支持某些功能( 方法的执行次数、执行时间等 ), 这种模式在连接正在运行的JVM实例时更为安全.
- Instrumentation重构模式
-
最后弹出的页面直接确定就行
可能出现的问题
- 服务器上按照步骤都配置了,本地还是连接不上
解决:有可能是监听端口防火墙没开,将端口打开iptables -I INPUT -p tcp --dport 10001 -j ACCEPT #开启10001端口
总结
最后大功告成,这个软件网上教程很多,我照着好几个教程配置都不行,最后有好几次想要放弃,最后还是坚持下来,希望大家在技术的道路上不要碰到困难就和我一样想要放弃。 最后谢谢大家抽时间看我的博客 ,有什么问题可以留言哦