In Windows 8.1, esiste un modo per garantire che un processo non sia il primo ad essere ucciso quando si esaurisce la RAM?


18

Ho scritto un'applicazione .NET 4.5 che memorizza in buffer dati a colori, a infrarossi e di profondità da un Kinect v2, esegue alcune elaborazioni su di esso e quindi li scarica su disco, in forma non compressa; l'applicazione .NET avvia anche ffmpeg come sottoprocesso e convoglia i dati dei colori su di esso per essere codificati come H.264.

Poiché non utilizzo un SSD, i dati video arrivano più velocemente di quanto riesca a scrivere su disco. Ma va bene, è accettabile per me scartare i frame video quando ho poca RAM. Il mio unico requisito è che qualunque cosa tenga per la maggior parte contigui pezzi di video da 8 a 10 secondi. Quindi ho aggiunto un po 'di logica nella mia applicazione .NET 4.5 per iniziare a scartare i frame video quando non ho abbastanza RAM per bufferizzare 8-10 secondi contigui di video (circa 1,5 a 2 GB).

E, per evitare il blocco della pagina, ho disabilitato completamente i file di paging. Questo mi lascia con un totale di 16 GB di RAM fisica.

Il mio problema è che anche con quel meccanismo in atto, a volte la mia applicazione .NET o il sottoprocesso di ffmpeg vengono ancora uccisi quando Windows 8.1 impazzisce per la RAM bassa, perché ovviamente la mia applicazione utilizza la maggior quantità di RAM quando ha un enorme arretrato di dati video per scrivere su disco. C'è un modo per dire a Windows che i miei processi sono più importanti di altri in modo che Windows inizierebbe a uccidere prima altri processi meno importanti?


10
Non pensavo che Windows avesse interrotto i processi, pensavo fosse una funzionalità solo per Linux.
Scott Chamberlain,

4
@ScottChamberlain: Questo perché disattivare il file di paging su Windows è molto raro. Ti dà ogni tipo di comportamento inaspettato e insolito. La risposta ovvia qui è "non disattivare il file di paging; questo costringe Windows a conservare i dati inutilizzati nella RAM in modo che la tua app non possa usare quella RAM"
MSalters

1
Se questa fosse una domanda StackOverflow, potrei indicarti CreateMemoryResourceNotificationquale è molto meno complicato.
Salterio

7
@Kal: se l'accesso al disco è un collo di bottiglia, utilizzare una compressione più forte, se la CPU è un collo di bottiglia, utilizzare una compressione più veloce. Se entrambi sono un collo di bottiglia, ripensare l'intero progetto e ricominciare o ottenere hardware migliore.
Mooing Duck,

1
@FactorMystic OMG ha fatto cosa? La disabilitazione del file di paging ridurrà significativamente la RAM utilizzabile.
Aron,

Risposte:


45

Windows non interrompe i processi quando viene utilizzata tutta la RAM. Ciò che realmente accade è che i processi non riescono a allocare memoria e crash.

Ciò accade perché tutta la memoria fisica è in uso e poiché il file di paging è disabilitato, il gestore della memoria non ha più la possibilità di scrivere pagine che non vengono utilizzate. Ciò mantiene piena la RAM fisica e quando il processo, o qualsiasi altra cosa in esecuzione al momento, tenta di allocare una pagina, non riesce. Alcune applicazioni si arrestano in modo anomalo.

Questa presentazione di Technet spiega: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Il file di paging impedisce alle applicazioni di arrestarsi in modo anomalo quando si utilizza tutta la memoria fungendo da backstop per l'impegno eccessivo.

La memoria virtuale è praticamente la base di come i moderni sistemi operativi allocano le risorse, quindi si tratta di avere cose nella RAM che sono in uso e spostare oggetti dentro e fuori dal disco.

Ci sono davvero solo due risposte:

  1. Riattiva il file di paging e aumenta la RAM sul computer per ridurre il thrashing del disco.
  2. Riduci i requisiti di memoria della tua applicazione.

La linea di fondo è che la RAM è solo un altro livello di cache e tutto ciò che riguarda memoria virtuale, file di paging, file mappati in memoria e tutto ciò che sostanzialmente si riduce a questo: se stai esaurendo la memoria, devi aggiungere Di Più.


4
Oppure usa meno ....
nhgrif

1
Si noti che il backlog si sta accumulando perché i dati non possono essere scritti su disco abbastanza velocemente. Non penso che abilitare la memoria virtuale sullo stesso disco possa essere d'aiuto ...
Alexander,

3
In effetti, il file di paging sarà da qualche altra parte sul disco. E poiché sappiamo che non è un SSD, ciò significa una ricerca fisica che è l'operazione del disco più lenta.
Salterio

9
Sembra che tu abbia bisogno di una gestione esplicita della memoria nella tua applicazione, quindi ...
Joe,

1
@Joe esattamente questo. Il garbage collector renderà la gestione della memoria un incubo in questo tipo di situazioni. Questo tipo di situazione è banale per me da affrontare in C ++ perché ho un controllo perfezionato di tutto l'utilizzo della memoria. Sebbene ci siano modelli di progettazione che funzioneranno bene anche in questo caso in C #, non è così semplice come quello che la maggior parte delle persone vorrebbe provare.
Thebluefish,

0

Passa attraverso il Pannello degli strumenti di Windows e le Impostazioni avanzate e disabilita le cose non necessarie, come gli effetti delle finestre se non l'hai già fatto, e ottieni Sysinternals Process Explorer e / o System Monitor per trovare e disattivare qualsiasi cosa estranea che sprechi CPU o memoria.

Ancora più importante, utilizzare Process Explorer e / o System Monitor per vedere mentre il programma è in esecuzione e vedere esattamente dove e come fallisce. Quale thread è a corto di memoria e muore per primo: il prgm principale o la parte ffmpeg? Esiste una specifica DLL o altra risorsa condivisa che si gonfia inaspettatamente in termini di dimensioni? O l'esecuzione procede correttamente, tranne che mordere più di quanto possa masticare nei dati?

Capire più precisamente la natura del tuo problema probabilmente ti indicherà la direzione di una soluzione. Ad esempio, potresti implementare la tua politica di drop frame in modo più aggressivo, ottimizzando al meglio il tuo criterio di blocco di 8-10 secondi per ottenere un overhead complessivo della RAM inferiore

Suggerimenti finali: forse prendi in considerazione il passaggio a Linux e, nel frattempo, riattiva il file di paging (linux lo chiama lo spazio di scambio, il che lo rende IMHO più divertente, come un incontro di scambio o qualcosa del genere!) Buona fortuna.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.