Wpis z mikrobloga

API na .net 7, jedyne co robi to Service Worker się loguje do API co 10 sekund (JWT) i sprawdza czy są jakieś maile w DB zaznaczone do wysłania. Nie ma żadnych maili (bo to QA i DEV) więc jedynie co się dzieje to logowanie i sprawdzanie co 10 sekund.

Dlaczego Garbage Collection nie zbiera? Dlaczego to rośnie i rośnie I restartując AppPool wieczorem, dziś rano urosło do 4GB i nadal nic nie czyści?

Sprawdzałem w dotMemory - po prostu trzyma cały czas rzeczy w Heap1 i Heap2. Czy ktoś może powiedzieć dlaczego tak się dzieje? Czytam w necie że to "normalne" bo GC sam sobie wybiera i sam sobie dobrze wie kiedy czyścić. Ale wydaje się nienormalne. Memory leaków raczej nie ma.

#programowanie #programista15k #webdev #dotnet #csharp
Varin - API na .net 7, jedyne co robi to Service Worker się loguje do API co 10 sekun...

źródło: apimemory

Pobierz
  • 15
  • Odpowiedz
  • 0
@czupek: Wszystko jest w DI i scoped. Kontroler w API woła serwis, serwis jest w DI, i ma wstrzyknięty dbContext w konstruktorze, też z DI. Wszystko niby jest Scoped i tworzone per request.
  • Odpowiedz
@Varin: A czy to nie jest tak, że jak połączenie wisi jako nie zamknięte, to Scope requestu jest nie skończony ? Sprawdzałeś, np jakimś console.writeline, że kontroler przeszedł przez "za" ten request ?

Może ci brakuje jakieś usinga ?
  • Odpowiedz
@Varin: Nie wiem z jakiej bazy danych korzystasz ale może jest możliwość, że możesz podejrzeć połączonych userów albo jakieś sesje po stronie bazy.
  • Odpowiedz
@Varin: zrób heap dump i zobacz co zajmuje te 4 GB. Chyba macie tam w .net jakiś analizator heapa.

Albo wyciek pamieci albo nieprawidłowe ustawienia GC.
  • Odpowiedz
@Varin: O ile za każdym przejściem timera/petli, jakkolwiek sprawdzasz te maile nie tworzysz nowego scope'a a stary usuwasz, to w obrebie tego service workera wszystko bedzie singletonem i po prostu tworzysz caly czas nowe obiekty, nie usuwajac poprzednich. To nie jak w ASP, ze kontroler jest scopem i z automatu wszystko podisposuje
  • Odpowiedz
  • 2
@drajvver @Krolik @some_ONE @czupek

Okazało się że za każdym razem jak jest tworzony token JWT, to używa on dwóch medod z 'helpera' które mają za zadanie z Configuration dać mi Secret i Issuer. I jakiś chuop tak to zaimplementował, że za każdym razem jak się te medody woła, to ZAWSZE leci to i tworzy nowe obiekty i czyta appsettings.json...:

public static ConfigHelper GetCurrentSettings(string key)
{

var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
  • Odpowiedz
@Varin: A swoją drogą to ciekawi mnie co takiego jest w tej bazie danych, że walisz od niej co 10s ? Nie lepiej zrobić jakiś cache na minutę i niech kontrolery biją ten cache po zwrotkę co te 10s ?
  • Odpowiedz
  • 1
@czupek: Jest to swoisty email worker, mamy swoją własną kolejkę do wysyłania maili. Jest system do zarządzania firmą rekrutacyjną, jedną z funkcjonalności jest możliwość wysyłania maili, albo automatycznych przy jakichś akcjach (bookowanie kogoś do roboty w szpitalu np, czy anulacja dnia pracy - powiadomienia i detale maja iść na maila do pracownika)

Jest też opcja wysyłania masowych maili np do kilkudziesieciu, kilkuset ludzi z ofertą konkretnej roboty np.

Worker sprawdza czy
  • Odpowiedz
@Varin: ten wykres fajnie pokazuje ile pamięci marnują języki z GC. Apka potrzebuje niewiele ponad 50 MB a całość bierze ok. 400 MB z systemu.
  • Odpowiedz