DISCO IO do Postgres muito alto. O que posso fazer para reduzi-lo imediatamente?

13

Estou ciente de que discos mais rápidos do que o que estou usando ajudarão, mas isso levará mais tempo para ser colocado e estou tentando usar algumas medidas de emergência para diminuir a E / S do disco. no topo está relatando o uso do DSK no vermelho quase constantemente. Isto é para o postgres 8.3.

Minha configuração shared_buffers é de 24 MB, embora o servidor tenha 16 GB de RAM que não são totalmente utilizados. Meu primeiro pensamento foi fornecer ao banco de dados o máximo de RAM possível, mas não sei como fazer isso (este é um servidor de banco de dados dedicado).

Qualquer solução que não exija reinicialização é preferível, mas aceitarei o que posso obter neste momento.

Obrigado!

Harel
fonte
Esta pergunta deve ser feita em Serverfault
Francisco R
Você pode tentar aumentar o shared_buffersarquivo de configuração postgresql.conf. Essa alteração requer reinicialização. Além disso, pode ser necessário aumentar o valor de /proc/sys/kernel/shmmaxantes disso.
Khaled

Respostas:

12

A configuração shared_buffers de 24 MB é o padrão conservador, eu diria que precisa ser muito maior para um banco de dados dedicado com 16 GB de RAM disponível. Mas sim, você precisará reiniciar o servidor para redimensioná-lo. http://wiki.postgresql.org/wiki/Performance_Optimization é um bom lugar para começar com as diretrizes de configuração de desempenho. Definir os buffers compartilhados para 4 GB ou 6 GB parece mais razoável.

Observe que no linux você precisa ajustar a configuração kernel.shmmax sysctl (em /etc/sysctl.conf ou apenas escrevendo / proc / sys / kernel / shmmax) para alocar um bloco dessa quantidade de memória compartilhada. Caso contrário, você receberá um erro especificando quanto foi solicitado, você deve definir o kernel.shmmax mais alto que isso.

Como você tem muita memória, considere também configurar o work_mem padrão mais alto, o que fará com que tipos como hashes e hashes (grupo / ordem / distinto etc) tendam a funcionar na memória em vez de usar arquivos temporários. Você não precisa reiniciar o servidor para fazer isso, basta atualizar o arquivo de configuração, recarregar o serviço e novas sessões obterão a nova configuração. A memória de trabalho padrão para uma sessão é de 1 MB. Você pode calcular o máximo que pode ser usado ao mesmo tempo work_mem * max_client_connectionse estimar o impacto que isso terá.

Você também deve aumentar o effective_cache_size para indicar ao planejador que é provável que a camada FS do kernel esteja armazenando muitas páginas na memória fora dos buffers compartilhados do postgresql.

etc. etc. espero que você tenha um bom começo.

araqnid
fonte
Boa postagem, apenas sua estimativa de uso de memória é um pouco perigosa. work_mem é o máximo por operação de classificação / hash, portanto, consultas complexas podem ter várias operações de classificação / hash e, portanto, podem usar muito mais que um work_mem.
Eelke
Obrigado, ajudou muito! Outra mudança significativa foi checkpoint_segment e checkpoint_completion_target, que tiveram um grande impacto no uso do disco e no desempenho geral. Crise evitada. ( wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server )
Harel
3

Remonte os discos com noatime

jamespo
fonte
2

Além das sugestões fornecidas aqui, você também pode querer examinar suas configurações de vacum automático. Por padrão, ele será acionado após cerca de 50 atualizações e, se o seu banco de dados estiver fazendo muitas atualizações / inserções, isso poderá desencadear uma quantidade desnecessária de instruções de vácuo que gerarão muitas IO.

jishi
fonte
1

Em um sistema que está muito próximo da taxa de transferência máxima de E / S durante a operação normal, convém aumentar o checkpoint_completion_target para reduzir a carga de E / S dos pontos de verificação . A desvantagem disso é que o prolongamento dos pontos de verificação afeta o tempo de recuperação, porque mais segmentos WAL precisarão ser mantidos por perto para possível uso na recuperação

Veja mais aqui .

cristão
fonte
0

Se o diskio do postgresql for muito alto, verifique as instruções em execução, especialmente as instruções, fazendo uma "classificação no disco" e defina os índices adequados.

Basta procurar no Google por "Postgresql Performance Tuning", você encontrará dicas suficientes por onde começar.

Thomas Berger
fonte