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  个微服务系统中收集到的数据的详细信息, 这些数据集中的追踪数据是通过负载生成器模拟
                 不同用户请求生成的. 已有的研究发现, 神经网络压缩大文件往往时延较长, 于是我们构建了较小的数据集进行初
   383   384   385   386   387   388   389   390   391   392   393