shmall, shmmax, shmmin 등을 일반적으로 설정하고 postgresql을 설정하는 방법


11

PostgreSQL문서를 사용하여 예 를 들어이 구성 을 설정했습니다.

>>> cat /proc/meminfo 
MemTotal:       16345480 kB
MemFree:         1770128 kB
Buffers:          382184 kB
Cached:         10432632 kB
SwapCached:            0 kB
Active:          9228324 kB
Inactive:        4621264 kB
Active(anon):    7019996 kB
Inactive(anon):   548528 kB
Active(file):    2208328 kB
Inactive(file):  4072736 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              3432 kB
Writeback:             0 kB
AnonPages:       3034588 kB
Mapped:          4243720 kB
Shmem:           4533752 kB
Slab:             481728 kB
SReclaimable:     440712 kB
SUnreclaim:        41016 kB
KernelStack:        1776 kB
PageTables:        39208 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172740 kB
Committed_AS:   14935216 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      399340 kB
VmallocChunk:   34359334908 kB
HardwareCorrupted:     0 kB
AnonHugePages:    456704 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

>>> ipcs -l          

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4316816
max total shared memory (kbytes) = 4316816
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 = 31918
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

나에 의해 계산 된 sysctl.conf extract :

kernel.shmall = 1079204
kernel.shmmax = 4420419584

나에 의해 계산 된 postgresql.conf non defaults :

max_connections = 60            # (change requires restart)
shared_buffers = 4GB            # min 128kB
work_mem = 4MB              # min 64kB
wal_sync_method = open_sync     # the default is the first option
checkpoint_segments = 16        # in logfile segments, min 1, 16MB each
checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
effective_cache_size = 6GB

이것이 적절합니까? 그렇지 않은 경우 (또는 반드시 그런 것은 아님) 어떤 경우에 적합합니까?

이 구성으로 성능이 크게 향상되었다는 점에 주목했습니다. 어떻게 개선하겠습니까?

커널 메모리 관리 매개 변수를 계산하는 방법?

아무도 처음부터 실제로 설정하는 방법을 설명 할 수 있습니까?


많은 질문이 있으며 현재 문제가 무엇인지 또는 사용 패턴이 무엇인지 알려주지 않았습니다. PostgreSQL 성능에 대한 책을 얻을 가치가 있습니다.
hmallett

내 문제는 내가 올바르게 설정했는지 확신하지 못한다는 것입니다. 커널 메모리 관리 옵션은 PostgreSQL에만 국한된 것이 아니라고 생각합니다. PostgreSQL이 이러한 옵션에 대해 이야기하기에 가장 적합한 곳인지 확실하지 않습니다. 물론 PostgreSQL 성능에 대한 기사에서 많이 언급되었지만 Linux 옵션이므로 일반적인 조정 방법을 실제로 이해하기를 기대합니다.
jpic

답변:


11

나는 또 다른 질문에 대해 여기에 대답했다.

Git이 '메모리 부족'오류와 함께 푸시하지 못함

나는 당신의 모든 질문에 대답하지 않고 제목의 질문에 답합니다.

shmall, shmmax, shmmni 등을 일반적으로 설정하고 postgresql을 설정하는 방법

일부 커널 배포에는 커널이 최대 메모리를 단일 프로세스에 할당하지 못하게하는 설정이 있습니다.

커널 매개 변수 설정

/etc/sysctl.conf운영 체제에 적합한 행을 포함 하도록 파일을 수정하십시오 .

# Red Hat Enterprise Linux 3.0 and CentOS 3.x 
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmin = 1
kernel.shmseg = 10

# semaphores: 
semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128
fs.file-max = 65536

# Red Hat Enterprise Linux 4.0 and CentOS 4.x 
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152

프로세스가 한계를 초과하면 시스템에서 사용 가능한 최대 메모리가보고 되었음에도 불구하고 커널은 프로세스를 종료시킵니다.

참고 :이 설정에주의하십시오. 우리 환경의 서버에서 설정을 가져 왔을 때이 예제의 설정을 사용하고 싶지 않을 것입니다.

언급 할 몇 가지 추가 참고 사항 :

sysctl로 커널 설정을 업데이트하고 테스트하려면 다음 명령을 사용하십시오.

현재 설정 목록 :

sysctl -A | grep shm
sysctl -w kernel.shmmax=<value> to write in sysctl.conf
sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf

/etc/selinux/configSELINUX 플래그가 다음과 같이 설정되어 있는지 확인하여 파일 을 편집하여 보안 Linux를 비활성화 하십시오.

SELINUX=disabled

이것이 적절합니까? 그렇지 않은 경우 (또는 반드시 그런 것은 아님) 어떤 경우에 적합합니까?

커널 설정은 일반적으로 ISP 제공 업체가 단일 고객 프로세스가 공유 서버의 모든 리소스를 사용하는 것을 원하지 않는 경우 데이터 센터 환경에서보다 엄격하게 정의됩니다.

리소스 부족으로 인해 커널에 의해 종료되는 프로세스가 없으면 일반적으로 커널 메모리 매개 변수를 설정할 필요가 없습니다.

경우에 따라 postgres는 공유 메모리에서 사용 가능한 것보다 특정 페이지 크기에 더 많은 메모리를 할당 할 수 있습니다.

* The PostgreSQL server failed to start. Please check the log output:
2011-11-04 05:06:26 UTC FATAL: could not create shared memory segment: Invalid
argument
2011-11-04 05:06:26 UTC DETAIL: Failed system call was shmget(key=5432001, size
=161849344, 03600).
2011-11-04 05:06:26 UTC HINT: This error usually means that PostgreSQL’s reques
t for a shared memory segment exceeded your kernel’s SHMMAX parameter. You can
either reduce the request size or reconfigure the kernel with larger SHMMAX. To
reduce the request size (currently 161849344 bytes), reduce PostgreSQL’s shared
_buffers parameter (currently 19200) and/or its max_connections parameter (curre
ntly 53).
If the request size is already small, it’s possible that it is less than
your kernel’s SHMMIN parameter, in which case raising the request size or recon
figuring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memo
ry configuration.
…fail!

위의 예와 같은 오류는 커널 리소스 설정을 조정하여 해결할 수 있습니다. 자원 설정을 결정하기위한 권장 설정 및 방법은 여기에 자세히 설명되어 있습니다.

http://www.postgresql.org/docs/9.1/static/kernel-resources.html

그러나 postgres 프로세스와 관련된 리소스 부족 상황이 발생하지 않는 한 이러한 설정을 실제로 터치 할 필요는 없습니다. 이러한 상황은 공유 환경이나 리소스가 거의 할당되지 않은 서버에서 가장 자주 발생합니다.

아무도 처음부터 실제로 설정하는 방법을 설명 할 수 있습니까?

Postgres 조정과 관련하여 다음을 읽어야합니다.

http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server


1
"참고 :이 설정에주의하십시오. 환경의 서버에서 해당 설정을 가져 왔을 때 해당 예의 설정을 사용하고 싶지 않을 것입니다." 내 환경에 맞게 어떻게 계산해야합니까?
jpic

1
jpic 님, 저는 커널 설정에 대한 자세한 내용을 제공하기 위해 업데이트했습니다.
Jason Huntley

2

오!! postgresql 서버의 옵티머스 mem 구성을 계산하는 훌륭한 도구를 찾으십시오.

http://pgtune.leopard.in.ua/


이 도구는 옵티머스 구성을 계산하는 것이 아니라 주로 하드웨어 설정에 따라 답변을 제공하므로 서버를 튜닝 할 수있는 시작점을 제공합니다. 구성 매개 변수를 조정하려면 데이터베이스 크기, 쿼리 수 및 크기도 중요합니다.
EAmez

1

이러한 커널 구성은 프로세스에 따라 다르지 않고 전역 적이므로에서 설정하는 것이 sysctl.conf좋습니다.


문제는 커널 공유 메모리 관리 매개 변수, "어떻게"가 아닌 "어떻게"에 대한 값을 결정하는 것입니다. 귀하의 노력에 감사드립니다.
jpic

네. 사소한 곳이 있습니다. 그것의 고기는 어떻습니까.
Henley Chiu

0

글쎄, 그것은 서버에서 실행중인 다른 것에 달려 있습니다. 순수한 PostgreSQL 서버라면 PostgreSQL이 이러한 설정을 찾기에 적합한 곳입니다.
특정 메모리가 필요한 다른 응용 프로그램 / 서비스를 실행하는 경우 이러한 다른 응용 프로그램간에 최적의 설정을 찾아야합니다.

데이터베이스에서 성능이 향상되고 다른 응용 프로그램의 성능이 손실되지 않으면 걱정하지 않아도됩니다.

일반적으로 데이터베이스는 메모리 설정에 가장 민감합니다. 응용 프로그램 성능의 병목 현상 일 가능성이 높기 때문에 DB에 맞게 시스템을 최적화하는 것이 좋습니다.


"이러한 응용 프로그램간에 최적의 설정을 찾는 방법"은 무엇입니까? 성능 문제가 없습니다. 공유 메모리 커널 설정을 구성하는 정식 방법을 찾고 있습니다. 실제 전문가는 어떻게해야합니까? 누군가가 소수의 서비스로 실행중인 서버를 처리하고 메모리 관리 설정 만 설정하도록 비용을 지불한다고 가정하면 어떻게 하시겠습니까?
jpic

황금률은 없으며 공급 업체의 말을보고 테스트하면됩니다. 동일한 머신에서 여러 애플리케이션을 실행중인 경우 가장 많은 메모리를 사용하는 애플리케이션, 대부분의 경우 DB를 최적화하십시오. 그러나 테스트를 통해 공급 업체 제안을 검토하는 것 외에는 단일 솔루션이 없습니다.
Sibster

나는 황금률이 ​​없다는 것을 안다. 나는 현상금이 실제로 이것을 완전히 이해하는 사람에게 동기를 부여하여 약간의 방향을 쓸 수 있기를 바랐습니다. 그러나 아무도 간단한 설명을 할 수 없기 때문에 아무도 이것을 완전히 이해하지 못한다고 생각합니다.
jpic April
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.