Aqui está parte do meu registro de ponto de verificação:
2014-03-26 11:51:29.341 CDT,,,18682,,532854fc.48fa,4985,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 15047 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 30 recycled; write=68.980 s, sync=1.542 s, total=70.548 s; sync files=925, longest=0.216 s, average=0.001 s",,,,,,,,,""
2014-03-26 11:56:05.430 CDT,,,18682,,532854fc.48fa,4987,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 16774 buffers (1.6%); 0 transaction log file(s) added, 0 removed, 31 recycled; write=72.542 s, sync=17.164 s, total=89.733 s; sync files=885, longest=3.812 s, average=0.019 s",,,,,,,,,""
2014-03-26 12:01:21.650 CDT,,,18682,,532854fc.48fa,4989,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 14436 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 33 recycled; write=122.350 s, sync=5.212 s, total=127.676 s; sync files=924, longest=3.740 s, average=0.005 s",,,,,,,,,""
2014-03-26 12:06:25.028 CDT,,,18682,,532854fc.48fa,4991,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 13277 buffers (1.3%); 0 transaction log file(s) added, 0 removed, 29 recycled; write=126.217 s, sync=5.733 s, total=131.991 s; sync files=894, longest=1.859 s, average=0.006 s",,,,,,,,,""
2014-03-26 12:10:41.958 CDT,,,18682,,532854fc.48fa,4993,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 20765 buffers (2.0%); 0 transaction log file(s) added, 0 removed, 28 recycled; write=88.015 s, sync=10.818 s, total=98.872 s; sync files=881, longest=2.690 s, average=0.012 s",,,,,,,,,""
Percebi que às vezes nosso banco de dados é muito lento - você pode ver um número muito grande de consultas normalmente curtas travadas por muito mais tempo do que agora. Acontece regularmente sem um culpado claro.
Pergunta: O ponto de verificação pode causar isso? O que acontece na fase de "sincronização" do ponto de verificação?
Durante sua operação, o PostgreSQL registra as alterações nos arquivos de log de transações, mas não as transfere imediatamente para as tabelas reais do banco de dados. Normalmente, ele apenas mantém as alterações na memória e as retorna da memória quando são solicitadas, a menos que a RAM comece a ficar cheia e precise escrevê-las.
Isso significa que, se ele travar, as tabelas no disco não estarão atualizadas. Ele precisa reproduzir os logs de transação, aplicando as alterações nas tabelas em disco, antes de iniciar o backup. Isso pode demorar um pouco para um banco de dados grande e ocupado.
Por isso, e para que os logs de transações não continuem crescendo para sempre, o PostgreSQL faz periodicamente um checkpoint onde garante que o BD está limpo. Ele libera todas as alterações pendentes no disco e recicla os logs de transação que estavam sendo usados para manter um registro de recuperação de falhas das alterações.
Essa descarga acontece em duas fases:
write()
s de sujeirashared_buffers
para as tabelas; efsync()
dos arquivos afetados para garantir que as alterações realmente atinjam o discoAmbos podem aumentar a carga de E/S do disco. A contenção causada por essas gravações pode desacelerar as leituras e também pode desacelerar a liberação de segmentos WAL necessários para confirmar as transações.
Tem sido um desafio de longa data, mas está piorando à medida que vemos sistemas com mais e mais RAM para que possam armazenar mais dados em buffer e levar mais tempo para escrevê-los. Há uma discussão entre as comunidades Linux e PostgreSQL sobre como lidar com isso no momento, conforme discutido neste artigo do LWN.net . (LWN.net não será capaz de continuar escrevendo este tipo de grande trabalho se as pessoas não se inscreverem. Sou um assinante e compartilho este link porque é útil e informativo. Por favor, considere se inscrever se quiser ver mais deste tipo de coisa.)
A principal coisa que você pode fazer para reduzir o impacto dos pontos de verificação no momento é espalhar a atividade do ponto de verificação aumentando
checkpoint_completion_target
para que mais dados tenham sido gravados quando o ponto de verificação final chegar. No entanto, isso tem um custo - se você atualizar uma página (digamos) dez vezes, ela pode ser gravada no disco várias vezes antes do ponto de verificação com uma meta de conclusão alta, mesmo que tenha estritamente que ser gravada uma vez para segurança contra falhas. Um objetivo de conclusão mais alto cria padrões de I/O mais suaves, mas mais sobrecarga geral de I/O.A outra coisa que você pode fazer para ajudar é dizer ao seu sistema operacional para começar imediatamente a gravar dados quando receber gravações em buffer. Isso é como o lado do kernel da configuração
checkpoint_completion_target
e tem uma compensação semelhante. Consulte a documentação do linux vm , em particulardirty_background_bytes
,dirty_background_ratio
,dirty_expire_centisecs
.A descarga dos buffers sujos do sistema de arquivos do sistema operacional causada por excesso
dirty_bytes
oudirty_ratio
é uma operação de bloqueio de primeiro plano!Os ajustes do kernel
dirty_bytes
,dirty_background_bytes
,dirty_ratio
e controlamdirty_background_ratio
adirty_centisecs
liberação de buffers sujos do sistema de arquivos do sistema operacional para o disco.dirty_bytes
é o limite em bytes,dirty_ratio
é o limite como uma proporção da memória total.dirty_background_bytes
edirty_background_ratio
são limites semelhantes, mas a liberação ocorre em segundo plano e não bloqueia outras operações de leitura/gravação até que seja concluída.dirty_centisecs
é quantos centissegundos podem passar antes que uma descarga seja iniciada.Recentemente, os padrões para esses ajustáveis foram reduzidos no Linux, pois o tamanho da memória para máquinas modernas aumentou drasticamente. Mesmo proporções de 5 e 10% para
dirty_background_ratio
edirty_ratio
em uma máquina de 256 GB podem inundar um sistema de E/S.Ajustar
dirty_background_bytes
oudirty_background_ratio
começar a liberar buffers sujos em segundo plano é complicado. Felizmente, você pode ajustar essas configurações sem precisar parar o PostgreSQL ou o host, repetindo novos valores para os arquivos apropriados:por exemplo, para definir o número de bytes sujos para acionar uma descarga de fundo. Se você estiver usando uma placa RAID com bateria, capacitor ou memória flash (você quer manter seus dados em caso de falha, não é?) comece ajustando
dirty_background_bytes
para 1/2 do tamanho do buffer do cache de gravação edirty_bytes
para 3/4 desse tamanho. Monitore seu perfil de E/S com iostats e, se ainda estiver vendo problemas de latência, isso significa que a carga de gravação do banco de dados ainda está sobrecarregando as liberações do cache do buffer de arquivo. Reduza os valores até que a latência melhore ou considere atualizar seu subsistema de E/S. Placas FusionIO e SSDs são duas possibilidades para taxa de transferência de E/S extrema.Boa sorte!