arthas排坑(一):远程监控

一、arthas简介

      为了进一步提升自己的技术,最近有计划深入研究一些开源项目,于是在github上找到了arthas。它是阿里开源的Java诊断工具,据官方文档所述,它可以帮助你解决下列问题:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?

二、远程监控

      在很多时候,我们的项目都是在线上运行的。无论是从安全还是从效率的角度看,我们都不应该直接登录远程服务器监控JVM的状态。因此远程监控这个功能在我看来很有必要。
      查阅官方文档之后,我发现arthas提供了两种远程监控的方式:Web Console和telnet。Web Console是通过网页访问的方式进行监控,telnet则是通过telnet协议进行远程监控。这两种方式都要在被监控端启动arthas监控Java进程。

三、我遇到的坑

      arthas的输入命令有几个可选参数:一个是target-ip,一个是telnet-port,还有一个是http-port。一开始,我以为ip是远程计算机(被监控端)的地址,port是远程计算机的端口,然后再启动arthas时输入特定的ip和端口就可以实现远程访问,然而这种理解是错误的。查阅Issues后才发现,arthas不可以直接远程连接,启动arthas时输入的ip和端口都是本机暴露给外界的ip和端口。
      知道了ip和端口的作用之后,我又踩入了另一个坑。由于ip和端口都有默认值,所以我在启动时不指定。待远程连接时,连接端会报“Connection refuse”错。啥?我又被拒绝了!!!我怀疑过防火墙、操作系统、JVM版本,但最终都和这些没关系。罪魁祸首在target-ip。在启动时我们指定哪个target-ip,在远程连接时我们才能访问。就比如:启动时默认的target-ip是127.0.0.1,如果我们不指定,就只能通过127.0.0.1这个地址进行监控(也就是只能在本地监控)。因此,为了实现远程监控,我们在启动时要指定target-ip为外界能访问的本机地址(我的是192.168.0.106)。如果不指定或指定target-ip为127.0.0.1,就只能被本机访问。

四、总结

      说了一大堆,最有用的是下面这句。在arthas的远程监控中如果遇到“Connection refuse”错误,要先确认这个端口是否被防火墙屏蔽。在防火墙没有屏蔽这个端口的情况下,还有一个可能是target-ip参数指定错误。它需要被指定为外能访问的本机ip,不指定或者指定为127.0.0.1都有可能导致“Connection refuse”错误。

你可能感兴趣的:(java,arthas)