- Python 3.13에 새로운 JIT 컴파일러 구축 방법론(copy-patch)이 도입된 후, 이를 PostgreSQL에 적용해보기로 결정함.
- pg-copyjit라는 새로운 방식을 소개하며, 이는 PostgreSQL 서버의 속도를 향상시키는 방법임.
- 모든 코드는 실험적이며, 실제 운영 환경에서 사용하기 전에 전문가의 검토가 필요함.
처음에는 JIT가 없었고, 그 다음 LLVM JIT 컴파일러가 등장했다
- PostgreSQL에 LLVM을 사용한 JIT 컴파일이 도입되었으나, LLVM은 JIT 컴파일에 적합하지 않은 부분이 있음.
- LLVM 최적화는 비용이 많이 들고, 사용하지 않으면 컴파일 자체가 무의미할 수 있음.
- PostgreSQL의 쿼리 비용 추정은 실제 실행 시간과 직접적인 관련이 없어, 많은 사용자가 JIT 컴파일러를 비활성화함.
2021년, copy-and-patch가 설명되었다
- 빠르고 충분한 코드를 가능한 빠르게 생성할 필요가 있음.
- copy-patch 방식은 C로 작성된 스텐실(템플릿 함수)을 사용하여 코드를 빠르게 생성함.
- 스텐실을 새로운 메모리 영역에 복사하고 구멍을 메워 '컴파일된' 함수로 바로 점프할 수 있음.
PostgreSQL에 copy-and-patch 도입하기
- PostgreSQL에 새로운 JIT 엔진을 구축하는 것은 그리 어렵지 않으며, LLVM을 플러그인으로 만들어 다른 JIT 컴파일러를 도입할 수 있도록 제안됨.
- 단일 _PG_jit_provider_init 함수를 제공하고, compile_expr, release_context, reset_after_error 세 가지 콜백을 초기화하는 것으로 충분함.
- copy-patch 알고리즘은 간단하며, 각 opcode에 대한 스텐실을 찾아 추가하고, 필요한 값을 구멍에 채워 넣음.
현재 상태
- PostgreSQL 16에서 작동하며, 현재는 AMD64만 지원함.
- 코드 생성은 몇 백 마이크로초 만에 완료되어 짧은 쿼리에도 사용 가능함.
- 아직 최적화 단계가 아니지만, 성능은 이미 인터프리터에 비해 개선된 것을 볼 수 있음.
- 구현된 opcode가 적지만, 아직 지원하지 않는 쿼리에 대해서는 PostgreSQL 인터프리터가 대신 실행함.
할 일...
- 이는 개념 증명 단계이며, 쉽게 빌드하거나 패키징할 수 있도록 만드는 것은 아직 고려 대상이 아님.
- 더 많은 opcode를 구현하고 최적화를 찾는 데 집중하고 있음.
- 다른 아키텍처로의 이식도 심각하게 고려 중임.
감사의 말
- 현재 직장인 Entr’ouvert에 감사를 표하며, 동료들이 이 프로젝트에 시간을 할애할 수 있도록 지원해줌.
- DBA 친구들에게도 감사를 표하며, PoWA를 사용해보라고 권장함.
GN⁺의 의견
- 이 기사는 PostgreSQL 데이터베이스 서버의 성능을 향상시키기 위한 새로운 접근 방식을 소개함. 이는 데이터베이스 관리자와 개발자들에게 흥미로운 내용일 수 있음.
- 실험적인 코드를 실제 운영 환경에 적용하기 전에는 철저한 테스트와 검증이 필요함. 이는 데이터 손실이나 다운타임과 같은 위험을 방지하기 위함임.
- LLVM과 같은 기존의 JIT 컴파일러와 비교했을 때, copy-patch 방식은 더 빠른 코드 생성을 가능하게 하여 짧은 쿼리에도 유용할 수 있음.
- 이 기술이 PostgreSQL 커뮤니티에 널리 받아들여진다면, 다양한 아키텍처에 대한 지원 확대와 함께 데이터베이스 성능 최적화에 새로운 장을 열 수 있음.
- 비판적인 시각에서 볼 때, 아직 초기 단계이며 실제 성능 향상이 실제 운영 환경에서 어떻게 나타날지는 더 많은 연구와 개발이 필요함.