이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 18.4. 토토 베이 리토토 베이 관리버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

17.4. 커널 리소스 관리

PostgreSQL특히 서버의 여러 사본이 동일한 시스템에서 실행되거나 대규모 설치에서 실행되는 경우 다양한 운영 체제 리소스 제한이 소진될 수 있습니다. 이 섹션에서는 다음에서 사용하는 커널 리소스를 설명합니다.포스트그레SQL및 와이즈 토토 리소스 소비와 관련된 문제를 해결하기 위해 취할 수 있는 단계.

17.4.1. 공유 메모리 및 세마포어

공유 메모리와 세마포어를 총칭하여 다음과 같이 지칭합니다."시스템 V IPC"(관련되지 않은 메시지 대기열과 함께포스트그레SQL). 다음 날짜 제외윈도우, 여기서포스트그레SQL이러한 기능의 자체 대체 구현을 제공합니다. 이러한 기능을 실행하려면 이 기능이 필요합니다.PostgreSQL.

이러한 시설의 완전한 부족은 일반적으로 다음과 같이 나타납니다.잘못된 시스템 호출서버 시작 시 오류가 발생했습니다. 이 경우 와이즈 토토을 재구성하는 것 외에는 다른 방법이 없습니다.포스트그레SQL그들 없이는 작동하지 않습니다. 그러나 이러한 상황은 최신 운영 체제에서는 드뭅니다.

언제PostgreSQL다양한 하드 중 하나를 초과IPC제한, 서버는 시작을 거부하고 문제와 이에 대해 수행할 작업을 설명하는 오류 메시지를 남겨야 합니다. (또한 참조섹션 17.3.1.) 관련 와이즈 토토 매개변수의 이름은 여러 시스템에서 일관되게 지정됩니다.표 17-1개요를 제공합니다. 그러나 설정 방법은 다양합니다. 일부 플랫폼에 대한 제안 사항은 아래와 같습니다.

참고:이전PostgreSQL9.3, 서버를 시작하는 데 필요한 System V 공유 메모리의 양이 훨씬 더 컸습니다. 이전 버전의 서버를 실행 중인 경우 서버 버전에 대한 설명서를 참조하세요.

표 17-1.시스템 V IPC매개변수

이름 설명 합리적인 값
SHMMAX 공유 메모리 세그먼트의 최대 크기(바이트) 최소 1kB(서버 복사본을 많이 실행하는 경우 더 많음)
SHMMIN 공유 메모리 세그먼트의 최소 크기(바이트) 1
SHMALL 사용 가능한 공유 메모리의 총량(바이트 또는 페이지) 바이트인 경우 다음과 동일SHMMAX; 페이지인 경우,ceil(SHMMAX/PAGE_SIZE)
SHMSEG 프로세스당 공유 메모리 세그먼트의 최대 수 1개의 세그먼트만 필요하지만 기본값은 훨씬 더 높습니다.
SHMMNI 시스템 전체 공유 메모리 세그먼트의 최대 수 좋아요SHMSEG다른 응용 프로그램을 위한 공간 추가
SEMMNI 세마포어 식별자(예: 세트)의 최대 수 적어도ceil((max_connections + autovacuum_max_workers + max_worker_processes + 5) / 16)
SEMMNS 시스템 전체 세마포어의 최대 수 ceil((max_connections + autovacuum_max_workers + max_worker_processes + 5) / 16) * 17다른 응용 프로그램을 위한 공간 추가
SEMMSL 세트당 세마포어의 최대 수 최소 17
SEMMAP 세마포어 맵의 항목 수 텍스트 참조
SEMVMX 세마포어의 최대값 최소 1000(기본값은 대개 32767입니다. 필요한 경우가 아니면 변경하지 마십시오)

PostgreSQL서버의 각 복사본에 대해 몇 바이트의 System V 공유 메모리(64비트 플랫폼의 경우 일반적으로 48바이트)가 필요합니다. 대부분의 최신 운영 체제에서는 이 양을 쉽게 할당할 수 있습니다. 그러나 서버 복사본을 많이 실행 중이거나 다른 응용 프로그램도 System V 공유 메모리를 사용하는 경우 메모리 용량을 늘려야 할 수 있습니다.SHMMAX, 공유 메모리 세그먼트의 최대 크기(바이트) 또는SHMALL, 시스템 전체의 System V 공유 메모리의 총량입니다. 참고하세요SHMALL많은 시스템에서 바이트가 아닌 페이지 단위로 측정됩니다.

