Java服务通过动态开关 Profiling 实现关键问题定位-故障定位

作者 观测云 高级技术专家 深圳办公室 黄小龙

简介

Profile 通过收集和分析应用程序运行过程中 CPU、内存和 I/O 相关的数据,可以识别应用程序的性能瓶颈和错误,帮助我们更好地了解程序的运行情况。Profile 是一种非常有价值的技术,通过 Profile 可以实现:

  • 识别性能瓶颈: Profiling 可以帮助发现程序的性能瓶颈,即程序中最耗费时间的部分。通过识别性能瓶颈,以便我们采取措施来优化这部分性能。
  • 优化程序性能: 通过 Profiling 收集的数据,我们可以知道程序的哪些部分需要进行优化。通过优化这些部分,可以提高程序的性能,减少资源的消耗。
  • 排查程序错误: 在应用程序中,有时会出现各种错误。通过 Profiling 分析程序的运行情况,我们可以找到错误的原因,并及时进行修复。

利用**观测云**可以快速收集应用程序 Profile 数据,利用 Profile 火焰图查看器分析 Java 、Python 、 Go 不同语言环境下应用程序运行过程中的动态性能数据,直观 查看每一个方法、类和线程的调用关系和执行效率。通过关联链路,获取链路相关 Span 的关联代码执行片段,实现方法级代码性能追踪,帮助开发人员发现代码优化方向。

收集应用程序 Profile 数据,会对应用程序本身性能造成一定的影响,所以一般情况下不建议在生产环境实时启动 Profile 数据收集,在 Kubernetes 部署的应用程序可以通过动态开关打开 Profile 数据采集,从而实现对应用程序的关键问题定位。


前置条件

安装 DataKit

登录观测云控制台,选择「集成」-「DataKit」-「Kubernetes」,按照所提示的安装步骤下载 datakit.yaml,并配置 DataWay 数据网关地址。

打开 Profile 采集器

修改 datakit.yaml 文件,ConfigMap 加入 Profile 采集配置:

apiVersion: v1
kind: ConfigMap
metadata:name: datakit-confnamespace: datakit
data:profile.conf: |-  [[inputs.profile]]## profile Agent endpoints register by version respectively.## Endpoints can be skipped listen by remove them from the list.## Default value set as below. DO NOT MODIFY THESE ENDPOINTS if not necessary.endpoints = ["/profiling/v1/input"]## set true to enable election, pull mode onlyelection = true## go pprof config## collect profiling data in pull mode#[[inputs.profile.go]]## pprof url#url = "http://localhost:6060"## pull interval, should be greater or equal than 10s#interval = "10s"## service name#service = "go-demo"## app env#env = "dev"## app version#version = "0.0.0"## types to pull## values: cpu, goroutine, heap, mutex, block#enabled_types = ["cpu","goroutine","heap","mutex","block"]#[inputs.profile.go.tags]# tag1 = "val1"## pyroscope config#[[inputs.profile.pyroscope]]## listen url#url = "0.0.0.0:4040"## service name#service = "pyroscope-demo"## app env#env = "dev"## app version#version = "0.0.0"#[inputs.profile.pyroscope.tags]#tag1 = "val1"

DaemonSet 添加相应的挂载配置:

volumeMounts:- mountPath: /usr/local/datakit/conf.d/profile/profile.confname: datakit-confsubPath: profile.conf

修改完成之后,安装 datakit.yaml 配置:

kubectl apply -f datakit.yaml

应用配置

本文以 Java 应用程序为例,介绍如何动态开关打开 Profile 数据采集。

安装 Datakit Operator

Datakit-Operator 通过 K8s 的 Admission Controller(准入控制器)功能,会向指定的 Pod 注入应用程序启动所需要的 dd-lib 探针文件,这样就不需要应用程序打包镜像时加入对应的探针文件,减少配置从而提高效率。

下载 datakit-operator.yaml文件并执行安装:

wget https://static.guance.com/datakit-operator/datakit-operator.yaml
kubectl apply -f datakit-operator.yaml

通过以下命令验证所有配置是否安装完成,正常会有 datakit 和 datakit-operator 两种类型的 Pod:

kubectl get pod -n datakit

修改 Dockerfile

修改应用 Dockerfile,暴露启动参数:

注意: java版本要求:java8版本需要高于8u262+,或者使用java11及以上版本。

FROM openjdk:8u292RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezoneENV jar my-service.jar
ENV workdir /data/app/
RUN mkdir -p ${workdir}
COPY ${jar} ${workdir}
WORKDIR ${workdir}
ENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar} ${PARAMS} 2>&1 > /dev/null"]

应用部署 yaml

添加以下环境变量,通过 ENV_PROFILE 环境变量来动态控制 Profile 数据采集:

env:
- name: DD_AGENT_HOSTvalueFrom:fieldRef:apiVersion: v1fieldPath: status.hostIP
- name: ENABLE_PROFILEvalue: "true"
- name: JAVA_OPTSvalue: |--javaagent:/datadog-lib/dd-java-agent.jar -Ddd.service=my-service  -Ddd.profiling.enabled=$(ENABLE_PROFILE) -Ddd.profiling.allocation.enabled=$(ENABLE_PROFILE) -Ddd.env=env -Ddd.agent.port=9529

添加 annotation,位置 spec.template.metadata 下:

annotations:admission.datakit/java-lib.version: ""

