Rails 7.2 연결 풀 변경 및 성능 저하 원인
Rails 7.1은 요청 기간 동안 스레드당 데이터베이스 연결을 유지했습니다. 그러나 Rails 7.2 (PR #50793)에서는 연결 공유 개선을 위해 쿼리마다 연결을 체크아웃하고 즉시 반환하는 방식으로 변경되었습니다. 이 체크인/체크아웃 주기에서 발생하는 콜백 실행 및 객체 할당 오버헤드가 성능 저하의 주된 원인입니다. 벤치마크(이슈 #55728)에 따르면 Rails 7.2는 Rails 7.1 대비 약 6%의 성능 저하를 보였습니다. 이러한 저하는 Unicorn과 같은 단일 스레드 워커, 낮은 지연 시간의 데이터베이스, 그리고 요청당 잦은 쿼리 실행 환경에서 특히 영향을 미칩니다.
해결 방안 및 적용 고려사항
단일 스레드 환경에서 연결 공유가 중요하지 않다면, 요청 시작 시 ActiveRecord::Base.lease_connection을 호출하여 연결을 임대함으로써 Rails 7.1의 동작 방식을 복원하고 성능 저하를 완화할 수 있습니다. 이 메서드는 ApplicationController의 before_action이나 ApplicationJob의 before_perform 블록에 추가하여 요청 또는 작업의 전체 기간 동안 연결을 유지하고 불필요한 체크인/체크아웃 과정을 생략하게 합니다.
그러나 Puma와 같은 다중 스레드 환경에서 데이터베이스 연결 수보다 스레드가 많거나, 데이터베이스 사용량이 적은 장기 실행 요청의 경우, 새로운 연결 관리 방식이 더 효율적이므로 lease_connection 적용을 피해야 합니다.
변경 사항 적용 전, ActiveSupport::Notifications.subscribe("sql.active_record")를 활용하여 lease_connection 적용 전후의 요청 시간을 측정하여 실제 성능 영향을 확인하는 것이 필수적입니다. 영향이 없다면 수정할 필요가 없습니다.