공유 메모리 세그먼트의 최소 크기는 문제를 일으킬 가능성이 적습니다. (SHMMIN), 이는 최대 약 32바이트여야 합니다.PostgreSQL(보통 1입니다). 시스템 전체의 최대 세그먼트 수(SHMMNI) 또는 프로세스별(SHMSEG) 시스템에서 0으로 설정하지 않는 한 문제가 발생할 가능성이 없습니다.

PostgreSQL허용된 연결당 하나의 세마포어를 사용합니다(max_connections), 자동 진공 작업자 프로세스 허용(autovacuum_max_workers) 및 허용된 백그라운드 프로세스(max_worker_processes), 16개 세트. 각 세트에는 다음을 포함하는 17번째 세마포도 포함됩니다."매직 넘버", 다른 애플리케이션에서 사용하는 세마포어 세트와의 충돌을 감지합니다. 시스템의 최대 세마포어 수는 다음과 같이 설정됩니다.SEMMNS, 결과적으로 최소한만큼 높아야 합니다.max_connections플러스autovacuum_max_workers플러스max_worker_processes, 허용된 연결 16개당 하나의 추가 추가 및 작업자(공식 참조)표 17-1). 매개변수SEMMNI시스템에 동시에 존재할 수 있는 세마포어 세트 수에 대한 제한을 결정합니다. 따라서 이 매개변수는 최소한ceil((max_connections + autovacuum_max_workers + max_worker_processes + 5) / 16). 허용되는 연결 수를 낮추는 것은 일반적으로 혼란스럽게 표현되는 오류에 대한 임시 해결 방법입니다."기기에 남은 공간이 없습니다", 함수에서semget.

어떤 경우에는 증가가 필요할 수도 있습니다.SEMMAP적어도 다음 순서에 해당함SEMMNS. 시스템에 이 매개변수가 있는 경우(많은 경우 그렇지 않음) 사용 가능한 세마포의 각 연속 블록에 항목이 필요한 세마포 리소스 맵의 크기를 정의합니다. 세마포어 세트가 해제되면 해제된 블록에 인접한 기존 항목에 추가되거나 새 맵 항목 아래에 등록됩니다. 맵이 꽉 차면 해제된 세마포어가 손실됩니다(재부팅할 때까지). 시간이 지남에 따라 세마포어 공간이 조각화되면 사용 가능한 세마포어가 있어야 할 것보다 적어질 수 있습니다.

SEMMSL세트에 포함될 수 있는 세마포어 수를 결정하는 매개변수는 17개 이상이어야 합니다.PostgreSQL.

기타 관련 설정"세마포 실행 취소", 예를 들어SEMMNU그리고SEMUME, 영향을 주지 않습니다PostgreSQL.

AIX

적어도 버전 5.1에서는 다음과 같은 매개변수에 대해 특별한 구성을 수행할 필요가 없습니다.SHMMAX, 이는 모든 메모리를 공유 메모리로 사용할 수 있도록 구성되어 있는 것으로 보입니다. 이는 다음과 같은 다른 데이터베이스에 일반적으로 사용되는 구성입니다.DB/2.

그러나 전역을 수정해야 할 수도 있습니다.ulimit정보/etc/보안/제한, 파일 크기에 대한 기본 하드 제한(fsize) 및 파일 수(노파일)이 너무 낮을 수 있습니다.

FreeBSD

기본 IPC 설정은 다음을 사용하여 변경할 수 있습니다.sysctl또는로더인터페이스. 다음 매개변수는 다음을 사용하여 설정할 수 있습니다.sysctl:

# sysctl kern.ipc.shmall=32768
# sysctl kern.ipc.shmmax=134217728

재부팅 후에도 이 설정이 유지되도록 하려면 수정하세요./etc/sysctl.conf.

