db_work_mem에 대한 질문

안녕하세요,

이 옵션에 대해 몇 가지 질문이 있습니다. 이 옵션은 기본적으로 app.yml에서 주석 처리되어 있으며, 정렬 성능을 향상시킬 수 있지만 연결당 메모리 사용량이 증가한다고 되어 있습니다. 이것이 실제로 무슨 의미인지 궁금합니다. 연결 수에 따라 달라지는 건가요? db_work_mem이란 무엇이며, db_shared_buffers나 UNICORN_WORKERS처럼 Discourse 설치 시 자동으로 설정되나요? 이 옵션을 활성화하는 것이 안전하다고 볼 수 있는지, 아니면 고급 설정에 해당하는지 알고 싶습니다.

현재 설정은 다음과 같습니다: #db_work_mem: "40MB"

서버 사양은 다음과 같습니다:
Vultr High Frequency Compute 2 vCore, 4096 MB

답변 주시면 감사하겠습니다! :slight_smile:

복잡한 문제입니다. 자세한 내용은 PostgreSQL 문서에서 검색해 보실 수 있습니다. 여기서 튜닝에 대해 논의하는 주제들이 몇 가지 있습니다.

기본 설정은 상당히 잘 작동합니다.

문제가 있다면, 어떤 문제인지, 트래픽 양이 얼마나 되는지, 데이터베이스 크기가 얼마나 되는지 설명해 주시면 됩니다.

제이, 감사합니다! :slight_smile: 사실 저는 그냥 궁금해서 여쭤본 것입니다. 포럼의 성능을 더 좋게 만드는 방법을 찾고 있었는데, 만약 문제를 일으킬 수 있다면 주석 처리한 채로 두는 것이 더 나을 것 같습니다.

제가 이해한 대로라면, 활성화했을 때 튜닝이 올바르지 않거나 트래픽이 증가하면 메모리가 부족해질 가능성이 높다는 말씀이신가요?

work_mem (integer)

쿼리 작업(정렬 또는 해시 테이블 등)이 임시 디스크 파일로 데이터를 쓰기 시작하기 전에 사용할 수 있는 기본 최대 메모리 양을 설정합니다. 이 값에 단위가 지정되지 않으면 킬로바이트로 간주됩니다. 기본값은 4메가바이트(4MB)입니다. 복잡한 쿼리의 경우 여러 정렬 또는 해시 작업이 병렬로 실행될 수 있으며, 각 작업은 임시 파일로 데이터를 쓰기 시작하기 전에 이 값에서 지정된 만큼의 메모리를 사용할 수 있습니다. 또한, 여러 실행 중인 세션이 동시에 이러한 작업을 수행할 수도 있습니다. 따라서 사용되는 총 메모리는 work_mem 값의 여러 배가 될 수 있으므로, 값을 선택할 때 이 점을 염두에 두어야 합니다. 정렬 작업은 ORDER BY, DISTINCT 및 병합 조인(merge joins)에 사용됩니다. 해시 테이블은 해시 조인, 해시 기반 집계 및 IN 서브쿼리의 해시 기반 처리에 사용됩니다.

해시 기반 작업은 동등한 정렬 기반 작업보다 메모리 사용 가능량에 일반적으로 더 민감합니다. 해시 테이블에 사용할 수 있는 메모리는 work_mem에 hash_mem_multiplier를 곱하여 계산됩니다. 이를 통해 해시 기반 작업이 일반적인 work_mem 기본 양을 초과하는 메모리를 사용할 수 있습니다.

때때로 주석 처리된 기본값의 두 배로 작업 메모리를 늘리는 것이 도움이 될 수 있습니다. 인덱스가 큰 대형 사이트에서는 도움이 될 것 같지만, 확실히 아는 것은 아닙니다. 메모리를 너무 높게 설정해서 사이트를 망친 적도 있습니다.

튜닝을 직접 시도해 보고 싶다면 prometheus 플러그인을 확인하고 grafana로 예쁜 그래프를 만들어 보세요.

I found the formula here to calculate the db_work_mem.

By default it is set to 100 connections.

Total RAM * 0.25 / max_connections

I have 4096MB * 0.25 / 100 = ~10MB

In the postgres.template.yml template the db_work_mem: "10MB" is default so it calculate with this formula I think. I think this 10MB is the max right now. Thanks Jay :slight_smile: