IPC:ProcArrayGroupUpdate
O evento IPC:ProcArrayGroupUpdate ocorre quando uma sessão está aguardando o líder do grupo atualizar o status da transação ao final dessa operação. Embora o PostgreSQL geralmente associe eventos de espera do tipo IPC a operações de consulta paralela, esse evento de espera determinado não é específico de consultas paralelas.
Versões compatíveis do mecanismo
As informações sobre esse evento de espera são aceitas em todas as versões do Aurora PostgreSQL.
Contexto
Noções básicas sobre a matriz do processo: a matriz do processo (proc) é uma estrutura de memória compartilhada no PostgreSQL. Ela contém informações sobre todos os processos em execução, incluindo detalhes da transação. Durante a conclusão da transação (COMMIT ou ROLLBACK), o ProcArray precisa ser atualizado para refletir a alteração e limpar o ID da transação da matriz. A sessão que tenta concluir sua transação deve adquirir um bloqueio exclusivo no ProcArray. Isso impede que outros processos tenham bloqueios compartilhados ou exclusivos.
Mecanismo de atualização de grupo: ao executar um COMMIT ou ROLLBACK, se um processo de backend não conseguir recuperar um ProcArrayLock no modo exclusivo, ele atualizará um campo especial chamado ProcArrayGroupMember. Isso adiciona a transação à lista de sessões que pretendem terminar. Esse processo de backend então é suspenso, e o tempo de suspensão é instrumentado como o evento de espera ProcArrayGroupUpdate. O primeiro processo no ProcArray com o procArrayGroupMember, conhecido como processo líder, adquire o ProcArrayLock no modo exclusivo. Depois, ele limpa a lista de processos que aguardam a limpeza do transactionID do grupo. Quando isso é concluído, o líder libera o ProcArrayLock e, depois, ativa todos os processos dessa lista, notificando-os de que a transação foi concluída.
Possíveis causas do maior número de esperas
Quanto mais processos estiverem em execução, mais tempo um líder manterá um procArrayLock no modo exclusivo. Consequentemente, quanto mais transações de gravação ocorrerem, maior a chance de entrarem em um cenário de atualização em grupo, causando um possível acúmulo de processos aguardando o evento de espera ProcArrayGroupUpdate. Na visualização Top SQL do Database Insights, você verá que COMMIT é a declaração com a maior parte desse evento de espera. Isso é esperado, mas exigirá uma investigação mais profunda do SQL de gravação específico que está sendo executado para determinar qual ação apropriada realizar.
Ações
Recomenda-se ações distintas, dependendo dos motivos do evento de espera. Identifique eventos IPC:ProcArrayGroupUpdate utilizando o Insights de Performance do Amazon RDS ou consultando a visualização pg_stat_activity do sistema PostgreSQL.
Tópicos
Monitorar operações de confirmação e reversão de transações
Monitorar confirmações e reversões: um número maior de confirmações e reversões pode aumentar a pressão sobre o ProcArray. Por exemplo, se uma instrução SQL começar a falhar devido ao aumento das violações de chaves duplicadas, você poderá observar um aumento nas reversões, o que pode aumentar a contenção do ProcArray e o inchaço da tabela.
O Amazon RDS Database Insights fornece as métricas xact_commit e xact_rollback do PostgreSQL e relata o número de confirmações e reversões por segundo.
Reduzir a simultaneidade
Transações em lote: sempre que possível, agrupe operações em transações únicas para reduzir as operações de confirmação/reversão.
Limitar a simultaneidade: reduza o número de transações ativas simultaneamente para aliviar a contenção de bloqueios no ProcArray. Embora isso exija alguns testes, reduzir o número total de conexões simultâneas pode reduzir a contenção e manter o throughput.
Implementar o agrupamento de conexões
Soluções de agrupamento de conexões: use o grupo de conexões para gerenciar conexões de banco de dados com eficiência, reduzindo o número total de backends e, portanto, a workload no ProcArray. Embora isso exija alguns testes, reduzir o número total de conexões simultâneas pode reduzir a contenção e manter o throughput.
Para acessar mais informações, consulte Connection pooling for Aurora PostgreSQL.
Reduzir os surtos de conexão: da mesma forma, um padrão de criação e encerramento frequentes de conexões causa pressão adicional no ProcArray. Ao reduzir esse padrão, a contenção geral é reduzida.