이 세마포어 관련 설정은 읽기 전용입니다.sysctl우려되지만 설정할 수 있습니다./boot/loader.conf:

kern.ipc.semmni=256
kern.ipc.semmns=512

해당 파일을 수정한 후 새 설정을 적용하려면 재부팅이 필요합니다.

또한 공유 메모리를 RAM에 잠그고 스왑을 위해 페이지 아웃되는 것을 방지하도록 커널을 구성할 수도 있습니다. 이는 다음을 사용하여 수행할 수 있습니다.sysctl설정kern.ipc.shm_use_phys.

활성화하여 FreeBSD 감옥에서 실행하는 경우sysctl'ssecurity.jail.sysvipc_allowed, 우체국장21219_21670

FreeBSD4.0 이전 버전은 이전 버전처럼 작동합니다오픈BSD(아래 참조).

NetBSD

NetBSD5.0 이상에서는 다음을 사용하여 IPC 매개변수를 조정할 수 있습니다.sysctl, 예:

# sysctl -w kern.ipc.semmni=100

이 설정을 재부팅 후에도 유지하려면 수정하세요./etc/sysctl.conf.

일반적으로 증가를 원할 것입니다.kern.ipc.semmni그리고kern.ipc.semmns, 다음과 같이NetBSD에 대한 기본 설정은 불편할 정도로 작습니다.

또한 공유 메모리를 RAM에 잠그고 스왑을 위해 페이지 아웃되는 것을 방지하도록 커널을 구성할 수도 있습니다. 이는 다음을 사용하여 수행할 수 있습니다.sysctl설정kern.ipc.shm_use_phys.

NetBSD5.0 이전 버전은 이전 버전처럼 작동합니다OpenBSD(아래 참조), 커널 매개변수는 키워드로 설정되어야 한다는 점을 제외하고옵션아님옵션.

OpenBSD

오픈BSD3.3 이상에서는 다음을 사용하여 IPC 매개변수를 조정할 수 있습니다.sysctl, 예:

# sysctl kern.seminfo.semmni=100

재부팅 후에도 이 설정이 유지되도록 하려면 수정하세요./etc/sysctl.conf.

당신은 일반적으로 증가를 원할 것입니다kern.seminfo.semmni그리고kern.seminfo.semmns, 다음과 같이오픈BSD에 대한 기본 설정은 불편할 정도로 작습니다.

이전 버전에서오픈BSD버전의 경우 IPC 매개변수를 변경하려면 사용자 정의 커널을 빌드해야 합니다. 옵션을 확인하세요.SYSVSHM그리고SYSVSEM도 활성화되어 있습니다. (기본값입니다.) 다음은 와이즈 토토 구성 파일에서 다양한 매개변수를 설정하는 방법의 예를 보여줍니다.

옵션 SYSVSHM
옵션 SHMMAXPGS=4096
옵션 SHMSEG=256

옵션 SYSVSEM
옵션 SEMMNI=256
옵션 SEMMNS=512
옵션 SEMMNU=256
HP-UX

일반 설치에는 기본 설정으로 충분합니다. 켜짐HP-UX10, 공장 기본값:SEMMNS은 128이며 대규모 데이터베이스 사이트에서는 너무 낮을 수 있습니다.

IPC매개변수는 다음에서 설정할 수 있습니다.시스템 와이즈 토토 와이즈 토토자 () 아래와이즈 토토 구성-구성 가능한 매개변수. 선택하세요새 와이즈 토토 생성완료되면.

리눅스

기본 최대 세그먼트 크기는 32MB이고 기본 최대 총 크기는 2097152페이지입니다. 페이지는 다음과 같은 비정상적인 와이즈 토토 구성을 제외하고 거의 항상 4096바이트입니다."거대한 페이지"(사용getconf PAGE_SIZE확인하기 위해).

공유 메모리 크기 설정은 다음을 통해 변경할 수 있습니다.sysctl인터페이스. 예를 들어 16GB를 허용하려면:

$ sysctl -w kernel.shmmax=17179869184
$ sysctl -w kernel.shmall=4194304

추가로 이 설정은 재부팅 후에도 파일에 보존될 수 있습니다./etc/sysctl.conf. 그렇게 하는 것이 좋습니다.

