LabHub
배우기 러닝패스 코스

資本市場と決済

どの区間が遅いのか、そしてあのマイナスは何か

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

주문 1500건의 구간 타임스탬프에서 구간별 지연을 계산하고, 호스트 시계 오프셋으로 보정해 시계 오차와 진짜 결함을 가른 뒤, 구간별 백분위수와 전체 꼬리를 만드는 구간을 따로 세어 어디를 고쳐야 하는지까지 좁힙니다.

왜 중요한가

"느립니다" 라는 신고에는 고칠 자리가 없습니다. 경로에 자를 대고 구간으로 쪼개야 고칠 팀이 정해집니다. 쪼개고 나면 두 가지 함정이 기다립니다. 첫째는 음수입니다. 양 끝이 다른 기계인 구간에는 두 기계의 시계 오차가 그대로 섞여 있어서 진짜 회선 시간보다 시계 차이가 크면 값이 음수가 됩니다. 이것을 측정 고장으로 여겨 버리면 나중에 상대와 이야기할 근거를 잃고, 반대로 통째로 시계 탓으로 묶으면 그 안에 섞인 진짜 한 건을 놓칩니다. 둘째는 백분위수입니다. 구간별 p99 가 가장 큰 구간과 전체 지연의 꼬리를 만드는 구간은 같지 않습니다. 앞은 구간마다 서로 다른 주문을 보고 있고, 뒤는 한 주문 안에서 무엇이 컸는지를 봅니다. 이 둘을 섞으면 엉뚱한 곳에 돈을 씁니다.

단계

  1. python3/root/lat/dataspans.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/dataspans.jsonl·offsets.json·spec.json·budget.json 을 만듭니다. 난수를 쓰지 않는 생성 스크립트를 그대로 쓰세요.

고객 자료를 그대로 가져올 수 없으니 같은 모양의 합성 자료를 만듭니다. 난수를 쓰지 않아야 누가 몇 번을 돌려도 같은 자료가 나오고 서로의 판정을 대조할 수 있습니다. 백분위수 정의와 예산을 자료 옆에 적어 두는 것이 이 실습의 핵심 습관입니다.

자료의 모양 세기

/root/lat/shape.jsonorders·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.jsonraw_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.jsoneligible 이 정한 주문입니다.

백분위수 정의는 spec.json 에 있습니다. 정렬한 뒤 자리를 p*(n-1)/100 으로 잡고 0부터 세며, 자리가 정수가 아니면 이웃한 두 값 사이를 보간해 half up 으로 반올림합니다. 전부 정수 연산으로 할 수 있습니다. total 은 수신부터 ack 수신까지이고, 이 값은 양 끝이 같은 기계라 보정이 필요 없습니다. 평균은 정수 나눗셈으로 버립니다.

전체 꼬리를 만드는 구간 세기

/root/lat/tail.csv 에 첫 줄 segment,tail_orders 를 두고 구간 다섯 줄을 모두 적고, /root/lat/tail.jsonthreshold_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.jsoneligible_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.jsonworst_segment·degraded_minutes·onset_minute·end_minute·supported·ruled_out 을 적으세요.

분 버킷은 보정된 수신 시각을 60초로 나눈 몫입니다. 어떤 분의 구간 p99 가 그 구간 전체 p50 의 10배 이상이면 그 분은 열화한 분이고, 열화한 분이 가장 많은 구간이 가장 나쁜 구간입니다. 가설 넷의 판정 규칙은 spec.jsonhypotheses 에 적혀 있습니다. 규칙대로 계산해 지지되는 것과 배제되는 것을 가르고, 두 목록 모두 식별자를 오름차순으로 적으세요.