순서 어긋난 / 과거 데이터 입력의 성능 고려사항
순서 어긋난 / 과거 데이터 입력의 성능 고려사항 (Out-of-order / backfilled ingestion performance considerations)
시계열 데이터를 다루다 보면 "새로운 데이터가 항상 시간순으로 들어온다"는 보장이 없을 때가 있어요. 과거 타임스탬프(timestamp)를 가진 샘플을 나중에 삽입하는 것을 out-of-order(순서 어긋남) 또는 backfilled(과거 채움) 입력이라고 하는데, 이게 성능에 어떤 영향을 주는지 RedisTimeSeries가 직접 벤치마크로 측정해 공개한 내용을 정리해 볼게요.
왜 성능이 달라지는가
오래된 타임스탬프를 시계열에 삽입하면, 새 샘플의 시간대에 해당하는 청크(chunk) 메모리를 주 메모리에서 다시 가져와야 할 가능성이 있어요. 이 청크가 **압축된 청크(compressed chunk)**라면 삽입/업데이트 전에 먼저 디코딩(decoding)해야 하죠. 이 과정은 메모리 집약적이고, 디코딩은 연산(compute) 집약적인 작업이라 전체 입력 속도(ingestion rate)에 영향을 줍니다.
입력 성능이 중요하기 때문에, RedisTimeSeries는 out-of-order 입력 비율이 전체 고성능 TSDB 성능에 미치는 영향을 측정하고 투명하게 공개했어요.
측정에는 Go로 작성된 벤치마크 클라이언트를 사용했고, out-of-order 비율, 시리즈 압축 여부, 동시 클라이언트 수, 명령 파이프라이닝(pipelining) 등 시스템 성능을 좌우하는 핵심 요소를 제어할 수 있게 했죠. 벤치마크 드라이버의 전체 설정과 파라미터는 이 GitHub 링크에서 확인할 수 있어요.
모든 벤치마크 변형은 Amazon Web Services 인스턴스에서 실행됐고, 벤치마크 클라이언트와 데이터베이스 서버는 각각 별도의 c5.9xlarge 인스턴스에서 돌렸습니다. 테스트는 단일 샤드(single-shard) 구성에서 RedisTimeSeries 버전 1.4로 진행됐어요.
압축 청크의 out-of-order 영향 분석 (Compressed chunks out-of-order/backfilled impact analysis)
압축 청크에서는, out-of-order 데이터 포인트 하나가 청크 전체를 double delta 압축에서 완전히 해제(decompression)하는 것을 의미하므로, out-of-order 쓰기의 오버헤드가 더 높을 것으로 예상해야 해요.
경험칙으로, 압축된 out-of-order 성능을 높이려면 청크 크기(chunk size)를 최대한 줄이세요. 청크가 작을수록 double-delta 해제에 들어가는 연산이 적어 전체 영향이 줄어들지만, 단점은 압축 비율(compression ratio)이 낮아진다는 거예요.
아래 그래프와 표가 이 핵심 포인트를 보여줍니다:
- 데이터베이스가 현재 기본 청크 크기(바이트 단위 4096)로 out-of-order 샘플을 1% 받으면, 입력 속도에 대한 전체 영향은 10% 수준이에요.
- out-of-order 비율이 **5%, 10%, 25%**처럼 커지면 전체 영향은 ops/sec 기준 35%에서 75% 감소 사이가 됩니다. 이 수준의 out-of-order 비율이라면 청크 크기 줄이기를 진지하게 고려해야 해요.
- out-of-order 입력이 **99%**일 때도 달성 가능한 ops/sec가 최대 **95%**까지 떨어지는 것을 관찰했어요. (역시 청크 크기를 줄이면 그 영향을 절반으로 줄일 수 있죠.)
비압축 청크의 out-of-order 영향 분석 (Uncompressed chunks out-of-order/backfilled impact analysis)
아래 차트와 표에서 볼 수 있듯이, 비압축 청크에서는 청크 크기가 out-of-order 입력의 전체 영향에 영향을 주지 않아요 (256바이트 청크든 4096바이트 청크든 out-of-order 입력의 예상 영향은 동일하죠. 당연한 결과예요).
그 외에 다음과 같은 핵심 시사점을 얻을 수 있어요:
- 데이터베이스가 out-of-order 샘플을 1% 받으면 입력 속도에 대한 전체 영향은 낮거나 아예 측정 불가능한 수준이에요.
- out-of-order 비율이 **5%, 10%, 25%**처럼 높아지면 전체 영향은 5%에서 19%의 ops/sec 감소 수준입니다.
- out-of-order 입력이 **99%**일 때도 달성 가능한 ops/sec가 최대 **45%**까지 떨어지는 것을 관찰했어요.