고대 배포판에는 다음이 없을 수 있습니다.sysctl프로그램이지만, 다음을 조작하여 동등한 변경을 할 수 있습니다./proc파일 시스템:

$ 에코 17179869184 /proc/sys/kernel/shmmax
$ 에코 4194304 /proc/sys/kernel/shmall

나머지 기본값은 상당히 넉넉한 크기이며 일반적으로 변경이 필요하지 않습니다.

OS X

OS X에서 공유 메모리를 구성하는 데 권장되는 방법은 다음과 같은 파일을 생성하는 것입니다./etc/sysctl.conf, 다음과 같은 변수 할당이 포함되어 있습니다.

kern.sysv.shmmax=4194304
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.sysv.shmall=1024

일부 OS X 버전에서는,다섯 개 모두공유 메모리 매개변수는 다음에서 설정되어야 합니다./etc/sysctl.conf, 그렇지 않으면 값이 무시됩니다.

최신 OS X 릴리스에서는 설정 시도를 무시합니다.SHMMAX4096의 정확한 배수가 아닌 값으로.

SHMALL이 플랫폼에서는 4KB 페이지로 측정됩니다.

이전 OS X 버전에서는 공유 메모리 매개변수의 변경 사항을 적용하려면 재부팅해야 합니다. 10.5부터는 다음을 제외한 모든 항목을 변경할 수 있습니다.SHMMNI즉시, 사용sysctl. 하지만 다음을 통해 원하는 값을 설정하는 것이 가장 좋습니다./etc/sysctl.conf, 재부팅 후에도 값이 유지됩니다.

파일/etc/sysctl.confOS X 10.3.9 이상에서만 적용됩니다. 이전 10.3.x 릴리스를 실행 중인 경우 파일을 편집해야 합니다./etc/rc그리고 다음 명령의 값을 변경하십시오:

sysctl -w kern.sysv.shmmax
sysctl -w kern.sysv.shmmin
sysctl -w kern.sysv.shmmni
sysctl -w kern.sysv.shmseg
sysctl -w kern.sysv.shmall

참고하세요/etc/rc일반적으로 OS X 시스템 업데이트로 덮어쓰므로 업데이트할 때마다 이러한 편집을 다시 실행해야 합니다.

OS X 10.2 이하에서는 대신 파일에서 이 명령을 편집하십시오./시스템/라이브러리/StartupItems/SystemTuning/SystemTuning.

SCO 오픈서버

기본 구성에서는 세그먼트당 512kB의 공유 메모리만 허용됩니다. 설정을 높이려면 먼저 디렉터리로 변경하세요./etc/conf/cf.d. 현재 값을 표시하려면SHMMAX, 실행:

./configure -y SHMMAX

새 값을 설정하려면SHMMAX, 실행:

./SHMMAX 구성=

어디에서는 사용하려는 새 값(바이트 단위)입니다. 설정 후SHMMAX, 와이즈 토토을 다시 빌드합니다:

./link_unix

그리고 재부팅하세요.

솔라리스2.6 ~ 2.9(Solaris 6 ~ Solaris 9)

관련 설정은 다음에서 변경할 수 있습니다./etc/시스템, 예:

set shmsys:shminfo_shmmax=0x2000000
shmsys:shminfo_shmmin=1로 설정
shmsys:shminfo_shmmni=256으로 설정
shmsys:shminfo_shmseg=256으로 설정

semsys:seminfo_semmap=256 설정
semsys:seminfo_semmni=512로 설정
semsys:seminfo_semmns=512로 설정
semsys:seminfo_semmsl=32를 설정합니다.

변경 사항을 적용하려면 재부팅해야 합니다. 또한 참조하세요http://sunsite.uakom.sk/sunworldonline/swol-09-1997/swol-09-insidesolaris.html이전 버전의 Solaris에서 공유 메모리에 대한 정보를 보려면.

솔라리스2.10(Solaris 10) 이상
오픈솔라리스

