2016-05-26 101 views
5

Stiamo progettando un'applicazione enterprise che memorizza nella cache molti dati dal back-end. Agli utenti è consentito aprire un numero arbitrario di finestre di app e ciascuna carica i propri dati e li memorizza nella cache. Per gestire in qualche modo il consumo di memoria e prevenire la diminuzione generale delle prestazioni del sistema operativo, abbiamo deciso di scrivere un gestore della cache che monitorerà automaticamente il footprint della memoria dell'app e rimuoverà i dati dalla cache quando necessario.Strategia per la gestione del consumo di memoria

Quindi il problema è che abbiamo difficoltà ad identificare se è il momento di liberare memoria. Attualmente utilizziamo un approccio molto semplice: iniziamo semplicemente a buttar via la roba dalla cache quando l'utilizzo della memoria delle app supera l'80% della memoria fisica.

Esistono pratiche alternative (alternative?) Per affrontare questo tipo di problema?

risposta

3

Questo è fondamentalmente OK. Non esiste una strategia veramente buona. Se ci sono più applicazioni concorrenti questo può portare a concorsi in cache e falsi sfratti.

Se si seleziona la soglia troppo bassa si spreca spazio nella cache. Se è troppo alto, nient'altro potrebbe essere contenuto nella memoria, compresa la cache dei file, le DLL, ...

Cosa intendi per "memoria fisica disponibile"? Intendi memoria installata o memoria gratuita? In che modo un'app può utilizzare l'80% della memoria disponibile? Non sono chiaro sulla definizione che stai usando.

SQL Server utilizza memoria fino a quando il sistema operativo segnala che è a bassa memoria (credo che accada quando viene utilizzato il 95% di "qualcosa").

Certamente non si desidera utilizzare il GC per liberare memoria. Ucciderà abitualmente l'intera cache.

Forse è possibile spostare interamente il contenuto della cache su disco? In alternativa, è possibile condividere la cache tra i processi .NET avendo un processo del server cache nascosto che può essere interrogato dai processi delle app.


voglio sottolineare che se la vostra applicazione consuma il 99% di RAM installata (ad esempio) le prestazioni sarà molto male perché la cache dei file è quasi vuoto. Ciò significa che anche le DLL e il codice .NET NGEN verranno sfasati e frequentemente.

Forse una strategia migliore è presumere che 1 GB sarà necessario per memorizzare in modo appropriato il sistema operativo e i file di app. In questo modo è possibile consumare memoria finché non ci sono solo il 10% di RAM installata meno 1 GB.

+0

Per memoria fisica disponibile intendo memoria libera. So che GC non può essere completamente fidato quando si tratta di de-allocazione di oggetti tempestiva, ma finora durante i nostri test non è stato un problema. Inoltre, le finestre separate sono ospitate in un unico processo di Windows, quindi non ci si deve preoccupare di condividere la cache tra di esse. In che modo il sistema operativo segnala la memoria insufficiente? Esiste comunque la possibilità di intercettare quel segnale in .Net? –

+0

Esiste un'API per questo: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366541(v=vs.85).aspx Ma quello che Windows pensa sia "basso" potrebbe non essere quello che volere. È una soglia arbitraria .; Se dici "Consumiamo fino all'80% di memoria libera", la memoria non è più libera. Quindi questa definizione non ha senso. Stai cambiando il denominatore consumando memoria. – usr

+0

Mi dispiace, il mio male per quanto riguarda la dichiarazione di utilizzo della memoria. L'ho corretto nella domanda. –