- 欢迎使用 SkyWalking
- 观测分析语言 Observability Analysis Language, OAL
- 仪表系统
- 设计目标
- 为什么 SkyWalking 体系中没有使用 MQ?
- 探针简介
- 观测分析平台
- 可视化
- 选择接收器
- 服务自动打点代理
- 手动打点 SDK
- 服务网格探针
- SkyWalking Java 代理支持列表
- 设置
- 协议
- 作用域 Scopes 和字段 Fields
- 概念与设计
- Backend 启动
- Backend 存储
- 安装 Java agent
- Open Fetcher
- 概念与设计总览
- 设置开发环境
- 组件库设置
- 插件自动测试框架
- 使用命令行导出
- 操作名称分组规则
- Spring 注解插件
- Oracle 和 Resin 插件
- 支持忽略自定义的 trace
- 支持自定义增强
- 配置覆盖
- 支持传输层安全性协议(TLS)
- 命名空间
- 令牌认证
- 令牌认证
- 兼容 OpenTracing 的 Skywalking tracer
- 安装 log4j
- 安装 log4j2
- logback 插件
- 应用程序工具包跟踪
- 跨线程追踪
- 通过系统属性动态定义 agent 配置文件
- 插件开发指南
- 在 Kubernetes 中部署
- 通过 ALS 观测服务网格
- UI
- 与 Istio 协作
- 配置 Envoy 来向 SkyWalking 发送度量指标
- 快速入门
- V6 升级
- SkyWalking 跨进程传播的头部协议
- OAP server 支持 gPRC SSL 传输
- 贡献指南
- 数据存储扩展
- 启动模式
- 设置的覆盖
- IP 和端口设置
- 初始化模式
- 集群管理
- 服务器端的跟踪采样
- 慢 SQL 语句设置
- 官方 OAL 脚本
- 告警
- 高级部署
- Metrics Exporter
- TTL
- 动态配置
- 无法打点的网关/代理
- 应用性能指数
- 端点分组参数化
- 后台遥测数据
- Apache SkyWalking 代码提交者
- 如何构建项目
- 新度量指标的源和范围扩展
- 后端存储实体扩展
- 线程转储归并机制
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
线程转储归并机制
性能概要是APM系统中的一个增强特性. 我们使用线程转储来估算方法执行时间,而不是添加许多局部span。 这样,与使用分布式跟踪来定位慢方法相比,资源成本要低得多。该特性适用于生产环境。本文档介绍如何将线程转储作为堆栈树归并到最终报告中.
线程分析
读取数据并进行转换
从数据库中读取数据并将其转换为gRPC中的数据结构.
st=>start: Start
e=>end: End
op1=>operation: Load data using paging
op2=>operation: Transform data using parallel
st(right)->op1(right)->op2
op2(right)->e
复制代码并将其粘贴到此 链接以生成流程图.
- 使用流按页读取数据(每页50条记录).
- 以并行流的形式将数据转换为gRPC数据结构.
- 合并到数据列表中.
数据分析
使用Java并行流中的group by和collector模式根据数据库记录中的第一个堆栈元素进行分组, 并使用collector执行数据聚合. 生成一个多根树.
st=>start: Start
e=>end: End
op1=>operation: Group by first stack element
sup=>operation: Generate empty stack tree
acc=>operation: Accumulator data to stack tree
com=>operation: Combine stack trees
fin=>operation: Calculate durations and build result
st(right)->op1->sup(right)->acc
acc(right)->com(right)->fin->e
复制代码并将其粘贴到此 链接以生成流程图.
- 按第一个堆栈元素分组:使用每个堆栈中的第一级元素分组,确保堆栈具有相同的根节点e.
- 生成空栈:生成多个顶级空树,为下一步做准备, 生成多个顶级树的原因是可以并行地添加原始数据,而不需要生成锁.
- 累加数据至栈中: 将每个线程转储添加到生成的树中.
- 遍历线程转储中的每个元素,以查找父元素中是否有具有相同代码签名和相同堆栈深度的子元素. 如果不是,则添加此元素.
- 保留原节点中的转储序列和时间戳.
- 合并所有堆栈: 使用与
累加器
相同的规则将所有树结构组合成一个树结构. 1.使用LDR遍历树节点。使用堆栈
数据结构来避免递归调用,每个堆栈元素表示需要合并的节点. 2. 合并两个节点的方法是合并其子节点的列表. 如果它们具有相同的代码签名和相同的父节点,则在此节点中保存转储序列和时间戳. 否则,需要将节点作为新的子节点添加到目标节点中. - 计算时间并生成结果: 计算相关统计数据并生成响应.
- 使用与
合并所有堆栈
步骤相同的遍历节点逻辑. 转换为GraphQL数据结构,并将所有节点放到一个列表中,以用于后续的持续时间计算. - 并行计算每个节点的持续时间. 对于每个节点,对序列进行排序,如果有两个连续序列,持续时间应该添加这两个seq的时间戳的持续时间.
- 并行计算每个节点的执行. 对于每个节点,当前节点的持续时间应该减去所有子节点消耗的时间.
- 使用与
配置文件数据调试
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论