Solaris 10 이상 및 OpenSolaris에서는 기본 공유 메모리 및 세마포어 설정이 대부분의 경우에 충분합니다.PostgreSQL응용프로그램. 이제 Solaris의 기본값은 aSHMMAX시스템의 1/4 중. 이 설정을 추가로 조정하려면 다음과 관련된 프로젝트 설정을 사용하세요.포스트그레스사용자. 예를 들어 다음과 같이 실행합니다.루트:

projadd -c "PostgreSQL DB 사용자" -K "project.max-shm-memory=(권한,8GB,거부)" -U postgres -G postgres user.postgres

이 명령은 다음을 추가합니다user.postgres프로젝트를 수행하고 다음에 대한 공유 메모리 최대값을 설정합니다.포스트그레사용자를 8GB로 저장하고 다음에 사용자가 로그인하거나 다시 시작할 때 적용됩니다.PostgreSQL(다시 로드하지 않음). 위의 내용은 다음과 같이 가정합니다.포스트그레SQL다음에 의해 실행됩니다.포스트그레스사용자포스트그레그룹. 서버 재부팅이 필요하지 않습니다.

연결 수가 많은 데이터베이스 서버에 대한 기타 권장 커널 설정 변경은 다음과 같습니다.

project.max-shm-ids=(priv,32768,거부)
project.max-sem-ids=(priv,4096,deny)
project.max-msg-ids=(priv,4096,deny)

추가로, 당신이 달리고 있다면포스트그레SQL영역 내부에서는 영역 리소스 사용 제한도 높여야 할 수도 있습니다. 에서 "2장: 프로젝트 및 작업"을 참조하세요.시스템 와이즈 토토자 안내서자세한 내용은프로젝트그리고prctl.

유닉스웨어

켜짐유닉스웨어7, 공유 메모리 세그먼트의 최대 크기는 기본 구성에서 512kB입니다. 현재 값을 표시하려면SHMMAX, 실행:

/etc/conf/bin/idtune -g SHMMAX

현재, 기본값, 최소값 및 최대값을 표시합니다. 에 대한 새 값을 설정하려면SHMMAX, 실행:

/etc/conf/bin/idtune SHMMAX

어디에서는 사용하려는 새 값(바이트 단위)입니다. 설정 후SHMMAX, 와이즈 토토을 다시 빌드합니다:

/etc/conf/bin/idbuild -B

그리고 재부팅하세요.

17.4.2. 시스템화된 RemoveIPC

만약시스템이 사용 중이면 운영 체제에서 IPC 리소스(공유 메모리 및 세마포어)를 조기에 제거하지 않도록 주의해야 합니다. 이는 소스에서 PostgreSQL을 설치할 때 특히 중요합니다. PostgreSQL 배포 패키지 사용자는 영향을 받을 가능성이 적습니다.포스트그레스사용자는 일반적으로 시스템 사용자로 생성됩니다.

설정IPC 제거inlogind.conf사용자가 완전히 로그아웃할 때 IPC 개체가 제거되는지 여부를 제어합니다. 시스템 사용자는 면제됩니다. 재고가 있는 경우 이 설정은 기본적으로 켜져 있습니다.시스템, 그러나 일부 운영 체제 배포판에서는 기본적으로 꺼져 있습니다.

이 설정이 켜져 있을 때 일반적으로 관찰되는 효과는 PostgreSQL 서버에서 사용하는 세마포어 개체가 무작위로 제거되어 다음과 같은 로그 메시지와 함께 서버가 충돌하는 것입니다.

로그: semctl(1234567890, 0, IPC_RMID, ...) 실패: 잘못된 인수

다양한 유형의 IPC 객체(공유 메모리 대 세마포어, 시스템 V 대 POSIX)는 다음과 같이 약간 다르게 처리됩니다.시스템, 따라서 일부 IPC 리소스가 다른 리소스와 동일한 방식으로 제거되지 않는 것을 볼 수 있습니다. 그러나 이러한 미묘한 차이에 의존하는 것은 바람직하지 않습니다.

A "사용자 로그아웃"유지 관리 작업의 일부로 또는 관리자가 다음 계정으로 로그인할 때 수동으로 발생할 수 있습니다.포스트그레사용자 또는 이와 유사한 사용자이므로 일반적으로 예방하기는 어렵습니다.

