pgrust, 벤치마크 결과 조작 적발돼 제거
원제 Remove pgrust: the entry is cheating
124 포인트댓글 67
Key Point
특정 벤치마크에 맞춘 하드코딩과 캐싱으로 성능을 부풀린 사례가 공개돼, 오픈소스 벤치마크의 신뢰성을 지키는 과정을 보여준다.
핵심 요약
- ClickBench 벤치마크에서 pgrust 항목을 제거했다. 이 엔트리는 43개 벤치마크 쿼리 각각에 대해 손으로 작성한 커널(q00.rs~q36.rs)을 포함하고 있었다.
- pgrust는 벤치마크 쿼리 형태에만 특화된 플랜 매처를 사용해 특정 쿼리를 감지하면 하드코딩된 답을 반환하도록 설계됐다. 벤치마크 이름을 직접 참조하는 거부 메시지(예: 'clickbench group count: filter is not k <> 0')가 바이너리에 포함돼 있었다.
- Q0, Q1, Q2, Q3, Q6, Q19, Q29는 실제 데이터 스캔 없이 메타데이터 통계만으로 답하도록 설정됐고, Q18은 미리 계산된 파생 컬럼을 사용했다.
- 더 심각한 문제는 필터 검증 결과를 캐싱하는 메커니즘으로, Q20, Q21, Q23의 2차 이후 실행은 캐시된 이전 결과를 재생하기만 한다. 실제 측정 결과 Q20은 첫 실행 10.8초에서 2차 실행 11ms, 3차 실행 5ms로 떨어졌고, 캐시 설정을 꺼도 3~4ms로 유지된 이유는 설정으로 비활성화할 수 없는 구조였기 때문이다.
- 벤치마크의 43개 쿼리 외 약간만 변형된 쿼리는 실행 거부되며, 실제 일반 실행 경로가 없다. 'SELECT MIN(URL) FROM hits' 같은 기본 쿼리도 'sqe engine serves columnar shapes with no fallback' 오류로 실패했다.
- pgrust v0.4-preview 바이너리는 공개되지 않은 비공개 버전이며, 공개된 v0.3 소스 코드에도 동일한 구조가 확인됐다. 벤치마크 규칙은 결과 캐시를 비활성화할 것을 요구하는데, pgrust는 이를 위반했다.
- pgrust의 43개 쿼리에 대한 답은 정확했지만, 이는 실제 데이터베이스를 측정한 것이 아니라 벤치마크 쿼리에 맞춘 조회 테이블을 측정한 것이다.