피드로 돌아가기
Linux 7.0이 PostgreSQL을 망가뜨린 방법
GeekNewsGeekNews
Database

Linux 7.0이 PostgreSQL을 망가뜨린 방법

Linux 7.0 선점 모드 변경으로 인한 PostgreSQL TPS 50% 급감 및 Huge Pages를 통한 해결

neo2026년 5월 4일7advanced

Context

Linux 7.0에서 서버 기본값이던 PREEMPT_NONE 모드가 제거되며 PREEMPT_LAZY가 대체제로 도입됨. PostgreSQL의 shared buffer pool 접근을 보호하는 전역 Spinlock 구조가 커널의 선점 메커니즘 및 4KB Page Fault와 결합되어 심각한 CPU 낭비를 초래함.

Technical Solution

  • Spinlock 보유 상태에서 4KB 페이지의 Minor Page Fault 발생 시 스케줄러에 의한 선점 허용 구조로 변경
  • 락 보유자의 스케줄 아웃으로 인해 대기 중인 모든 Backend 프로세스가 CPU를 점유하며 회전하는 승수 효과 발생
  • Huge Pages(2MB/1GB) 도입을 통한 잠재적 Page Fault 횟수를 3,100만 건에서 수백 건 수준으로 획기적 감소
  • 페이지 크기 확장을 통한 TLB 엔트리 효율화 및 Page Table Walk 비용 최소화
  • Huge Pages 설정을 on으로 강제하여 메모리 할당 실패 시 즉각적인 인지가 가능하도록 구성
  • 유저스페이스의 안정성을 보장하는 커널 원칙 기반으로 rseq 도입 대신 인프라 설정 최적화 선택

1. 대규모 Shared Memory를 사용하는 DB 환경에서 4KB 페이지 기반의 Lazy Allocation으로 인한 성능 저하 가능성 검토

2. 운영 환경의 PostgreSQL 설정에서 `huge_pages` 옵션을 `try`가 아닌 `on`으로 설정하여 구성 누락 방지

3. 커널 업그레이드 전후로 Perf 프로파일링을 수행하여 특정 락 함수(예: s_lock)의 CPU 점유율 급증 여부 확인

원문 읽기