재설치/복원 후 Postgres 프로세스가 끝없이 실행되고 성능이 저하됩니다

포럼을 업데이트하기 위해 주말에 VPS를 새로 설치하고 복원 작업을 수행했습니다.

이 작업을 통해 여러 문제를 해결할 수 있을 것으로 기대했습니다:

  • 오래된 ubuntu 업데이트
  • Discourse 업데이트
  • Postgres 15 업그레이드

전반적으로는 순조롭게 진행되었지만, 이후 Postgres 프로세스가 코어 100%를 사용하며 폭주하는 문제가 발생했습니다. 프로세스 수는 다양했습니다. 재구축부터 재시작까지 여러 가지 방법을 시도해 보았습니다. 현재는 rake db:validate_indexes를 실행 중인데, 이미 몇 시간째 아무 피드백도 없습니다. 이전에 이 작업을 수행한 적이 있는지, 그리고 더 빨리 완료되는 것이 정상인지 확실하지 않습니다.

포럼 사용 자체는 기본적으로 잘 되지만, 확실히 느려졌습니다. 활성도가 높은 사용자의 프로필을 불러오는 것과 같은 긴 실행 시간이 필요한 작업은 평소보다 눈에 띄게 더 오래 걸립니다.

데이터베이스에 문제가 있는 것 같지만, 어떤 문제인지 파악하기가 어렵습니다.

솔직히 말씀드리면, 저희 데이터베이스가 꽤 큽니다 - 복원 후 인덱스 생성까지 완료된 상태로는 약 150GB입니다. 복원 과정을 모니터링하면서 에러는 확인되지 않았고, 인덱스 생성도 제 눈에는 정상적으로 진행되었습니다.

이 문제를 해결하는 방법에 대한 아이디어가 있을까요? 현재는 Postgres 프로세스가 3개입니다 - 몇 시간 전에 재시작하기 전에는 6개였습니다 - 복원 후 16개 코어가 모두 사용되기도 했습니다.

수정: 방금 3개의 sidekiq 프로세스가 “indexing categories for search” 상태로 멈춰 있는 것을 발견했습니다. 이것이 모두 검색 인덱스 재구축 때문일까요? 그렇다면 다른 방법으로 해결할 수 있을까요? 라이브 시스템 복원을 수행할 때, 성능이 이렇게 수 시간 또는 심지어 며칠 동안 저하된다면 큰 문제가 될 것입니다.

현재 "Jobs::BackfillBadge"라는 sidekiq 작업 하나만 실행되고 있는데도, 7개의 postgres 프로세스가 100% CPU를 지속적으로 점유하는 것 같습니다. 여기서 무슨 일이 일어나고 있는지 정말 궁금합니다.

이러한 작업을 수행한 후에는 데이터베이스 통계를 위해 vacuum을 실행하는 것이 좋습니다.

RAM과 CPU 용량이 얼마나 되나요?

Postgres에 할당된 메모리는 얼마나 되나요?

해당 테스트 서버는 32GB RAM, 16코어 사양이며, 설정은 64MB 워크 메모로 되어 있습니다.

수정: 공유 버퍼는 8GB로 설정되어 있습니다.

현재 vacuum 작업을 수행 중인데 멈춘 것처럼 보입니다.

무언가를 수행 중인지 확실하지 않으나, 이미 30분 이상 같은 상태입니다.

이전에 ‘stuck’ 상태였던 7개의 Postgres 프로세스를 종료하기 위해 포럼을 읽기 전용으로 설정하고 VM을 재시작했습니다. 재시작 직후 해당 Postgres 프로세스 중 2개가 다시 나타났으며 상태는 변하지 않았습니다. 현재 sidekiq에서는 아무 작업도 실행되지 않고 있습니다.

진짜로 VACUUM을 FULL 옵션으로 실행하고 싶지 않을 겁니다. 성능을 되찾으려면 VACUUM VERBOSE ANALYZE만 있으면 충분합니다. 운영 중인 사이트에서는 FULL 옵션을 사용할 수 없으니까요.

나는 거대한 데이터베이스에 대해 전문가가 아니지만, 버퍼 크기를 그보다 2~3배로 늘리라고 권하고 싶습니다.

8GB 크기의 인덱스가 있을 것이라고 확신합니다.

:thinking: Postgres는 내부 메모리의 40%를 초과하여 shared_buffers를 설정하지 말라고 권장하고 있죠?

그럼에도 불구하고,

서버의 사양이 부족할 수 있습니다.

아! 전문가의 현명한 조언이군요! 그렇다면 8GB/25%는 부족하다는 제 추측이 맞았던 것 같고, 16GB는 40%를 초과하지만 여전히 좋은 제안일 수 있습니다. 왜냐하면 . . . .

여러분, 말씀드린 것처럼 이것은 테스트 서버입니다 — 트래픽이 전혀 없습니다. 이 서버는 확실히 프로덕션 환경에 사용하기엔 부족하지만, 그게 지금의 문제는 아닙니다. 문제는 왜 postgres 프로세스가 그렇게 멈춰버리는지 (CPU 사용률 100%) 그리고 시스템 성능을 극적으로 저하시키는지에 대한 것입니다. 며칠 전까지도 우리는 더 낮은 사양으로 테스트 서버를 운영했습니다 — 디스크 용량이 부족해서 복구를 위해 사양을 올린 것뿐이었죠.

프로덕션 머신은 동일한 Shared buffer 설정으로 128GB의 RAM을 사용하면서 아무 문제 없이 작동하고 있습니다 — 따라서 이 설정과 shared buffer 크기에 일반적인 문제가 있다고 생각하지는 않습니다. 특히 트래픽이 없는 개인 테스트 머신에서는 더더욱 그렇습니다.

하지만 어쨌든 — 저는 복구를 다시 실행해서 그 행동에 대한 좋은 설명이 없어 보이는 상황에서 뭔가 잘못되었는지를 확인해 보겠습니다.