a이란 무엇입니까"시스템 사용자"다음에 결정됨시스템컴파일 시간SYS_UID_MAX설정/etc/login.defs.

패키징 및 배포 스크립트는 다음을 생성할 때 주의해야 합니다.포스트그레다음을 사용하여 시스템 사용자로 사용자useradd -r, adduser --system또는 이에 상응하는 것.

또는 사용자 계정이 잘못 생성되었거나 변경할 수 없는 경우 설정하는 것이 좋습니다.

IPC 제거=아니요

/etc/systemd/logind.conf또는 다른 적절한 구성 파일.

주의

이 두 가지 중 적어도 하나가 보장되어야 합니다. 그렇지 않으면 PostgreSQL 서버가 매우 불안정해질 것입니다.

17.4.3. 리소스 제한

Unix 계열 운영 체제는 귀하의 작업을 방해할 수 있는 다양한 종류의 리소스 제한을 시행합니다.PostgreSQL서버. 특히 중요한 것은 사용자당 프로세스 수, 프로세스당 열려 있는 파일 수, 각 프로세스에서 사용할 수 있는 메모리 양에 대한 제한입니다. 이들 각각에는"단단한"그리고"부드러운"한계. 소프트 제한은 실제로 중요한 것이지만 사용자가 하드 제한까지 변경할 수 있습니다. 하드 제한은 루트 사용자만 변경할 수 있습니다. 시스템 호출setrlimit이 매개변수 설정을 담당합니다. 셸의 내장 명령ulimit(본 쉘) 또는한계 (csh)은 명령줄에서 리소스 제한을 제어하는 데 사용됩니다. BSD 파생 시스템에서는 파일/etc/login.conf로그인 중에 설정된 다양한 자원 제한을 제어합니다. 자세한 내용은 운영 체제 설명서를 참조하세요. 관련 매개변수는 다음과 같습니다.maxproc, 열린 파일데이터 크기. 예를 들면:

기본값:\
...
        :datasize-cur=256M:\
        :maxproc-cur=256:\
        :openfiles-cur=256:\
...

(-현재은 소프트 한계입니다. 추가-최대하드 제한을 설정합니다.)

커널은 일부 리소스에 대해 시스템 전체에 대한 제한을 가질 수도 있습니다.

  • 켜짐리눅스 /proc/sys/fs/file-max커널이 지원할 최대 열린 파일 수를 결정합니다. 파일에 다른 번호를 쓰거나 다음에 과제를 추가하여 변경할 수 있습니다./etc/sysctl.conf. 프로세스당 최대 파일 제한은 커널이 컴파일될 때 고정됩니다. 참조/usr/src/linux/Documentation/proc.txt더 많은 정보를 원하시면.

PostgreSQL서버는 연결당 하나의 프로세스를 사용하므로 시스템의 나머지 부분에 필요한 것 외에도 허용된 연결 수 이상의 프로세스를 제공해야 합니다. 이는 일반적으로 문제가 되지 않지만 한 시스템에서 여러 서버를 실행하는 경우 문제가 발생할 수 있습니다.

열린 파일에 대한 공장 기본 제한은 종종 다음과 같이 설정됩니다."사회 친화적"시스템 리소스의 부적절한 부분을 사용하지 않고도 많은 사용자가 시스템에서 공존할 수 있게 해주는 값입니다. 한 머신에서 많은 서버를 실행하는 경우 이것이 아마도 원하는 것일 수 있지만 전용 서버에서는 이 제한을 높이고 싶을 수도 있습니다.

반전적으로, 일부 시스템에서는 개별 프로세스가 많은 수의 파일을 열 수 있도록 허용합니다. 프로세스 수가 너무 많으면 시스템 전체 제한이 쉽게 초과될 수 있습니다. 이런 일이 발생하고 시스템 전체 제한을 변경하고 싶지 않은 경우 다음을 설정할 수 있습니다.PostgreSQLmax_files_per_process열린 파일의 소비를 제한하는 구성 매개변수입니다.

17.4.4. Linux 메모리 오버커밋

