TT Lab
开始
学习 学习路径 课程

资本市场与清结算

哪一段慢,还有那个负数是什么

在 TT Lab 中继续学习

目标

根据 1500 笔订单的区段时间戳计算各区段的延迟,用主机时钟偏移量校正,把时钟误差与真正的缺陷区分开,再分别统计各区段的百分位数,与造成整体尾部的区段,进而把需要修复的位置缩小到某一处。

为什么重要

“很慢”这条反馈里没有可以修复的位置。给路径量好尺寸,拆成区段,要去修的团队才会确定。拆开之后有两个陷阱在等着。第一个是负数。两端是不同机器的区段,混有两台机器的时钟误差,如果时钟之差比真实的线路时间还大,值就会变成负数。如果把它当作测量故障,日后就会失去与对方交涉的依据;反过来,如果统统归于时钟的错,混在其中的那个真正的一笔就会被漏掉。第二个是百分位数。各区段 p99 最大的区段,与造成整体延迟尾部的区段并不相同。前者在每个区段看的是不同的订单,后者看的是一笔订单内部是什么大。把这两者混在一起,钱就会花到不相干的地方。

步骤

  1. 用 python3 在 /root/lat/data 中生成 spans.jsonl、offsets.json、spec.json 和 budget.json。
  2. 数出数据的形态,写入 /root/lat/shape.json。
  3. 计算未经校正的区段延迟,写入 /root/lat/raw_stats.json 和 /root/lat/raw_negative.csv。
  4. 用偏移量校正,在 /root/lat/clock_split.csv、/root/lat/defects.csv 和 /root/lat/adjust_summary.json 中区分原因。
  5. 把各区段的百分位数写入 /root/lat/percentile.csv。
  6. 取出整体延迟的尾部,写入 /root/lat/tail.csv 和 /root/lat/tail.json。
  7. 把两套预算的超出笔数写入 /root/lat/budget_over.csv 和 /root/lat/budget_summary.json。
  8. 把按分钟统计的趋势写入 /root/lat/trend.csv,把缩小范围后的结论写入 /root/lat/report.json。

参考

生成区段时间戳和偏移量报告

用 python3 在 /root/lat/data 中生成 spans.jsonl、offsets.json、spec.json 和 budget.json。请原样使用不使用随机数的生成脚本。

不能直接拿来客户的数据,所以要做出形态相同的合成数据。不使用随机数,是为了无论谁运行多少次都得到同样的数据,才能互相对照判定。把百分位数的定义和预算写在数据旁边,是本实验的核心习惯。

数出数据的形态

在 /root/lat/shape.json 中写入 orders、segments、hosts、complete_orders、incomplete_orders、missing_by_field 和 segment_n。

每个区段可以统计的订单数不同。因为只要缺了一个时间,使用这个时间的两个区段就都无法计算。segment_n 是每个区段两端时间都有的订单数,complete_orders 是六个时间都有的订单数。不要把两者混在一起。

未经校正的区段延迟,并找出负数

在 /root/lat/raw_stats.json 中为每个区段写入 n、negative、min_us 和 max_us,并在 /root/lat/raw_negative.csv 中,首行写 segment,host,negative_orders,min_us,max_us,只写出现了负数的区段与主机的组合。

区段延迟是用后面的时间减去前面的时间,这里还不做校正。出现负数的原因有两种。两端是不同的机器,混入了时钟之差;或者在同一台机器内,时间被反着打了。先不要区分,只数它们集中在哪里。没有负数的组合不写。

用偏移量校正,区分时钟误差与真正的缺陷

在 /root/lat/clock_split.csv 中,首行写 segment,host,raw_negative,adjusted_negative,cause,在 /root/lat/defects.csv 中,首行写 order_id,host,segment,raw_us,adjusted_us,并在 /root/lat/adjust_summary.json 中写入 raw_negative、explained_by_clock、real_defects、roundtrip_offset_free_orders 和 eligible_orders。

校正时间是记录的时间减去打下该时间的机器的偏移量。校正之后如果一个负数都没有留下,就是 시계오차,全都留下,就是 진짜결함,只留下一部分,就是 섞임(这三个韩文值依次意为“时钟误差”“真正的缺陷”“混合”)。roundtrip_offset_free_orders 是从线路发送到收到 ack 的值在校正前后相同的订单数。两端是同一台机器打的,请先想一想应该出现多少笔。

求各区段的百分位数

在 /root/lat/percentile.csv 中,首行写 segment,n,p50_us,p95_us,p99_us,max_us,mean_us,写入五个区段的五行,以及 total 一行。对象是 spec.json 的 eligible 所确定的订单。

百分位数的定义在 spec.json 里。排序后,位置取 p*(n-1)/100 并从 0 开始数,如果位置不是整数,就在相邻的两个值之间插值,并按 half up 舍入。全部都可以用整数运算来做。total 是从接收到收到 ack,这个值两端是同一台机器,所以不需要校正。平均值用整数除法舍去。

数出造成整体尾部的区段

在 /root/lat/tail.csv 中,首行写 segment,tail_orders,把五个区段全部写出,并在 /root/lat/tail.json 中写入 threshold_us、tail_orders、top_p99_segment、top_tail_segment 和 same。

尾部订单,是校正后的 total 延迟大于等于 total 的 p99 的订单。为每笔订单挑出最大的一个区段来计数,如果值相同,就选数据所定的区段顺序中靠前的。top_p99_segment 是第 5 步中各区段 p99 最大的区段,top_tail_segment 是这里被选中最多的区段。如果两者不同,same 就是假。一笔订单都没有被选中的区段,也要写 0。

比较两套预算的超出笔数

在 /root/lat/budget_over.csv 中,首行写 budget,segment,over_orders,为每套预算各写五个区段的五行,并在 /root/lat/budget_summary.json 中写入 eligible_orders,以及每套预算的 over_orders、over_ppm 和 worst_segment。

区段的值超过上限就是超出。相等则不算超出。over_orders 是只要有一个区段超过就算的订单数,不是各区段超出笔数之和。一笔订单超过两个区段,也只计一次。over_ppm 是百万分率,所以请用整数除法得出。worst_segment 是各区段超出笔数最多的区段,相同则取数据所定顺序中靠前的。

写下从什么时候开始变差,以及排除的假设

在 /root/lat/trend.csv 中,首行写 minute,segment,n,p99_us,为每个分钟桶写出各区段的 p99,并在 /root/lat/report.json 中写入 worst_segment、degraded_minutes、onset_minute、end_minute、supported 和 ruled_out。

分钟桶是校正后的接收时间除以 60 秒所得的商。某一分钟的区段 p99,如果大于等于该区段整体 p50 的 10 倍,这一分钟就是劣化的分钟,劣化的分钟最多的区段就是最差的区段。四个假设的判定规则,写在 spec.json 的 hypotheses 里。按规则计算,区分出被支持的和被排除的,两个列表都请把标识符按升序写出。