PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

C#, Entity Framework Core &PostgreSql :wstawienie pojedynczego wiersza zajmuje ponad 20 sekund

Po wielu testach w końcu odkryłem, że problem w ogóle nie dotyczył frameworka Entity ani NpgSql, ale opóźnienie, które widziałem, było spowodowane buforowaniem zapisu. Zawsze pisałem plik 30 MB przed wstawieniem wiersza do tabeli 1 i wierzyłem, że zapisywanie pliku zostało wykonane po zwróceniu File.WriteAllBytes, więc nie wpłynie to na żadne przyszłe instrukcje dotyczące czasu. Jednak w warstwie systemu operacyjnego do czasu uruchomienia instrukcji INSERT tak naprawdę nie zapisano na dysk, co spowodowało sztuczne opóźnienie instrukcji INSERT.

Udowodniłem to następującym kodem:

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

Thread.Sleep(1000);

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

stoper 1 pokazał, że File.WriteAllBytes zawsze zajmował około 500 ms, a stoper 2 mierzył czas około 20 do 30 sekund.

Jeśli zmienię MethodThatInsertsIntoTable1 na wstawienie do innej tabeli, to i tak zajmie to od 20 do 30 sekund, niezależnie od tabeli.

Jeśli zwiększę Thread.Sleep(1000) do Thread.Sleep(30000), stoper 2 zarejestruje, że wstawienie zajmuje mniej niż 10 milisekund.

Pokazuje to, że nawet po tym, jak File.WriteAllBytes zwróci kontrolę do programu, tak naprawdę nie zapisano pliku na dysku.

Środowisko, na którym działałem, to Linux na Raspberry Pi. Test prędkości zapisu potwierdza, że ​​moja prędkość zapisu na kartę SD wynosi nieco ponad 1 MB/s, co zgadzałoby się z wynikami, które widzę, 20-30 sekund na zapisanie pliku 30 MB, nie można tego zrobić w ciągu 500 ms ten stoper 1 tak mówi.

Inny użytkownik wydaje się mieć problem z tego powodu w File.WriteAllBytes robi nie blokuj

Po dodaniu zewnętrznego dysku twardego SSD USB do raspberry pi i zmianie, aby zapisać tam plik, zapisanie pliku zajmuje tylko 0,5 sekundy, a problem znika.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić ustawienia regionalne podczas formatowania liczb w PostgreSQL?

  2. Jaki byłby właściwy sposób testowania metod tworzenia łańcuchów QueryBuilder TypeORM?

  3. Formularz wyszukiwania nie kieruje do właściwego kontrolera w Rails 5.1

  4. TypeORM nie obsługuje ustawienia bazy danych w dekoratorze encji

  5. Czy istnieje PHP mysql_real_escape_string dla postgresql?