Linux 2.4 이상에서는 기본 가상 메모리 동작이 최적이 아닙니다.PostgreSQL. 와이즈 토토이 메모리 오버커밋을 구현하는 방식으로 인해 와이즈 토토은PostgreSQL포스트마스터(마스터 서버 프로세스) 중 하나의 메모리가 필요한 경우PostgreSQL또는 다른 프로세스로 인해 시스템의 가상 메모리가 부족해졌습니다.

이런 일이 발생하면 다음과 같은 커널 메시지가 표시됩니다(이러한 메시지를 찾을 수 있는 위치는 시스템 문서 및 구성을 참조하세요):

메모리 부족: 프로세스 12345(postgres)가 종료되었습니다.

이것은 다음을 나타냅니다.포스트그레스메모리 부족으로 인해 프로세스가 종료되었습니다. 기존 데이터베이스 연결은 계속 정상적으로 작동하지만 새 연결은 허용되지 않습니다. 회복하려면,PostgreSQL다시 시작해야 합니다.

이 문제를 피하는 한 가지 방법은 다음을 실행하는 것입니다.PostgreSQL다른 프로세스가 기계의 메모리 부족을 실행하지 않을 것이라고 확신할 수 있는 기계에서. 메모리가 부족한 경우 운영 체제의 스왑 공간을 늘리면 문제를 방지하는 데 도움이 될 수 있습니다. 메모리 부족(OOM) 킬러는 실제 메모리와 스왑 공간이 소진된 경우에만 호출되기 때문입니다.

만약포스트그레SQL자체가 시스템 메모리 부족의 원인이므로 구성을 변경하여 문제를 피할 수 있습니다. 어떤 경우에는 메모리 관련 구성 매개변수를 낮추는 것이 도움이 될 수 있습니다. 특히shared_buffers그리고work_mem. 다른 경우에는 데이터베이스 서버 자체에 너무 많은 연결을 허용하여 문제가 발생할 수 있습니다. 많은 경우에는 줄이는 것이 더 나을 수도 있습니다.max_connections대신 외부 연결 풀링 소프트웨어를 사용하세요.

Linux 2.6 이상에서는 커널의 동작을 수정하여 다음과 같은 일이 발생하지 않도록 할 수 있습니다."오버커밋"메모리. 이 설정으로 인해 다음이 방지되지는 않지만OOM 킬러모두 호출되면 가능성이 크게 낮아지므로 시스템 동작이 더욱 강력해집니다. 이는 다음을 통해 엄격한 오버커밋 모드를 선택하여 수행됩니다.sysctl:

sysctl -w vm.overcommit_memory=2

또는 동등한 항목 배치/etc/sysctl.conf. 관련 설정을 수정하고 싶을 수도 있습니다.vm.overcommit_ratio. 자세한 내용은 커널 문서 파일을 참조하세요.문서/vm/overcommit-accounting.

변경 여부에 관계없이 사용할 수 있는 또 다른 접근 방식vm.overcommit_memory, 프로세스별 설정입니다OOM 점수 조정포스트마스터 프로세스 값-1000, 이를 통해 OOM 킬러의 표적이 되지 않도록 보장합니다. 이를 수행하는 가장 간단한 방법은 실행하는 것입니다.

에코 -1000  /proc/self/oom_score_adj

포스트마스터를 호출하기 직전에 포스트마스터의 시작 스크립트에 있습니다. 이 작업은 루트로 수행해야 하며 그렇지 않으면 아무런 효과가 없습니다. 따라서 루트 소유 시작 스크립트를 사용하는 것이 가장 쉬운 방법입니다. 이렇게 하려면 postmaster를 호출하기 전에 시작 스크립트에서 다음 환경 변수도 설정해야 합니다.

PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj 내보내기
PG_OOM_ADJUST_VALUE=0 내보내기

이러한 설정은 포스트마스터 하위 프로세스가 일반 OOM 점수 조정 0으로 실행되도록 하여 OOM 킬러가 여전히 필요할 때 이를 대상으로 삼을 수 있도록 합니다. 다른 값을 사용할 수 있습니다.PG_OOM_ADJUST_VALUE다른 OOM 점수 조정과 함께 하위 프로세스를 실행하려는 경우. (PG_OOM_ADJUST_VALUE생략할 수도 있으며, 이 경우 기본값은 0입니다.) 설정하지 않은 경우PG_OOM_ADJUST_FILE, 하위 프로세스는 포스트마스터와 동일한 OOM 점수 조정으로 실행됩니다. 전체 요점은 포스트마스터가 우선 설정을 갖도록 하는 것이므로 현명하지 않습니다.

