TSF微服务无法查看JVM监控问题
问题背景
我们在利用TSF开发微服务的时候,特别是在Spring Cloud框架下,为了使更好应用服务在各种条件之下能够稳定持久的运行,需要对运行服务程序的底层相关资源、JVM虚拟机的堆栈信息进行监控。TSF提供了JVM监控相关组件,可以查看服务运行实例的CPU使用率、堆内存使用量,火焰图等信息。但是有时候会遇到配置了JVM监控但是无法具体监控图,显示空白等问题,JVM相关日志也无法查看,这个时间我们就需要对相关配置以及相关配置进行排查。
原因分析
1、tsf-agent 版本过低。
使用 JVM 监控功能时,实例的 tsf-agent 需为 1.21.0 或以上版本。如果 agent 版本过低,JVM 监控功能无法使用您需要对 agent 进行升级。
2、GC 日志配置被覆盖。
JVM 日志的采集依赖于 TSF 的 GC 日志配置。如果您自定义了 GC 日志配置,将会覆盖 TSF 的 GC 日志配置,这将导致无法在界面中查看 JVM 日志。
解决方案
1、JVM 如何升级 tsf-agent?
首先我们需要对tsf-agent进行升级操作:
- VM 场景:您需要把实例移出集群后,再重新移入集群,重新部署服务实例。
- 容器场景:您需重新编写 dockerfile,生成新的镜像后重新部署服务实例。
这里我们先介绍下如何制作容器镜像。
Spring Cloud 应用构建材料:
我们需要在 Dockerfile 中增加 JVM 监控组件TencentCloudJvmMonitor
然后在 CMD 命令中启动该组件。
注意:将 Spring Cloud 应用 JAR 包和 JVM 监控组件放在同级目录下,并在该目录下编写 Dockerfile。
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
RUN yum update -y && yum install -y java-1.8.0-openjdk
# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/
# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar 包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}
# JVM 监控组件要和您的 Dockerfile 位于同一级目录,并创建 JVM 监控数据采集目录
ENV agentjar TencentCloudJvmMonitor-1.0-RELEASE.jar
COPY ${agentjar} ${workdir}
RUN mkdir -p /data/tsf_apm/monitor/jvm-metrics/
# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
# 使用 JVM监控功能需要加上 gclog 和 javaagent 的配置, 否则将无法提供 jvm 监控能力
CMD ["sh", "-ec", "exec java -Xloggc:/data/tsf_apm/monitor/jvm-metrics/gclog.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=8 -XX:GCLogFileSize=50M -javaagent:${workdir}/${agentjar}=hascontroller=true ${JAVA_OPTS} -jar ${jar}"]
这里我们需要注意的是:
JVM 监控功能依赖 javaagent,jdk1.5 以后才引入了 javaagent 技术,所以您需使用 jdk1.6 及以上版本,建议您使用 jdk1.8。
2、火焰图采集失败如何处理?
火焰图适用于在 CPU 利用率持续较高的情况下进行热点函数分析。 在如下场景下,火焰图采集可能失败:
- 数据量过大:目前火焰图的数据量上限为2MB,超出时会采集失败;此时,请缩短所选择的采集时间后,重新进行采集。
- 当前无热点函数:进程处于低 CPU 消耗状态,即当前无热点函数时,火焰图采集可能失败(无法采集到热点函数);此时,可尝试延长采集时间后重新采集,或待服务请求量较大时再重新采集。
- 无法和进程建立连接:发生无法和实例连接等异常情况时,采集任务会执行超时;此时,请您检查实例的连接状态,确认状态正常后再重新采集。
3、为何无法查看 JVM 日志?
JVM 日志的采集依赖于 TSF 的 GC 日志配置。如果自定义了 GC 日志配置,将会覆盖 TSF 的 GC 日志配置,这将导致无法在界面中查看 JVM 日志。
以上就是解决在使用TSF遇到JVM相关监控无法看到、以及JVM日志无法查看相关问题的一些解决办法,供大家参考下。
- 像tomcat容器那样自定义一个 Classloader
- react+redux+webpack教程5
- TensorFlow-9-词的向量表示
- Hadoop和Zookeeper安装过程中出现的问题解决
- Ryu和OpenStack集成
- react+redux+webpack教程2
- C/C++ Development using Visual Studio Code, CMake and LLDB
- TensorFlow-10-基于 LSTM 建立一个语言模型
- jquery及原生javascript对jsonp解决跨域问题实例详解
- css负边距之详解
- Python进阶教程(三)
- Python进阶教程(二)
- Python进阶教程(一)
- TensorFlow-11-策略网络
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- canvas详解
- DDD(领域驱动设计),你必须知道的贫血模型和充血模型
- input的类型大全
- 树形结构--二叉树以及二叉树的遍历(十七)
- TEA算法解析
- localStorage sessionStorage
- 伪类
- js拖拽
- 灵魂拷问:你真的理解System.out.println()打印原理吗?
- 移动端video的项目
- 移动端(video) transformOringe addEventListener
- clip-path
- 移动端的box-shadow
- 杭电的题,输出格式卡的很严。HDU 1716 排列2
- 移动端的(-webkit-linear-gradient -webkit-radial-gradient)