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

C#, Entity Framework Core e PostgreSql:inserir uma única linha leva mais de 20 segundos


Depois de muitos testes, acabei descobrindo que o problema não estava no Entity framework ou no NpgSql, mas o atraso que eu estava vendo era causado pelo cache de gravação. Eu estava sempre escrevendo um arquivo de 30 MB antes de inserir uma linha na tabela 1 e acreditava que a gravação do arquivo era feita após o retorno de File.WriteAllBytes, de modo que não afetaria nenhuma instrução de tempo futura. No entanto, na camada do sistema operacional, não foi realmente concluída a gravação no disco no momento em que a instrução insert foi executada, fazendo com que a instrução insert fosse artificialmente atrasada.

Eu provei isso com o seguinte código:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();

Thread.Sleep(1000);

Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();

o cronômetro 1 mostrou que File.WriteAllBytes sempre levava cerca de 500ms, então o cronômetro 2 cronometrava cerca de 20 a 30 segundos.

Se eu alterar MethodThatInsertsIntoTable1 para inserir em uma tabela diferente, ainda levará de 20 a 30 segundos, independentemente da tabela.

Se eu aumentar Thread.Sleep(1000) para Thread.Sleep(30000), o cronômetro 2 registra que a inserção leva menos de 10 milissegundos.

Isso mostra que mesmo depois que File.WriteAllBytes retorna o controle ao programa, não é realmente feito a gravação do arquivo no disco.

O ambiente em que eu estava rodando era o linux em um raspberry pi. Um teste de velocidade de gravação confirma que minha velocidade de gravação no cartão SD é pouco mais de 1 MB / s, o que se alinharia com os resultados que estou vendo, 20 a 30 segundos para gravar um arquivo de 30 MB, não poderia ser feito nos 500 ms aquele cronômetro 1 diz que foi.

Outro usuário parece ter um problema devido a isso em File.WriteAllBytes faz não bloquear

Depois de adicionar um HDD USB SSD externo ao raspberry pi e alterar para salvar o arquivo lá, salvar o arquivo leva apenas 0,5 segundos e o problema desaparece.