2. DBMS이야기/01. PostgreSQL

[PostgreSQL ADMIN] postgresql.conf 설정파일

OSSW(Open Source System SoftWare 2014. 10. 20. 14:10

postgresql.conf 설정파일


Postgresql 에는 여러 설정파일이 존재하는데 postgresql.conf 파일은 일반적인 서버 운영에 관련된 설정파일입니다. 포트, 로그, 백쿰, 메모리 설정등 Postgresql 운영에 필요한 모든 내용을 설정할 수 있습니다. postgresql.conf 파일에서 같은 설정을 두번하는 경우에는 맨 나중에 설정한 라인이 적용됩니다. 또 postgresql.conf 는 또다른 설정파일을 include 할 수 있습니다.


postgresql.conf 파일에서 메모리 설정을 할때에는 리눅스 시스템의 'sysctl' 명령얼 알고 있어야 합니다. 리눅스 시스템의 공유메모리(shared memory)를 설정은 sysctl을 이용해서 변경할 수 있고 '/etc/sysctl.conf' 파일의 용도도 알고 있어야 합니다. 더 나가 현재 리눅스 시스템에 동작하는 애플리케이션들의 시스템 의존도를 알고 있어야만 합니다.


share_buffers = 32MB


기본값은 위와 같습니다. 이값은 sysctl 의 'kernel.shmmax' 값에 영향을 받습니다. 그 값내에서 postgresql이 사용할 공유메모리를 결정하는 것입니다. 리눅스 서버에 기타 애플리케이션을 살펴보고 메모리 사용량을 체크한 후에 어느정도 여유가 있다고 판단된다면, 그리고 postgresql 이 많은 일을 해야할 처지에 있다면 이 값을 높여주는 것이 좋습니다.


메뉴얼에 의하면 공유 메모리는 다음과 같은 용도로 사용되어 집니다.


이것을 보면 어떻게 share_buffers 값을 설정해야 하는지를 알 수 있습니다. max_locks_per_transation 값의 기본 값은 64 입니다. 이름과는 달리 각 트랜잭션마다 평균적인 locks 객체 수를 제어하게 됩니다. locks 객체는 락이된(locked) 숫자를 말하는 것이 아닙니다. 64라는 기본값은 역사적으로 입증되어진 충분한 값이지만 클라이언트가 단일 트랜잭션에서 서로다른 테이블들을 많이 접근한다면 이 값을 높여줄 필요가 있습니다.


temp_buffers = 8MB


이것은 임시테이블을 위한 것입니다. 데이터베이스 시스템은 임시 테이블을 사용해야 하는경우가 종종 발생합니다. 메모리에 여유가 있다면 이 값을 높여주시는 것도 좋습니다.


max_prepared_transaction = 0


이것은 Prepared transaction 이 무엇인지를 모른다면 디폴트값 '0'으로 그대로 놔두는 것이 현명합니다. 이 값을 설정하게 되면 모든 세션은 Prepared transaction 기능을 사용하게 됩니다. 최소 max_connection 값보다 커야합니다.


work_mem = 1024


임시 디스크 파일로 쓰기전에 내부적인 작업, 정렬, 해쉬테이블 사용, Distinct, In, Join 등의 작업을 수행할때 사용되어지는 메모리 값을 정합니다. 기본값은 1024 입니다. 한가지 주의할 것은 복잡한 쿼리의 경우 내부적으로 몇번의 정렬, 해쉬테이블의 사용이 병렬적으로(Parallel) 일어나는데 각각의 작업들 마다 이 메모리 값만큼 사용을 합니다. 쉽게 말해서 내부적으로 정렬이 5번 일어났다면 각각 1024byte 씩 사용한다는 것입니다. 복잡한 연산을 위한 총합으로 생각해서는 절대로 안되며, 내부적인 작업이 병렬로 일어난다고 하더라도 단 하나의 작업이 사용하는 값으로 생각해야 합니다. 따라서 너무 높게 잡아주는 것은 낭비 일수 있으며 데이터베이스의 쿼리분석을 통해서 값을 정하는 것이 현명합니다. 보통 복잡하고 큰 쿼리를 자주 사용한다면 이 값을 적절하게 조정해 줄 필요가 있습니다.


maintenance_work_mem = 16MB


'maintenance operations'라고 해서 인덱스를 생성, 테이블에 외래키 추가, 백쿰(VACUUM)등의 작업을 말하는데 이를 위해서 필요한 메모리를 말합니다. 기본값은 16MB 입니다. 백쿰(VACUUM)이나 데이터베이스 덤프와 임포트시에 이 메모리를 사용하는데, 이 값을 늘려주면 성능향상을 볼수 있습니다. 보통 work_mem 값보다 알맞게 높은 값을 지정해주면 좋습니다.


또 autovacuum 을 설정해 운영한다면 이 값을 적절하게 지정하는 것을 권장합니다.


max_stack_depth = 2MB


서버가 실행하는 스택(Stack)의 안전한 최대 깊이를 지정합니다.(역, 정확하게 무슨말인지 모르겠습니다. 단순히 스택 메모리 사이즈를 말하는 것인지....) 이값은 커널 ulimit -s 값에 영향을 받습니다. ulimit -s 값보다 높게 설정할 수 없습니다. 만일 이 값보다 높게 잡으면 재귀적 함수 호출시에 개별 백그라운드 프로세스가 크래쉬 될 것입니다. 또 너무 많이 설정하면 시스템이 크래쉬 될수 있습니다. 이 메모리는 함수를 실행할때 주로 사용되어 짐으로 사용자 정의 함수나 기본함수를 자주 사용한다면 적절하게 조금만 늘려주는 것도 좋습니다.


조심해서 설정을 하셔야 할 항목입니다.


max_files_per_process = 1000


이 설정은 서버의 서브프로세스가 열수 있는 파일의 최대 갯수를 지정합니다. 이것도 커널 파라메터에 영향을 받습니다.


shared_preload_libraries


이 설정은 서버가 시작될때에 미리 로드할 라이브러리들을 지정합니다. 한개 이상 지정할 수 있으며 모든 라이브러리 이름은 소문자로 변환하고 여러개를 지정할때는 콤마(,)로 구분합니다. 'procedural language libraries'들도 이를 사용할 수 있습니다.


shared_preload_libraries = '$libdir/mylib, $libdir/youlib'

한가지 주의해야 할 것은 모든 Postgresql 의 라이브러리는 'magic block'이라고 해서 호환성 체크를 하는데, 이것 때문에 non-Postgresql 라이브러리는 이 방법을 사용할 수 없습니다.


지정한 경로에 라이브러리가 없다면 서버는 시작될 수 없습니다.


출처 : http://histlinux.egloos.com

by. 백준 (2014.10.20)