sql >> Database >  >> RDS >> PostgreSQL

C#, Entity Framework Core &PostgreSql:het invoegen van een enkele rij duurt 20+ seconden

Na veel testen ontdekte ik uiteindelijk dat het probleem helemaal niet in het Entity-framework of NpgSql zat, maar de vertraging die ik zag werd veroorzaakt door schrijfcaching. Ik was altijd een bestand van 30 MB aan het schrijven voordat ik een rij in tabel 1 plaatste en ik geloofde dat het schrijven van het bestand werd gedaan nadat File.WriteAllBytes was teruggekeerd, zodat het geen invloed zou hebben op toekomstige timingverklaringen. Op de OS-laag was het schrijven naar de schijf echter nog niet echt voltooid tegen de tijd dat de insert-instructie werd uitgevoerd, waardoor de insert-instructie kunstmatig werd vertraagd.

Ik bewees dit met de volgende code:

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

Thread.Sleep(1000);

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

stopwatch 1 liet zien dat File.WriteAllBytes altijd ongeveer 500 ms duurde, daarna klokte stopwatch 2 ongeveer 20 tot 30 seconden.

Als ik MethodThatInsertsIntoTable1 verander om in een andere tabel in te voegen, duurt het nog steeds 20 tot 30 seconden, ongeacht de tabel.

Als ik Thread.Sleep(1000) verhoog naar Thread.Sleep(30000), dan registreert stopwatch 2 dat het invoegen minder dan 10 milliseconden duurt.

Dit toont aan dat zelfs nadat File.WriteAllBytes de controle aan het programma teruggeeft, het nog niet echt klaar is met het schrijven van het bestand naar de schijf.

De omgeving waarop ik draaide was Linux op een Raspberry Pi. Een schrijfsnelheidstest bevestigt dat mijn schrijfsnelheid naar de SD-kaart iets meer dan 1 MB/s is, wat overeenkomt met de resultaten die ik zie, 20-30 seconden om een ​​bestand van 30 MB te schrijven, het zou onmogelijk in de 500 ms kunnen worden gedaan die stopwatch 1 zegt dat het zo was.

Een andere gebruiker lijkt hierdoor een probleem te ondervinden in File.WriteAllBytes doet niet blokkeren

Na het toevoegen van een externe SSD USB HDD aan de raspberry pi en het wijzigen om het bestand daar op te slaan, duurt het opslaan van het bestand slechts 0,5 seconden en is het probleem verdwenen.



  1. AAN maakt deel uit van syntaxis

  2. MySQL voor Visual Studio-installatie mislukt, foutcode 1603

  3. MSSQL Reguliere expressie

  4. Kopieer sqlite in Android Studio-items werkt niet