PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Escrevendo um arquivo usando vários threads

Recurso Compartilhado ==Contenção


Gravar em um arquivo normal por definição é uma operação serializada. Você não ganha desempenho ao tentar gravar nele a partir de vários threads, a E/S é um recurso limitado finito em ordens de magnitude menos largura de banda do que a CPU mais lenta ou sobrecarregada.

O acesso simultâneo a um recurso compartilhado pode ser complicado (e lento)


Se você tem vários encadeamentos que estão fazendo cálculos caros, então você tem opções, se você está apenas usando vários encadeamentos porque você acha que vai acelerar algo, você vai fazer o oposto. A contenção de E/S sempre diminui o acesso ao recurso, nunca o acelera devido às esperas de bloqueio e outras sobrecargas.

Você precisa ter uma seção crítica protegida e que permita apenas um único gravador por vez. Basta procurar o código-fonte para qualquer gravador de log que suporte a simultaneidade e você verá que há apenas um único thread que grava no arquivo.

Se o seu aplicativo for principalmente:

  1. Limite de CPU: Você pode usar algum mecanismo de bloqueio/construção de dados para permitir que apenas um thread entre muitos grave no arquivo por vez, o que será inútil do ponto de vista da simultaneidade como uma solução ingênua; Se esses threads estiverem vinculados à CPU com pouca E/S, isso pode funcionar.

  2. Limite de E/S: Este é o caso mais comum, você deve usar um sistema de transmissão de mensagens com uma fila de algum tipo e fazer com que todos os encadeamentos sejam postados em uma fila/buffer e ter um único encadeamento puxando dele e gravando no arquivo. Esta será a solução mais escalável e fácil de implementar.

Journaling - Gravações Assíncronas


Se você precisar criar um único arquivo super grande onde a ordem das gravações não é importante e o programa está vinculado à CPU, você pode usar uma técnica de registro no diário.

Tenha cada process gravar em um arquivo separado e, em seguida, concatenar os vários arquivos em um único arquivo grande no final. Esta é uma escola muito antiga baixa tecnologia solução que funciona bem e tem por décadas.

Obviamente, quanto mais E/S de armazenamento você tiver, melhor será o desempenho no final da concat.