리소스 사용량/메모리
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
hash_mem_multiplier
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 해시 테이블에 사용할 work_mem의 배수입니다. |
데이터 형식 | numeric |
Default value | 2 |
허용된 값 | 1-1000 |
매개 변수 형식 | dynamic |
설명서 | hash_mem_multiplier |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
huge_page_size
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 요청해야 하는 거대한 페이지의 크기입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | huge_page_size |
logical_decoding_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 논리 디코딩에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 65536 |
허용된 값 | 65536 |
매개 변수 형식 | 읽기 전용 |
설명서 | logical_decoding_work_mem |
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
min_dynamic_shared_memory
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 시작 시 예약된 동적 공유 메모리 양입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | min_dynamic_shared_memory |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 기본 공유 메모리 영역에 사용되는 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | mmap |
허용된 값 | mmap |
매개 변수 형식 | 읽기 전용 |
설명서 | shared_memory_type |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
vacuum_buffer_usage_limit
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, ANALYZE 및 autovacuum에 대한 버퍼 풀 크기를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 0-16777216 |
매개 변수 형식 | dynamic |
설명서 | vacuum_buffer_usage_limit |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
hash_mem_multiplier
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 해시 테이블에 사용할 work_mem의 배수입니다. |
데이터 형식 | numeric |
Default value | 2 |
허용된 값 | 1-1000 |
매개 변수 형식 | dynamic |
설명서 | hash_mem_multiplier |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
huge_page_size
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 요청해야 하는 거대한 페이지의 크기입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | huge_page_size |
logical_decoding_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 논리 디코딩에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 65536 |
허용된 값 | 64-2147483647 |
매개 변수 형식 | dynamic |
설명서 | logical_decoding_work_mem |
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
min_dynamic_shared_memory
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 시작 시 예약된 동적 공유 메모리 양입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | min_dynamic_shared_memory |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 기본 공유 메모리 영역에 사용되는 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | mmap |
허용된 값 | mmap |
매개 변수 형식 | 읽기 전용 |
설명서 | shared_memory_type |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
vacuum_buffer_usage_limit
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, ANALYZE 및 autovacuum에 대한 버퍼 풀 크기를 설정합니다. |
데이터 형식 | 정수 |
Default value | 256 |
허용된 값 | 0-16777216 |
매개 변수 형식 | dynamic |
설명서 | vacuum_buffer_usage_limit |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
hash_mem_multiplier
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 해시 테이블에 사용할 work_mem의 배수입니다. |
데이터 형식 | numeric |
Default value | 2 |
허용된 값 | 1-1000 |
매개 변수 형식 | dynamic |
설명서 | hash_mem_multiplier |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
huge_page_size
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 요청해야 하는 거대한 페이지의 크기입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | huge_page_size |
logical_decoding_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 논리 디코딩에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 65536 |
허용된 값 | 64-2147483647 |
매개 변수 형식 | dynamic |
설명서 | logical_decoding_work_mem |
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
min_dynamic_shared_memory
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 시작 시 예약된 동적 공유 메모리 양입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | min_dynamic_shared_memory |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 기본 공유 메모리 영역에 사용되는 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | mmap |
허용된 값 | mmap |
매개 변수 형식 | 읽기 전용 |
설명서 | shared_memory_type |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
hash_mem_multiplier
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 해시 테이블에 사용할 work_mem의 배수입니다. |
데이터 형식 | numeric |
Default value | 1 |
허용된 값 | 1-1000 |
매개 변수 형식 | dynamic |
설명서 | hash_mem_multiplier |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
huge_page_size
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 요청해야 하는 거대한 페이지의 크기입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | huge_page_size |
logical_decoding_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 논리 디코딩에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 65536 |
허용된 값 | 64-2147483647 |
매개 변수 형식 | dynamic |
설명서 | logical_decoding_work_mem |
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
min_dynamic_shared_memory
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 시작 시 예약된 동적 공유 메모리 양입니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0 |
매개 변수 형식 | 읽기 전용 |
설명서 | min_dynamic_shared_memory |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 기본 공유 메모리 영역에 사용되는 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | mmap |
허용된 값 | mmap |
매개 변수 형식 | 읽기 전용 |
설명서 | shared_memory_type |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
hash_mem_multiplier
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 해시 테이블에 사용할 work_mem의 배수입니다. |
데이터 형식 | numeric |
Default value | 1 |
허용된 값 | 1-1000 |
매개 변수 형식 | dynamic |
설명서 | hash_mem_multiplier |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
logical_decoding_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 논리 디코딩에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 65536 |
허용된 값 | 64-2147483647 |
매개 변수 형식 | dynamic |
설명서 | logical_decoding_work_mem |
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 기본 공유 메모리 영역에 사용되는 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | mmap |
허용된 값 | mmap |
매개 변수 형식 | 읽기 전용 |
설명서 | shared_memory_type |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
hash_mem_multiplier
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 해시 테이블에 사용할 work_mem의 배수입니다. |
데이터 형식 | numeric |
Default value | 1 |
허용된 값 | 1-1000 |
매개 변수 형식 | dynamic |
설명서 | hash_mem_multiplier |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 기본 공유 메모리 영역에 사용되는 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | mmap |
허용된 값 | mmap |
매개 변수 형식 | 읽기 전용 |
설명서 | shared_memory_type |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).
autovacuum_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 자동 진공 작업자 프로세스에서 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | -1 |
허용된 값 | -1-2097151 |
매개 변수 형식 | dynamic |
설명서 | autovacuum_work_mem |
dynamic_shared_memory_type
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 사용되는 동적 공유 메모리 구현을 선택합니다. |
데이터 형식 | 열거형 |
Default value | posix |
허용된 값 | posix |
매개 변수 형식 | 읽기 전용 |
설명서 | dynamic_shared_memory_type |
huge_pages
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 거대한 메모리 페이지를 사용하거나 사용하지 않도록 설정합니다. 이 설정은 vCore가 4개 미만인 서버에는 적용되지 않습니다. |
데이터 형식 | 열거형 |
Default value | try |
허용된 값 | on,off,try |
매개 변수 형식 | static |
설명서 | huge_pages |
설명
대용량 페이지는 큰 블록에서 메모리를 관리할 수 있는 기능입니다. 표준 4KB 페이지와 달리 일반적으로 최대 2MB의 블록을 관리할 수 있습니다.
대용량 페이지를 사용하면 CPU를 효과적으로 오프로드하는 성능면에서 이점을 제공합니다.
- TLB(변환 색인 버퍼) 누락이 줄어드는 등 메모리 관리 작업과 관련된 오버헤드가 감소합니다.
- 메모리 관리에 필요한 시간을 단축합니다.
특히 PostgreSQL에서는 공유 메모리 영역에 대해서만 대용량 페이지를 사용할 수 있습니다. 공유 메모리 영역의 상당 부분이 공유 버퍼에 할당됩니다.
또 다른 장점은 대용량 페이지가 공유 메모리 영역을 디스크로 교환하지 못하게 하여 성능을 더욱 안정화한다는 것입니다.
권장 사항
- 메모리 리소스가 많은 서버의 경우 대용량 페이지를 사용하지 않도록 설정하지 마십시오. 대용량 페이지를 사용하지 않도록 설정하면 성능이 저하됩니다.
- 대용량 페이지를 지원하지 않지만 지원하는 서버로 스케일 업할 것으로 예상되는 작은 서버로 시작하는 경우 원활한 전환과 최적의 성능을 위해
huge_pages
설정을TRY
상태로 유지하세요.
Azure 관련 메모
vCores가 4개 이상인 서버의 경우 기본 운영 체제에서 거대한 페이지가 자동으로 할당됩니다. vCores가 4개 미만인 서버에서는 기능을 사용할 수 없습니다. shared_buffers
에 대한 변경 내용을 포함하여 공유 메모리 설정이 변경되면 대용량 페이지 수가 자동으로 조정됩니다.
maintenance_work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | VACUUM, 인덱스 만들기와 같은 유지 관리 작업에 사용할 최대 메모리를 설정합니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 1024-2097151 |
매개 변수 형식 | dynamic |
설명서 | maintenance_work_mem |
설명
maintenance_work_mem
은(는) PostgreSQL의 구성 매개 변수입니다. VACUUM
, CREATE INDEX
및 ALTER TABLE
같은 유지 관리 작업에 할당된 메모리 양을 제어합니다. 쿼리 작업에 대한 메모리 할당에 영향을 주는 work_mem
과 달리, 데이터베이스 구조를 유지 관리하고 최적화하는 작업을 위해 maintenance_work_mem
이 예약되어 있습니다.
핵심 내용
- 진공 메모리 한도:
maintenance_work_mem
을(를) 늘려 데드 튜플 정리 속도를 높이고 싶다면VACUUM
에는 데드 튜플 식별자를 수집하기 위한 기본 제공 제한이 있다는 점에 유의하세요. 이 프로세스에는 최대 1GB의 메모리만 사용할 수 있습니다. - 자동 진공을 위한 메모리 분리:
autovacuum_work_mem
설정을 사용하여 자동 진공 작업에서 사용하는 메모리를 독립적으로 제어할 수 있습니다. 이 설정은maintenance_work_mem
의 하위 집합 역할을 합니다. 다른 유지 관리 작업 및 데이터 정의 작업에 대한 메모리 할당에 영향을 주지 않고 자동 진공에 사용되는 메모리 양을 결정할 수 있습니다.
Azure 관련 메모
maintenance_work_mem
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 maintenance_work_mem
서버 매개 변수에 대한 기본값에 영향을 미치지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 maintenance_work_mem
값에 따라 매개 변수 값도 조정해야 합니다.
값을 maintenance_work_mem
계산하는 데 사용되는 수식은 .입니다 (long)(82.5 * ln(memoryGiB) + 40) * 1024
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | maintenance_work_mem |
---|---|
2GiB | 99328 KiB |
4GiB | 157696 KiB |
8GiB | 216064 KiB |
16GiB | 274432 KiB |
32GiB | 332800 KiB |
48GiB | 367616 KiB |
64GiB | 392192 KiB |
80GiB | 410624 KiB |
128GiB | 450560 KiB |
160GiB | 468992 KiB |
192GiB | 484352 KiB |
256GiB | 508928 KiB |
384GiB | 542720 KiB |
432GiB | 552960 KiB |
672GiB | 590848 KiB |
max_prepared_transactions
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 동시에 준비된 최대 트랜잭션 수를 설정합니다. 복제본 서버를 실행하는 경우 이 매개 변수를 기본 서버의 값 이상으로 설정해야 합니다. |
데이터 형식 | 정수 |
Default value | 0 |
허용된 값 | 0-262143 |
매개 변수 형식 | static |
설명서 | max_prepared_transactions |
max_stack_depth
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 최대 스택 깊이(킬로바이트)를 설정합니다. |
데이터 형식 | 정수 |
Default value | 2048 |
허용된 값 | 2048 |
매개 변수 형식 | 읽기 전용 |
설명서 | max_stack_depth |
shared_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 서버에서 사용하는 공유 메모리 버퍼 수를 설정합니다. 단위는 8kb입니다. 허용되는 값은 사용 가능한 메모리의 10% - 75% 범위 내에 있습니다. |
데이터 형식 | 정수 |
Default value | 서버에 할당된 리소스(vCore, RAM 또는 디스크 공간)에 따라 달라집니다. |
허용된 값 | 16-1073741823 |
매개 변수 형식 | static |
설명서 | shared_buffers |
설명
shared_buffers
구성 매개 변수는 데이터를 버퍼링하기 위해 PostgreSQL 데이터베이스에 할당된 시스템 메모리 양을 결정합니다. 모든 데이터베이스 프로세스에서 액세스할 수 있는 중앙 집중식 메모리 풀 역할을 합니다.
데이터가 필요한 경우 데이터베이스 프로세스는 먼저 공유 버퍼를 확인합니다. 필요한 데이터가 있으면 빠르게 검색되므로 시간이 더 많이 걸리는 디스크 읽기가 무시됩니다. 공유 버퍼는 데이터베이스 프로세스와 디스크 간의 중개자 역할을 하며 필요한 I/O 작업의 수를 효과적으로 줄입니다.
Azure 관련 메모
shared_buffers
서버 매개 변수의 기본값은 컴퓨팅을 위해 선택한 제품 이름을 기반으로 Azure Database for PostgreSQL 유연한 서버의 인스턴스를 프로비전할 때 계산됩니다. 유연한 서버를 지원하는 컴퓨팅에 대한 제품 선택의 후속 변경 내용은 해당 인스턴스의 서버 매개 변수에 대한 기본값에 shared_buffers
영향을 주지 않습니다.
인스턴스에 할당된 제품을 변경할 때마다 다음 수식의 shared_buffers
값에 따라 매개 변수 값도 조정해야 합니다.
최대 2GiB의 메모리가 있는 가상 머신의 경우 값을 shared_buffers
계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 16384
.
2GiB를 초과하는 가상 머신의 shared_buffers
경우 값을 계산하는 데 사용되는 수식은 다음과 입니다 memoryGib * 32768
.
이전 수식에 따라 다음 표에서는 프로비전된 메모리 양에 따라 이 서버 매개 변수가 설정되는 값을 나열합니다.
메모리 크기 | shared_buffers |
---|---|
2GiB | 32768 |
4GiB | 131072 |
8GiB | 262144 |
16GiB | 524288 |
32GiB | 1048576 |
48GiB | 1572864 |
64GiB | 2097152 |
80GiB | 2621440 |
128GiB | 4194304 |
160GiB | 5242880 |
192GiB | 6291456 |
256GiB | 8388608 |
384GiB | 12582912 |
432GiB | 14155776 |
672GiB | 22020096 |
temp_buffers
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 각 데이터베이스 세션에서 사용하는 최대 임시 버퍼 수를 설정합니다. |
데이터 형식 | 정수 |
Default value | 1024 |
허용된 값 | 100-1073741823 |
매개 변수 형식 | dynamic |
설명서 | temp_buffers |
work_mem
attribute | 값 |
---|---|
범주 | 리소스 사용량/메모리 |
설명 | 임시 디스크 파일에 쓰기 전에 내부 정렬 작업 및 해시 테이블에서 사용할 메모리 양을 설정합니다. |
데이터 형식 | 정수 |
Default value | 4096 |
허용된 값 | 4096-2097151 |
매개 변수 형식 | dynamic |
설명서 | work_mem |
설명
PostgreSQL의 work_mem
매개 변수는 각 데이터베이스 세션의 프라이빗 메모리 영역 내에서 특정 내부 작업에 할당된 메모리 양을 제어합니다. 이러한 작업의 예로는 정렬 및 해시가 있습니다.
공유 메모리 영역에 있는 공유 버퍼와 달리, work_mem
은 세션별 또는 쿼리별 프라이빗 메모리 공간에 할당됩니다. 적절한 work_mem
크기를 설정하면 이러한 작업의 효율성을 크게 향상시켜 임시 데이터를 디스크에 쓸 필요가 줄어듭니다.
핵심 내용
- 프라이빗 연결 메모리:
work_mem
은(는) 각 데이터베이스 세션에서 사용하는 프라이빗 메모리의 일부입니다. 이 메모리는shared_buffers
이(가) 사용하는 공유 메모리 영역과 다릅니다. - 쿼리별 사용: 모든 세션 또는 쿼리에서
work_mem
을 사용하는 것은 아닙니다.SELECT 1
같은 간단한 쿼리에는work_mem
이(가) 필요하지 않습니다. 그러나 정렬 또는 해시와 같은 작업과 관련된 복잡한 쿼리는 하나 또는 여러 개의work_mem
청크를 사용할 수 있습니다. - 병렬 작업: 여러 병렬 백 엔드에 걸쳐 있는 쿼리의 경우 각 백 엔드가 하나 또는 여러
work_mem
청크를 사용할 수 있습니다.
모니터링 및 조정 work_mem
주로 정렬 또는 해시 작업과 관련된 쿼리 실행 시간이 느린 경우 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 work_mem
을(를) 조정해야 합니다. Azure Portal에서 사용할 수 있는 도구를 사용하여 성능을 모니터링할 수 있는 방법은 다음과 같습니다.
- 쿼리 성능 인사이트: 임시 파일별 상위 쿼리 탭에서 임시 파일을 생성하는 쿼리를 식별합니다. 이 상황은
work_mem
을(를) 늘려야 할 가능성이 있음을 시사합니다. - 문제 해결 가이드: 문제 해결 가이드의 높은 임시 파일 탭을 사용하여 문제가 있는 쿼리를 식별합니다.
세분화된 조정
work_mem
매개 변수를 관리하는 동안 전역 값을 설정하지 말고, 세분화된 조정 방법을 채택하는 것이 더 효율적입니다. 이 방법을 사용하면 프로세스 및 사용자의 특정 요구 사항에 따라 신중하게 메모리를 할당할 수 있습니다. 또한 메모리 부족 문제가 발생할 위험을 최소화합니다. 시작 방법은 다음과 같습니다.
사용자 수준: 특정 사용자가 주로 메모리 집약적인 집계 또는 보고 작업에 관련된 경우 해당 사용자의
work_mem
값을 사용자 지정하는 것이 좋습니다.ALTER ROLE
명령을 사용하여 사용자 작업의 성능을 향상시킵니다.함수/프로시저 수준: 특정 함수 또는 프로시저가 상당한 임시 파일을 생성할 때 특정 함수 또는 프로시저 수준에서
work_mem
값을 늘리면 도움이 될 수 있습니다.ALTER FUNCTION
또는ALTER PROCEDURE
명령을 사용하여 이러한 작업에 더 많은 메모리를 특별히 할당하여 수행할 수 있습니다.데이터베이스 수준: 특정 데이터베이스만 많은 수의 임시 파일을 생성하는 경우 데이터베이스 수준에서
work_mem
을(를) 변경합니다.전역 수준: 시스템을 분석한 결과, 대부분의 쿼리가 작은 임시 파일을 생성하고 소수의 쿼리만 큰 파일을 만드는 것으로 확인되면 전역적으로
work_mem
값을 늘리는 것이 좋습니다. 이 작업을 통해 대부분의 쿼리가 메모리에서 처리되므로 디스크 기반 작업을 방지하고 효율성을 향상시킬 수 있습니다. 그러나 항상 주의해야 하며 서버의 메모리 사용률을 모니터링하여 증가된work_mem
값을 처리할 수 있는지 확인합니다.
작업 정렬을 위해 최소 work_mem 값 결정
특정 쿼리, 특히 정렬 프로세스 중에 임시 디스크 파일을 생성하는 최소 work_mem
값을 찾으려면 먼저 쿼리 실행 중에 생성된 임시 파일 크기를 고려합니다. 예를 들어 쿼리에서 20MB 임시 파일을 생성하는 경우:
- psql 또는 선호하는 PostgreSQL 클라이언트를 사용하여 데이터베이스에 연결합니다.
- 메모리에서 처리할 때 추가 헤더를 고려하도록 초기
work_mem
값을 20MB보다 약간 높게 설정합니다.SET work_mem TO '25MB'
과(와) 같은 명령을 사용합니다. - 동일한 세션에서 문제가 있는 쿼리에 대해
EXPLAIN ANALYZE
를 실행합니다. "Sort Method: quicksort Memory: xkB"
의 출력을 검토합니다."external merge Disk: xkB"
을(를) 나타내는 경우work_mem
값을 증분 방식으로 높이고"quicksort Memory"
이(가) 나타날 때까지 다시 테스트합니다."quicksort Memory"
의 모양은 쿼리가 현재 메모리에서 작동하고 있음을 보여줍니다.- 이 메서드를 통해 값을 확인한 후에는 운영 요구 사항에 맞게 전역적으로 또는 보다 세부적인 수준에서 적용할 수 있습니다(앞에서 설명한 대로).