Postgres와 Discourse DB 최적화 방법

  • 때때로 특정 쿼리 때문에 DB가 종료(fire)되는 경우가 있습니다. PostgreSQL을 최적화해야 한다는 이야기를 들었는데, 이를 달성하는 방법에 대해 아이디어가 있을까요?
    아래 스크린샷에 우리의 DB 리소스가 나와 있습니다.
    • CPU: 4 vcpu
    • 메모리: 22 GB

안녕하세요, 저는 @Abdelrahman_MoHamed와 함께 이 작업을 진행 중입니다. 최근 약 50만 개의 토픽과 350만 명의 사용자를 가진 사이트를 discourse로 마이그레이션했습니다. GCP에서 자체 호스팅(self-hosted)을 하고 있습니다. 이 과정에서 마이그레이션을 도와준 파트너는 데이터베이스에서 적절한 성능을 얻기 위해 Postgres를 최적화하는 것이 합리적일 수 있다고 언급했습니다. 저희는 discourse용 데이터베이스가 기본적으로 최적화되어 나올 것이라고 가정하고 있었습니다(실제로 그럴 수도 있겠죠?). 하지만 파트너의 제안을 듣고, 여기에서 후속 질문을 드리게 되었습니다.

요약하자면, 여기 게시된 규모의 데이터베이스에 대해 Postgres를 최적화하는 일반적인 방법들이 있을까요?

도움 주시면 감사하겠습니다!

DB가 병목 현상의 원인, 즉 이러한 CPU 부하의 원인이란 더 구체적인 근거가 있나요? 예를 들어 ps나 top의 출력 결과 같은 것이요.

만약 DB라면, 현재 어떤 쿼리를 처리 중인지 확인할 수 있는 방법이 있을 것 같습니다.

이러한 세부 정보가 도움이 될 수 있습니다.

@Ed_S 감사합니다. 곧 여기에 더 많은 데이터를 추가할 예정입니다. 지금은 상황을 모니터링 중입니다. 답변해 주셔서 감사합니다.

그 조합은 좀 이상해 보이네요 … 22GB 메모리인데 vCPU가 4개밖에 없어요? 메모리는 과잉이지만, 코어가 부족할 수 있겠네요.

보통 서버는 GB당 훨씬 더 많은 vCPU를 갖추고 있습니다.

그 이유는 웹 서빙이 매우 병렬적이고, 각 Unicorn 인스턴스에 약 1GB 정도만 필요하기 때문이죠.

각 Unicorn이 별도의 코어에서 실행된다고 생각합니다.

그래서 CPU 사용률이 쉽게 100%까지 올라가는 것일 수 있습니다.

16/16 구성이나 심지어 8/8 구성으로 전환해 보고 개선되는지 확인해 보시는 것을 추천합니다.

작은 sidestep은 허용되나요? 유니콘(unicorn)은 PHP의 워커와 비슷한 것인가요? 어떤 문서에서는 유니콘이 실제로 자체 워커를 가지고 요청을 Ruby로 전달하는 HTTP 서버라고 설명하면서, 그 때문에 완전히 다르다고 하더군요. 하지만 두 가지 모두 HTTP 요청을 처리하여 더 많은 동시 요청을 허용하므로, 더 많은 PHP 워커와 더 많은 유니콘이 더 많은 RAM을 필요로 한다는 점에서 제게는 이 둘이 거의 같은 것으로 보입니다.

정답인가요, 아니면 완전히 틀린 건가요? 이제 원리를 이해하고 싶습니다. PHP 워커를 언제, 어떻게 조정해야 하는지는 알지만, 유니콘은 제게는 여전히 신비롭고 마법 같은 존재이기 때문입니다.

네, 그 비교는 적절하다고 생각합니다

관련: 웹 트래픽에 비해 유니콘이 너무 적거나 너무 많는지 관리자가 어떻게 알 수 있을까요?

관련: 필요한 것보다 훨씬 많은 RAM을 보유하고 있는지 어떻게 알 수 있을까요?

제 이해로는 유니콘의 수는 일반적으로 CPU 수에 따라 조정되지만, 반드시 그럴 필요는 없습니다. 예를 들어 설정 이후 호스트 구성이 변경된 경우 등이 그렇습니다.

RAM 용량은 필요한 양에 따라 조정되어야 합니다. 수많은 게시물과 사용자의 대량 가져오기가 반드시 더 많은 RAM을 필요로 하는지는 모르겠습니다. 핵심은 각 웹 요청 또는 정기 작업을 처리할 때 데이터베이스의 어느 정도가 액세스되는지입니다.

제 경우를 보면, 매우 낮은 사용률의 배경에서 10분간의 최대 CPU 사용률 버스트는 문제가 되지 않습니다. (스포츠/도박 포럼처럼 매우 바쁘고 시간 민감한 포럼에서 관심도가 가장 높은 시점에 페이지 제공이 지연된다면 문제가 되겠지만, 제 포럼은 시간 민감형이나 성능 민감형이 아닙니다.)

최근 응답 시간 범위를 어떻게 표로 정리할 수 있을지는 모르겠지만, 확인해 볼 가치가 있는 좋은 데이터가 될 수 있습니다. 웹 서버 측이나 데이터베이스 측에서든 말입니다.