Page 388 - 《软件学报》2025年第9期
P. 388
王尚 等: 基于神经网络的分布式追踪数据压缩和查询方法 4299
解码前 c 个字符, 然后对后续所有字符, 遵循以下流程依次解码.
(1) 模型利用 c 个字符的窗口预测下一个字符的概率分布.
(2) 算术编码利用概率估计解码下一个字符.
(3) 向后滑动窗口, 用于下一轮的模型预测.
在解码过程中, 算术编码按照编码时相同的概率统计表划分 (0, 1) 的实数区间, 并根据编码数字所落的子区
间输出对应的符号. 然后, 选择对应的子区间, 并在选择的子区间上继续执行下一轮的划分和解码过程. 具体公式
如下:
∑ j
y i
( )
k
k=1 i
i
, s i = arg y , i ∈ {1,...,n}
j N r
o = ∑
i
y
k=1 k (3)
i
L i = L i−1 +(H i−1 − L i−1 )·o
r−1
i
H i = L i−1 +(H i−1 − L i−1 )·o
r
其中, r 表示编码数字在第 i 次解码时所处子区间的位置. 解码的过程相当于编码过程的逆运算, 算术编码重复执
行上述过程逐步确定编码前的符号, 直至所有符号完成解码.
为保证无损解压, 解压时使用压缩时相同的初始网络模型和同样的随机数种子, 并在 T 个时间步后通过反向
传播更新模型参数.
编码器解压后的数据是追踪数据的数字表示, 需要进一步还原为原始的文本表示. 重构器在这一步执行预处
理阶段的反向操作, 方法首先利用组合字典和索引字典还原字段的键值表示, 然后根据追踪的开始时间为每个跨
度重新计算开始与结束时间, 最后从对应的结构中还原出跨度之间的调用关系.
4 实验分析
为了验证本文所提出方法的有效性, 我们使用 Python 实现了 NCQT, 并使用来自多个开源微服务系统的追踪
数据进行评估. 本节主要围绕以下 3 个问题展开实验验证.
● RQ1: 本文提出的方法与通用压缩算法相比压缩效果和效率如何?
● RQ2: 本文提出的方法与追踪查询工具相比存储开销和查询性能如何?
● RQ3: 相关超参数和可选优化对实验结果有何影响?
4.1 实验设置
本节所有实验均在 Ubuntu 20.04 机器上进行, 该机器配有 36 核 CPU、125 GB 主存以及 4 块 24 GB 的
NVIDIA GeForce RTX 3090 显卡.
4.1.1 实验数据
根据以往研究的经验, 我们选择了 Train Ticket (https://github.com/FudanSELab/train-ticket) [49,50] 、Sock Shop
(https://github.com/microservices-demo/microservices-demo) 、Robot Shop (https://github.com/instana/robot-shop) 和
Astronomy Shop ( https://github.com/open-telemetry/opentelemetry-demo) 这 4 个不同的开源微服务系统用于生成评
估数据集. 在 GitHub 的开源微服务系统中, 以上系统使用了多种开发语言, 拥有较多的微服务数量, 且服务间的调
用关系相对复杂.
实验使用 OpenTelemetry 生成分布式追踪数据. 具体而言, 我们使用 OpenTelemetry Operator 为每个服务注入
和配置 OpenTelemetry 自动插桩库, 并将微服务系统部署在一个含有 4 个节点的 Kubernetes 集群上, 每个节点拥
有一个 8 核 CPU 和 15 GB 内存. 为了收集和存储追踪数据, 我们在集群中部署了 OpenTelemetry Collector 和
Grafana Tempo.
表 2 展示了从 4 个微服务系统中收集到的数据的详细信息, 这些数据集中的追踪数据是通过负载生成器模拟
不同用户请求生成的. 已有的研究发现, 神经网络压缩大文件往往时延较长, 于是我们构建了较小的数据集进行初

