fatal : could not create semaphores : No space left on device

PostgreSQL Max_connections

fatal : could not create semaphores : No space left on device 메시지 해결 방법에 대해서 알아보겠습니다.

postgresql.conf 파일에서 MAX_Connections 파라미터 값을 증가시키면 postgresql 서비스 시작 시 오류가 발생할 수 있습니다.

이럴 때에는 세마포어라는 값을 수정해 줘야 합니다.

 

'fatal : could not create semaphores : No space left on device' 라는 메시지는 디바이스에 공간이 없다고 나오지만 실제로 디스크 공간이 부족하다는 이야기는 아니고 세마포어 최대 수를 초과 했을 때 알림이 오는 것 입니다. 신호 볼륨이 부족하다고 생각하시면 되겠습니다.

 

세마포어(semaphore)

세마포어는 공유된 자원에 여러 개의 프로세스가 동시에 접근하는 것을 막기 위해 한 번에 하나의 프로세스만 접근이 가능하도록 제한을 하기 위해 고안된 것입니다.
가끔 뮤텍스(Mutex)와 비교가 되기도 하는데 차이점은 세마포어는 동기화 대상이 하나 이상, 뮤텍스는 동기화 대상이 하나일 경우 사용하게 됩니다.

 

세마포어 값 확인

- cat /proc/sys/kernal/sem
- ipcs -ls
- sysctl -p // /etc/sysctl.conf에 설정된 값들을 바로 적용시킬 수 있으며, 입력된 값은 재부팅 시 자동 적용됩니다.

 

sysctl은 kernal parameter 값들을 조정하기 위한 유틸리티입니다.

 

세마포어 최대

ipcs -ls

최대 배열 수 = 128
어레이당 최대 세마포어 = 250
최대 세마포 시스템 전체 = 32000
semop 호출당 최대 작업 = 32
세마포 최대값 = 32767

 

sysctl -a

sysctl -a 로 조절할 수 있는 커널 파라미터들을 확인하실 수 있습니다.

커널 파라미터 확인

 

커널파라메터 수정

$ vi /etc/sysctl.conf

커널 파라미터 수정

번역하면 다음과 같습니다.

# sysctl 설정은 다음의 파일을 통해 정의됩니다.
# /usr/lib/sysctl.d/, /run/sysctl.d/ 및 /etc/sysctl.d/.
#
# 공급업체 설정은 /usr/lib/sysctl.d/에 있습니다.
# 전체 파일을 재정의하려면 동일한 내용으로 새 파일을 만듭니다.
# /etc/sysctl.d/에 새 설정을 추가합니다. 재정의하려면
# 특정 설정만, 사전적으로 나중에 파일 추가
# /etc/sysctl.d/에 이름을 지정하고 거기에 새 설정을 넣습니다.
#
# 자세한 내용은 sysctl.conf(5) 및 sysctl.d(5)를 참조하십시오.

 

세마포어 값 수정

kerlel.sem=250 256000 32 256

네번째 값이 SEMMNI이고 이 값을 증가시켜야 합니다.(세마포어 배열의 최대갯수).

$ sysctl -p /etc/sysctl.conf   // 수정한 값으로 리로드 합니다.

 

수정 후 데이터베이스도 재시작 해주세요

 

SEMMNI 구하는 공식

SEMMNI = (max_connections + autovacuum_max_workers + 4) / 16

댓글

Designed by JB FACTORY