이전 Linux 커널은 제공하지 않음/proc/self/oom_score_adj, 그러나 다음과 같은 동일한 기능의 이전 버전이 있을 수 있습니다./proc/self/oom_adj. 비활성화 값을 제외하면 동일하게 작동합니다.-17아님-1000.

참고:일부 공급업체의 Linux 2.4 커널에 2.6 오버커밋의 초기 버전이 있는 것으로 보고되었습니다.sysctl매개변수. 그러나 설정vm.overcommit_memory43835_44015vm_enough_memory파일에서mm/mmap.c) 2.4 설치에서 이를 시도하기 전에 커널에서 지원되는 것이 무엇인지 확인하십시오. 의 존재과도한 커밋-회계문서 파일은 다음과 같습니다아님기능이 있다는 증거로 간주됩니다. 의심스러운 경우 와이즈 토토 전문가나 와이즈 토토 공급업체에 문의하세요.

17.4.5. Linux 거대 페이지

대규모 페이지를 사용하면 대규모 연속 메모리 청크를 사용할 때 오버헤드가 줄어듭니다.PostgreSQL특히 큰 값을 사용할 때shared_buffers. 이 기능을 사용하려면포스트그레SQL와이즈 토토이 필요합니다CONFIG_HUGETLBFS=y그리고CONFIG_HUGETLB_PAGE=y. 커널 설정도 조정해야 합니다.vm.nr_hugepages. 필요한 대용량 페이지 수를 추정하려면 다음을 시작하세요.포스트그레SQL큰 페이지를 활성화하지 않고 포스트마스터의 페이지를 확인하세요VmPeak값 및 시스템의 거대한 페이지 크기,/proc파일 시스템. 다음과 같을 수 있습니다:

$ 헤드 -1 $PGDATA/postmaster.pid
4170
$ grep ^VmPeak /proc/4170/statusVmPeak: 6490428kB
$grep ^Hugepagesize /proc/meminfo대형 페이지 크기: 2048 kB

6490428 / 2048대략적으로 제공3169.154, 따라서 이 예에서는 최소한3170우리가 설정할 수 있는 거대한 페이지:

$ sysctl -w vm.nr_hugepages=3170

기계의 다른 프로그램에도 대용량 페이지가 필요한 경우 더 큰 설정이 적절할 것입니다. 이 설정을 다음에 추가하는 것을 잊지 마세요./etc/sysctl.conf재부팅 후 다시 적용되도록 합니다.

커널이 원하는 수의 대용량 페이지를 즉시 할당할 수 없는 경우가 있으므로 명령을 반복하거나 재부팅해야 할 수도 있습니다. (재부팅 직후 대부분의 머신 메모리를 대용량 페이지로 변환하는 데 사용할 수 있어야 합니다.) 대용량 페이지 할당 상황을 확인하려면 다음을 사용하세요.

$ grep 거대한 /proc/meminfo

또한 설정을 통해 대용량 페이지를 사용하려면 데이터베이스 서버의 운영 체제 사용자 권한을 부여해야 할 수도 있습니다.vm.hugetlb_shm_group경유sysctl및/또는 다음을 사용하여 메모리를 잠글 수 있는 권한을 부여합니다.ulimit -l.

거대한 페이지의 기본 동작PostgreSQL가능하면 이를 사용하고 실패하면 일반 페이지로 돌아가는 것입니다. 거대한 페이지의 사용을 강제하려면 다음을 설정할 수 있습니다.거대한_페이지켜짐inpostgresql.conf. 이 설정을 사용하면 참고하세요.PostgreSQL사용 가능한 대용량 페이지가 충분하지 않으면 시작하지 못할 것입니다.

자세한 설명은리눅스대형 페이지 기능을 살펴보세요https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt.