Como configurar shmall, shmmax, shmni, etc… em geral e para postgresql

8

Eu usei a documentação do PostgreSQL para definir, por exemplo, essa configuração :

>>> 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 extrato , calculado por mim:

kernel.shmall = 1079204
kernel.shmmax = 4420419584

postgresql.conf não padrão , calculado por mim:

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

Isso é apropriado? Se não (ou não necessariamente), em qual caso seria apropriado?

Nós notamos boas melhorias de desempenho com essa configuração, como você melhoraria isso?

Como calcular os parâmetros de gerenciamento de memória do kernel?

Alguém pode explicar como realmente defini-los a partir do zero?

    
por jpic 26.03.2012 / 12:21

4 respostas

10

Eu respondi isso por outra pergunta aqui:

O Git não consegue avançar com erro ' sem memória '

Não estou respondendo a todas as suas perguntas aqui, mas a pergunta em seu título:

How to set shmall, shmmax, shmni, etc … in general and for postgresql

Com algumas distribuições de kernel, existem configurações que impedem que o kernel seja alocado para um único processo:

Set Kernel Parameters
Modify the "/etc/sysctl.conf" file to include the lines appropriate to your operating system.
# 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

Se o seu processo exceder os limites, o kernel irá matar o processo apesar da memória máxima reportada estar disponível no seu sistema.

Nota: tenha cuidado com estas configurações. Você provavelmente não quer usar as configurações nesse exemplo quando eu as tirei de um servidor em nosso ambiente.

Algumas notas extras para mencionar:

To Update and test kernel settings with sysctl, use following commands:

List current settings: 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

Disable secure linux by editing the "/etc/selinux/config" file, making sure the SELINUX flag is set as follows.

SELINUX=disabled

Is this appropriate ? If not (or not necessarily), in which case would it be appropriate ?

As configurações do kernel são geralmente mais estritamente definidas em ambientes de datacenter quando os provedores de ISP não querem um único processo de cliente que monopolize todos os recursos em um servidor compartilhado.

Normalmente, você não precisa configurar os parâmetros de memória do kernel, a menos que tenha um processo que está sendo eliminado pelo kernel devido à falta de recursos.

Em alguns casos, o postgres também pode alocar mais mem para tamanhos de página específicos do que o que está disponível na memória compartilhada:

* 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!

Erros como o exemplo acima, podem ser resolvidos ajustando as configurações do recurso do kernel. As configurações e métodos recomendados, para determinar as configurações de recursos, são descritos em detalhes aqui:

link

No entanto, você realmente não precisa tocar nessas configurações, a menos que esteja encontrando situações de fome de recursos relacionadas ao processo postgres. Essas situações ocorrem, na maioria das vezes, em ambientes compartilhados ou servidores com poucos recursos alocados para eles.

Can anybody explain how to really set them from the ground up ?

Quanto ao ajuste do Postgres, você deve ler isto:

link

    
por 03.04.2012 / 20:51
2

Oh !! Eu acho uma ferramenta maravilhosa para calcular a configuração do memo otimista do nosso servidor postgresql aqui.

link

    
por 28.10.2016 / 10:41
1

Essas configurações do kernel são globais, não específicas do processo, por isso é apropriado configurá-las em sysctl.conf .

    
por 27.03.2012 / 01:00
0

Bem, depende do que mais está rodando no servidor, se este for um servidor PostgreSQL puro, então o PostgreSQL é o lugar certo para procurar por essas configurações.
Se você estiver executando outros aplicativos / serviços com necessidades específicas de memória, precisará encontrar uma configuração ideal entre esses diferentes aplicativos.

Se você estiver vendo um aumento no desempenho do banco de dados e sem perda de desempenho em outros aplicativos, não me preocupo com isso.

Geralmente, os bancos de dados são os mais sensíveis às configurações de memória, já que eles também são, provavelmente, o gargalo no desempenho dos aplicativos, faz sentido otimizar seu sistema para o banco de dados.

    
por 02.04.2012 / 11:15