자본시장과 결제 · 주문 경로의 지연을 구간으로 쪼개기 · 실습
어느 구간이 느린가, 그리고 그 음수는 무엇인가
목표
주문 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 에 적습니다.
참고
- 시각과 지연은 마이크로초 정수로 다룹니다. 부동소수를 쓰면 마지막 자리가 흔들려 백분위수가 어긋납니다.
- 보정 시각은 기록된 시각에서 그 시각을 찍은 기계의 오프셋을 뺀 값입니다. 게이트웨이 시각은 그 주문을 다룬 호스트가, 거래소 접수 시각은
exch-1이 찍습니다. 누가 찍었는지는spec.json의events에 있습니다. - 백분위수 정의는
spec.json의percentile에 있습니다. 선형 보간이고 자리는p*(n-1)/100을 0부터 세며, 보간값은 half up 으로 반올림합니다. 평균은 정수 나눗셈으로 버립니다.statistics.quantiles의 기본값은 이 정의와 다르니 그대로 쓰지 마세요. - 5단계부터 8단계까지의 대상은
spec.json의eligible이 정한 주문입니다. 여섯 시각이 모두 있고 보정 구간 지연 다섯 개가 모두 0 이상인 주문입니다. - 분 버킷은 보정된 수신 시각을 60초로 나눈 몫입니다. 기록된 시각으로 나누면 호스트마다 경계가 어긋납니다.
- 흔한 실수 1: 한 구간이 통째로 음수라고 전부 시계 탓으로 묶는 것. 보정 뒤에도 남는 것이 있는지 반드시 확인하세요.
- 흔한 실수 2: 구간별 p99 가 가장 큰 구간을 그대로 꼬리의 원인으로 적는 것. 6단계가 두 답이 다르다는 것을 보여 줍니다.
- 자료 파일은 1단계가 만듭니다. 생성 스크립트는
/root/lat/mkdata.py, 계산 도우미는/root/lat/lib.py에 둡니다. 채점기는 자료를 표준형으로 바꿔 지문을 대조하므로 자료를 손으로 고치면 모든 단계가 막힙니다. - 공개 문서: [RFC 5905](https://www.rfc-editor.org/rfc/rfc5905), [statistics](https://docs.python.org/3/library/statistics.html), [time](https://docs.python.org/3/library/time.html), [FIX Standards](https://www.fixtrading.org/standards/). 주문 1500건과 오프셋 보고는 이 실습의 합성 자료입니다.
단계 8개
- 구간 타임스탬프와 오프셋 보고 만들기
- 자료의 모양 세기
- 보정하지 않은 구간 지연과 음수 찾기
- 오프셋으로 보정해 시계 오차와 진짜 결함 가르기
- 구간별 백분위수 내기
- 전체 꼬리를 만드는 구간 세기
- 예산 두 벌의 초과 건수 견주기
- 언제부터 나빠졌는지와 배제한 가설 적기