max_connections 와 커널파라메터

POSTGRESQL 2014. 10. 27. 19:41
postgresql 의 max_connections 값을 증가시키고 나서 클러스터(인스턴스) 기동 시 다음과 같은 오류가 발생할 수 있습니다.
FATAL:  could not create semaphores: No space left on device
[2012-10-24 16:49:55.313 KST][][][][][20731]DETAIL:  Failed system call was semget(5433033, 17, 03600).
[2012-10-24 16:49:55.313 KST][][][][][20731]HINT:  This error does *not* mean that you have run out of disk space.
 It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number
 of semaphores (SEMMNS), would be exceeded.  You need to raise the respective kernel parameterively, reduce PostgreSQL's 
consumption of semaphores by reducing its max_connections parameter (currently 510).
 The PostgreSQL documentation contains more information about configuring your system for PostgreSQL.
이러한 오류는 max_connections 파라메터가 SEMMNI라는 세마포어 관련 커널 파라메터값을 초과해서 발생되는 오류로 커널 제한값을 늘리거나 postgresql의 max_connections 값을 줄여서 해결할 수 있습니다.
아래는 커널파라메터 값을 수정하는 방법입니다.(root권한이 필요합니다.)

1. 커널파라메터 확인 : Semaphore Limits 부분의 max number of arrays 항목을 확인합니다.
$ ipcs -l

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 16
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536


2. 커널파라메터 수정
$ vi /etc/sysctl.conf
kerlel.sem=250 256000 32 128    ## 네번째 값이 SEMMNI이고 이 값을 증가시켜야 합니다.(세마포어 배열의 최대갯수).
$ sysctl -p /etc/sysctl.conf    ## 수정한 값으로 리로드 합니다.
파라메터를 구하는 공식 :
SEMMNI = (max_connections + autovacuum_max_workers + 4) / 16