sql >> Base de Datos >  >> RDS >> PostgreSQL

C#, Entity Framework Core y PostgreSql:insertar una sola fila lleva más de 20 segundos

Después de muchas pruebas, finalmente descubrí que el problema no estaba en Entity Framework o NpgSql en absoluto, pero la demora que estaba viendo era causada por el almacenamiento en caché de escritura. Siempre estaba escribiendo un archivo de 30 MB antes de insertar una fila en la tabla 1 y creía que la escritura del archivo se realizó después de que File.WriteAllBytes regresara para que no afectara las futuras declaraciones de tiempo. Sin embargo, en la capa del sistema operativo, en realidad no se había terminado de escribir en el disco cuando se ejecutó la declaración de inserción, lo que provocó que la declaración de inserción se retrasara artificialmente.

Probé esto con el siguiente 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();

el cronómetro 1 mostró que File.WriteAllBytes siempre tomó alrededor de 500 ms, luego el cronómetro 2 cronometró alrededor de 20 a 30 segundos.

Si cambio MethodThatInsertsIntoTable1 para insertarlo en una tabla diferente, aún demora de 20 a 30 segundos, independientemente de la tabla.

Si aumento Thread.Sleep(1000) a Thread.Sleep(30000), el cronómetro 2 registra que la inserción tarda menos de 10 milisegundos.

Esto muestra que incluso después de que File.WriteAllBytes devuelva el control al programa, en realidad no ha terminado de escribir el archivo en el disco.

El entorno en el que estaba corriendo era linux en una raspberry pi. Una prueba de velocidad de escritura confirma que mi velocidad de escritura en la tarjeta SD es un poco más de 1 MB/s, lo que se alinearía con los resultados que estoy viendo, 20-30 segundos para escribir un archivo de 30 MB, no podría hacerlo en los 500 ms ese cronómetro 1 dice que lo fue.

Otro usuario parece experimentar un problema debido a esto en File.WriteAllBytes sí no bloquear

Después de agregar un HDD USB SSD externo a la raspberry pi y cambiar para guardar el archivo allí, guardar el archivo solo toma 0,5 segundos y el problema desaparece.