生产环境部署时,ENV_PROFILE 环境变量可以设置为 false,需要排查性能问题时,再打开 Profile 开关收集数据,从而实现动态采集 Profile 数据的功能。

完整 yaml 参考:

apiVersion: v1
kind: Service
metadata:name: my-servicenamespace: profilelabels:app: my-service
spec:selector:app: my-serviceports:- protocol: TCPport: 9299nodePort: 30001targetPort: 9299type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:name: my-servicenamespace: profilelabels:app: my-service
spec:replicas: 1selector:matchLabels:app: my-servicetemplate:metadata:labels:app: my-serviceannotations:admission.datakit/java-lib.version: ""spec:containers:- name: my-containerenv:- name: DD_AGENT_HOSTvalueFrom:fieldRef:apiVersion: v1fieldPath: status.hostIP- name: ENABLE_PROFILEvalue: "true"- name: JAVA_OPTSvalue: |--javaagent:/datadog-lib/dd-java-agent.jar -Ddd.service=my-service  -Ddd.profiling.enabled=$(ENABLE_PROFILE) -Ddd.profiling.allocation.enabled=$(ENABLE_PROFILE) -Ddd.env=env -Ddd.agent.port=9529image: my-service:v1.0imagePullPolicy: IfNotPresentports:- containerPort: 9299protocol: TCPrestartPolicy: Always

实现效果

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/111638.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用C#开发163邮件发送功能

创建SMTP服务器(发送邮件需要SMTP服务器代发) 这里介绍创建网易SMTP(SMTP是邮件通讯格式)服务器: 1.先注册一个163网易邮箱 2.注册成功后登陆该邮箱 3.在该邮箱中找到设置>POP3/SMTP/IMAP点击进入,如下…

网安之python基础学习作业(1)

目录 目录 前言 思维导图 1,Python中常见的数据类型 1.1数字类型(Number): 1.2字符串类型(String): 1.3.列表类型(List): 1.4.元组类型(T…

刷一下算法

记录下自己的思路与能理解的解法,可能并不是最优解法,不定期持续更新~ 1.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容…

【数据库主题文档上传激励活动】已开启!快来上传文档赢取奖励

自墨天轮社区的文档版块搭建至今,一直致力于为用户提供具有价值的技术资源与实操干货,此间也有非常多的用户加入进来,分享自己收藏的优质技术资源,共同为所有墨友搭建起一个丰富的技术资源“宝库”,十分感谢大家的支持…

微信小程序 按钮颜色

<button type"primary">主要按钮样式类型</button> <button type"default">默认按钮样式类型</button> <button type"warn">警告按钮样式类型</button> <view>按钮plain是否镂空</view> <bu…

最新清理删除Mac电脑内存空间方法教程

Mac电脑使用的时间越久&#xff0c;系统的运行就会变的越卡顿&#xff0c;这是Mac os会出现的正常现象&#xff0c;卡顿的原因主要是系统缓存文件占用了较多的磁盘空间&#xff0c;或者Mac的内存空间已满。如果你的Mac运行速度变慢&#xff0c;很有可能是因为磁盘内存被过度占用…

如何看待近期tiktok大批量封号问题?

近期大量客户反馈Tiktok账号大批量被封&#xff0c;了解这类客户的情况后&#xff0c;得知被封的账号大部分都是为搬运国内视频上传的账号类型&#xff0c;从这次的事件可以看出&#xff0c;tk对视频的检测以及内容要求度越来越高&#xff0c;Tk风控升级&#xff0c;回导致很多…

个人电脑怎么搭建服务器 花生壳内网穿透 设置路由器虚拟服务器

在个人电脑上搭建服务器并使用花生壳进行内网穿透&#xff0c;以及在路由器上设置虚拟服务器&#xff0c;需要一些步骤&#xff1a; 内网穿透设置&#xff1a; 配置内网穿透&#xff0c;选择服务器软件的端口号&#xff0c;然后将其映射到您的服务器的内部IP地址和端口号。这将…

kali搭建vulhub漏洞靶场

安装kali 下载kali作为虚拟环境&#xff0c; Get Kali | Kali Linux 通过vmvare打开&#xff0c;默认账号密码kali/kali 修改root密码 su passwd root 如果一些配置普通用户做不了就切换kali&#xff0c;或sudo 命令 kali配置 apt换源 echo > /etc/apt/sources.list v…

浏览器事件机制详解

目录 前言 事件类型 鼠标事件 表单事件 窗口事件 DOM事件 多媒体事件 拖拽与放置事件 移动设备事件 剪切板事件 错误事件 过渡、动画事件 事件监听 onevent addEventListener(event) 事件触发 事件流程 捕获阶段 目标阶段 冒泡阶段 事件对象 总结 相关代…

【深度学习 AIGC】stablediffusion-infinity 在无界限画布中输出绘画 Outpainting

代码&#xff1a;https://github.com/lkwq007/stablediffusion-infinity/tree/master 启动环境&#xff1a; git clone --recurse-submodules https://github.com/lkwq007/stablediffusion-infinity cd stablediffusion-infinity conda env create -f environment.yml conda …

【LeetCode-简单题】1047. 删除字符串中的所有相邻重复项

文章目录 题目方法一&#xff1a;利用栈做匹配方法二&#xff1a;消消乐 题目 方法一&#xff1a;利用栈做匹配 class Solution {public String removeDuplicates(String s) {Deque<Character> deque new LinkedList<>();StringBuffer str new StringBuffer();fo…