PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

C#, Entity Framework Core e PostgreSql:l'inserimento di una singola riga richiede più di 20 secondi

Dopo molti test alla fine ho scoperto che il problema non era affatto nel framework Entity o NpgSql, ma il ritardo che stavo vedendo era causato dalla memorizzazione nella cache di scrittura. Scrivevo sempre un file da 30 MB prima di inserire una riga nella tabella 1 e credevo che la scrittura del file fosse stata eseguita dopo la restituzione di File.WriteAllBytes, quindi non avrebbe avuto alcun impatto su eventuali istruzioni di temporizzazione future. Tuttavia, a livello del sistema operativo, la scrittura su disco non è stata completata quando è stata eseguita l'istruzione insert, causando un ritardo artificiale dell'istruzione insert.

L'ho dimostrato con il seguente codice:

Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();

Thread.Sleep(1000);

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

il cronometro 1 ha mostrato che File.WriteAllBytes impiegava sempre circa 500 ms, quindi il cronometro 2 ha impiegato dai 20 ai 30 secondi circa.

Se cambio MethodThatInsertsIntoTable1 per inserirlo in una tabella diversa, ci vogliono ancora dai 20 ai 30 secondi indipendentemente dalla tabella.

Se aumento Thread.Sleep(1000) a Thread.Sleep(30000), il cronometro 2 registra che l'inserimento impiega meno di 10 millisecondi.

Questo mostra che anche dopo che File.WriteAllBytes ha restituito il controllo al programma, la scrittura del file sul disco non è stata completata.

L'ambiente su cui stavo correndo era Linux su un raspberry pi. Un test della velocità di scrittura conferma che la mia velocità di scrittura sulla scheda SD è di poco superiore a 1 MB/s, il che si allineerebbe con i risultati che sto vedendo, 20-30 secondi per scrivere un file da 30 MB, non è possibile farlo in 500 ms quel cronometro 1 dice che era.

Un altro utente sembra riscontrare un problema a causa di ciò in File.WriteAllBytes fa non bloccare

Dopo aver aggiunto un HDD USB SSD esterno al raspberry pi e aver cambiato per salvare il file lì, il salvataggio del file richiede solo 0,5 secondi e il problema scompare.