Alcuni dati: Abbiamo sviluppato il servizio wcf che funge da livello tra i client e il database. È selfhosted e funziona come un servizio Windows..NET Garbagecollector trouble. Blocchi per 15-40 minuti
Il servizio mantiene diverse cache, di cui le più grandi sono circa da 1 GB in memoria. L'utilizzo totale della memoria è in genere di circa 5-8 GB. Le connessioni sono duplex e utilizzano il protocollo tcp e la serializzazione viene effettuata con protobuf-net. Il numero di client connessi di solito varia da 1000 a 1500. Il server è un xeon 8-core di un modello nuovo con 64 GB di memoria e non esegue nient'altro che il servizio.
Il problema: dopo x quantità di tempo, è passato da un giorno a una settimana il servizio diventa estremamente lento. Le richieste che richiedono 0,5 secondi possono richiedere più di un minuto. Questo comportamento va avanti per 15-40 minuti o fino al riavvio del servizio.
Cosa abbiamo fatto: Abbiamo controllato la rete e la connessione di rete al server e non ci sono problemi. L'utilizzo della CPU aumenta leggermente durante questo periodo da f.eks. Media del 30% al 40-50% Abbiamo preso i dump della memoria e non ci sono blocchi logici nel codice che blocca gli utenti e non molta attività. Il nostro ultimo vantaggio è il Garbage collector. In perfmon possiamo vedere che "% time in gc" è costantemente superiore al 90% (90-97%) e il conteggio delle raccolte aumenta. Sia GC0 che GC1. Sospettiamo che sia in esecuzione anche un GC2 di blocco, ma abbiamo dovuto riavviare il servizio poiché questo è in produzione, quindi non ha eseguito il conteggio durante la finestra 5min che abbiamo eseguito perfmon. L'utilizzo della memoria era di 7,6 Gb. Nota: le chiamate in sospeso aumentano, pertanto le chiamate arrivano ma il servizio non le gestisce.
Le mie domande sono, il garbage collector può entrare in uno stato in cui gira e blocca costantemente per oltre 15 minuti? o il problema è probabilmente legato ad un altro problema?
Il nostro servizio ha eseguito GC in modalità workstation e latencymode: Interactive Ora lo abbiamo modificato su Server e SustainedLowLatency e spero che questo sia di aiuto. C'è qualcos'altro che possiamo fare se è il netturbino?
Modifica: l'utilizzo della memoria di grandi dimensioni è in corso di progettazione, i dati nella cache sono così grandi e c'è molta più memoria disponibile.
Suggerisci di scoprire la causa principale dell'elevato utilizzo della memoria ... ad es. prova ad aggiungere il blocco "using" per liberare memoria una volta finito usando quell'oggetto – User2012384
Solo per curiosità, quanti thread hai? Controlla il Task Manager. Almeno alcuni anni fa c'era il problema che più thread avevi (anche inattivo), più lentamente GC – xanatos
"Il garbage collector può entrare in uno stato in cui viene eseguito e blocca costantemente per oltre 15 minuti"? Assolutamente, se ha costantemente bisogno di liberare memoria ma non è in grado di farlo, perché continui a tenerti stretto. Come ha detto Raymond Chen, "una cache con una cattiva politica è un altro nome per una perdita di memoria". –