4P by neo 6달전 | favorite | 댓글과 토론
  • 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 커뮤니티에 널리 받아들여진다면, 다양한 아키텍처에 대한 지원 확대와 함께 데이터베이스 성능 최적화에 새로운 장을 열 수 있음.
  • 비판적인 시각에서 볼 때, 아직 초기 단계이며 실제 성능 향상이 실제 운영 환경에서 어떻게 나타날지는 더 많은 연구와 개발이 필요함.