16GB RAM이 장착 된 8 코어 시스템 인 RHEL 6.3에서 실행되는 PostgreSQL 9.2 인스턴스가 있습니다. 서버는이 데이터베이스 전용입니다. 기본 postgresql.conf가 메모리 설정과 관련하여 상당히 보수적이므로 Postgres가 더 많은 메모리를 사용하도록하는 것이 좋습니다. 놀랍게도 wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server에 대한 조언을 따르면 실제로 실행하는 모든 쿼리가 상당히 느려졌지만 더 복잡한 쿼리에서는 분명히 눈에.니다.
또한 pgtune을 실행하여 더 많은 매개 변수를 조정하여 다음 권장 사항을 제공했지만 아무것도 변경하지 않았습니다. 다른 곳 (특히 PG wiki)에 대한 조언과 일치하는 1/4 크기의 RAM 크기의 shared_buffers를 제안합니다.
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 3840MB
max_connections = 80
설정을 변경 한 후 (을 사용하여 reindex database
) 전체 데이터베이스를 다시 색인화하려고 시도했지만 도움이되지 않았습니다. 나는 shared_buffers와 work_mem을 가지고 놀았습니다. 매우 보수적 인 기본값 (128k / 1MB)에서 점차 변경하면 성능이 점차 저하됩니다.
EXPLAIN (ANALYZE,BUFFERS)
몇 가지 쿼리를 실행 했으며 해시 조인이 상당히 느려진 것으로 보입니다. 이유가 명확하지 않습니다.
구체적인 예를 들기 위해 다음과 같은 쿼리가 있습니다. 기본 구성에서는 ~ 2100ms, 버퍼 크기가 증가한 구성에서는 ~ 3300ms로 실행됩니다.
select count(*) from contest c
left outer join contestparticipant cp on c.id=cp.contestId
left outer join teammember tm on tm.contestparticipantid=cp.id
left outer join staffmember sm on cp.id=sm.contestparticipantid
left outer join person p on p.id=cp.personid
left outer join personinfo pi on pi.id=cp.personinfoid
where pi.lastname like '%b%' or pi.firstname like '%a%';
EXPLAIN (ANALYZE,BUFFERS)
위의 쿼리의 경우 :
- 기본 버퍼 : http://explain.depesz.com/s/xaHJ
- 더 큰 버퍼 : http://explain.depesz.com/s/Plk
문제는 버퍼 크기를 늘릴 때 성능이 저하되는 이유 는 무엇입니까? 머신에 메모리가 부족하지 않습니다. OS의 공유 메모리가 ( shmmax
및 shmall
)가 매우 큰 값으로 설정된 경우에는 문제가되지 않습니다. Postgres 로그에도 오류가 발생하지 않습니다. 기본 구성에서 autovacuum을 실행하고 있지만 그와 관련이 있다고는 생각하지 않습니다. 모든 쿼리는 구성 변경 및 PG 재시작으로 몇 초 간격으로 동일한 컴퓨터에서 실행되었습니다.
편집 : 나는 특히 흥미로운 사실을 발견했습니다 .2010 년 중반 iMac (OSX 10.7.5)에서 Postgres 9.2.1 및 16GB RAM으로 동일한 테스트를 수행 할 때 속도가 느려지지 않습니다. 구체적으로 :
set work_mem='1MB';
select ...; // running time is ~1800 ms
set work_mem='96MB';
select ...' // running time is ~1500 ms
서버에서 정확히 동일한 데이터를 사용하여 정확히 동일한 쿼리 (위의 쿼리)를 수행하면 work_mem = 1MB에서 2100ms, 96MB에서 3200ms가 표시됩니다.
Mac에는 SSD가 있으므로 이해하기가 더 빠르지 만 예상되는 동작을 보여줍니다.
pgsql-performance에 대한 후속 토론 도 참조하십시오 .