본문으로 건너뛰기

Rails 7.2 연결 풀 변경으로 앱 속도 저하 가능성

Rails 7.2 Connection Pool Changes May Slow Down Your App | Code With Rails

작성자
jeff
발행일
2026년 01월 03일

핵심 요약

  • 1 Rails 7.2의 ActiveRecord 연결 풀 관리 방식 변경으로 인해 앱 성능이 약 5-6% 저하될 수 있습니다.
  • 2 이 변경은 쿼리마다 연결을 체크아웃하고 즉시 반환하는 방식으로, 체크인/체크아웃 주기에서 발생하는 오버헤드가 주된 원인입니다.
  • 3 단일 스레드 환경에서는 `ActiveRecord::Base.lease_connection`을 사용하여 요청 시작 시 연결을 임대하면 성능 저하를 완화할 수 있습니다.

도입

Rails 7.2 버전으로 업그레이드한 후, 애플리케이션의 속도가 미미하지만 측정 가능한 수준으로 저하될 수 있습니다. 특히 실제 환경 벤치마크에서 약 5-6%의 성능 감소가 관찰되었는데, 이는 ActiveRecord가 데이터베이스 연결을 관리하는 방식의 변화에 기인합니다. 본 글에서는 이러한 변경의 내용과 원인, 그리고 해결 방안에 대해 상세히 다룹니다.

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의 동작 방식을 복원하고 성능 저하를 완화할 수 있습니다. 이 메서드는 ApplicationControllerbefore_action이나 ApplicationJobbefore_perform 블록에 추가하여 요청 또는 작업의 전체 기간 동안 연결을 유지하고 불필요한 체크인/체크아웃 과정을 생략하게 합니다.

그러나 Puma와 같은 다중 스레드 환경에서 데이터베이스 연결 수보다 스레드가 많거나, 데이터베이스 사용량이 적은 장기 실행 요청의 경우, 새로운 연결 관리 방식이 더 효율적이므로 lease_connection 적용을 피해야 합니다.

변경 사항 적용 전, ActiveSupport::Notifications.subscribe("sql.active_record")를 활용하여 lease_connection 적용 전후의 요청 시간을 측정하여 실제 성능 영향을 확인하는 것이 필수적입니다. 영향이 없다면 수정할 필요가 없습니다.

결론

Rails 7.2의 ActiveRecord 연결 풀 관리 변경은 특정 환경, 특히 Unicorn과 같은 단일 스레드 워커를 사용하는 배포 환경에서 애플리케이션 성능 저하를 야기할 수 있습니다. `ActiveRecord::Base.lease_connection`을 사용하여 요청 시작 시 연결을 임대하는 해결책은 Rails 7.1의 동작 방식을 복원하고 성능을 개선할 수 있습니다. 하지만 다중 스레드 환경이나 데이터베이스 사용량이 적은 요청에서는 새로운 동작이 더 효율적일 수 있으므로, 변경 적용 전 반드시 앱의 성능을 측정하여 실제 영향을 확인하는 것이 권장됩니다. 지속적인 최적화 작업은 이슈 #55728에서 추적할 수 있습니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.