En Windows 8.1, ¿hay alguna forma de garantizar que un proceso no sea el primero en morir cuando se quede sin RAM?

18

Escribí una aplicación .NET 4.5 que almacena datos de color, infrarrojos y profundidad de un Kinect v2, realiza un procesamiento en él y luego lo descarga en el disco, sin comprimir; la aplicación .NET también inicia ffmpeg como un subproceso y canaliza datos de color para que se codifiquen como H.264.

Como no estoy usando una SSD, los datos de video llegan más rápido de lo que puedo escribir en el disco. Pero está bien, es aceptable para mí descartar fotogramas de video cuando tengo poca RAM. Mi único requisito es que lo que sea que conserve sea en su mayoría fragmentos de video contiguos de 8 a 10 segundos. Así que agregué algo de lógica en mi aplicación .NET 4.5 para comenzar a descartar fotogramas de video cuando no tengo suficiente RAM para almacenar en búfer 8-10 segundos de video contiguos (aproximadamente 1.5 a 2 GB).

Y, para evitar la agitación de la página, he deshabilitado completamente los archivos de paginación. Esto me deja con un total de 16 GB de RAM física.

Mi problema es que, incluso con ese mecanismo, a veces mi aplicación .NET o el subproceso ffmpeg siguen sin funcionar cuando Windows 8.1 se asusta por la poca RAM, porque obviamente mi aplicación usa la mayor cantidad de RAM cuando tiene una gran cantidad de datos de video atrasados para escribir en el disco. ¿Hay alguna manera de decirle a Windows que mis procesos son más importantes que otros para que Windows comience a eliminar otros procesos menos importantes primero?

Kal
fuente
10
No pensé que Windows matara procesos, pensé que era una característica única de Linux.
Scott Chamberlain
44
@ScottChamberlain: Eso es porque desactivar el archivo de paginación en Windows es muy raro. Te da todo tipo de comportamiento inesperado e inusual. La respuesta obvia aquí es "no apague el archivo de paginación; eso obliga a Windows a mantener los datos no utilizados en la RAM para que su aplicación no pueda usar esa RAM"
MSalters
1
Si se tratara de una pregunta de StackOverflow, podría señalarle CreateMemoryResourceNotificationque es mucho menos hacky.
MSalters
77
@ Kal: si el acceso al disco es un cuello de botella, use una compresión más fuerte, si la CPU es un cuello de botella, use una compresión más rápida. Si ambos son un cuello de botella, reconsidere todo su diseño y comience de nuevo, u obtenga un mejor hardware.
Mooing Duck
1
@FactorMystic OMG hizo qué? Deshabilitar el archivo de página reducirá significativamente la RAM utilizable.
Aron

Respuestas:

45

Windows no mata los procesos cuando se usa toda la RAM. Lo que realmente sucede es que los procesos no pueden asignar memoria y fallar.

Esto sucede porque toda su memoria física está en uso y porque el archivo de paginación está deshabilitado, el administrador de memoria ya no tiene la capacidad de escribir páginas que no se están utilizando. Esto mantiene su RAM física llena y cuando su proceso, o cualquier otra cosa que se esté ejecutando en ese momento, intenta asignar una página, falla. Algunas aplicaciones se bloquean.

Esta presentación de Technet explica: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

El archivo de paginación evita que las aplicaciones se bloqueen cuando utiliza toda su memoria al actuar como un respaldo para el compromiso excesivo.

La memoria virtual es más o menos la base de cómo los sistemas operativos modernos asignan recursos, por lo que se trata de tener cosas en la RAM que están en uso y mover cosas dentro y fuera del disco.

En realidad solo hay dos respuestas:

  1. Vuelva a habilitar el archivo de paginación y aumente la RAM en su computadora para reducir la agitación del disco.
  2. Reduzca los requisitos de memoria de su aplicación.

La conclusión es que la RAM es solo otro nivel de caché, y todo lo relacionado con la memoria virtual, los archivos de paginación, los archivos mapeados de memoria, y todo eso básicamente se reduce a esto: si se está quedando sin memoria, debe agregar más.

Dawn Benton
fuente
44
O use menos ....
nhgrif
1
Tenga en cuenta que la acumulación se está acumulando porque los datos no se pueden escribir en el disco lo suficientemente rápido. No creo que habilitar la memoria virtual en el mismo disco pueda ayudar allí ...
Alexander
3
De hecho, el archivo de la página estará en otro lugar del disco. Y como sabemos que no es un SSD, eso significa una búsqueda física, que es la operación de disco más lenta.
MSalters
99
Parece que necesita una administración de memoria explícita en su aplicación, entonces ...
Joe
1
@ Joe exactamente esto. El recolector de basura hará que la administración de memoria sea una pesadilla en este tipo de situaciones. Este tipo de situación es trivial para mí en C ++ porque tengo un control preciso de todo el uso de memoria. Aunque hay patrones de diseño que también funcionarán bien para este caso en C #, no es tan simple como lo que la mayoría de la gente intentaría.
Thebluefish
0

Vaya a través del Panel de herramientas de Windows y Configuración avanzada y desactive cosas innecesarias, como efectos de ventana si aún no lo ha hecho, y obtenga Sysinternals Process Explorer y / o System Monitor para encontrar y apagar cualquier cosa extraña que esté desperdiciando CPU o memoria.

Más importante aún, use Process Explorer y / o System Monitor para ver cómo se ejecuta su programa y ver exactamente dónde y cómo falla. ¿Qué subproceso se queda sin memoria y muere primero: el prgm principal o la parte ffmpeg? ¿Existe un dll específico u otro recurso compartido que aumenta de tamaño inesperadamente? ¿O la ejecución se lleva a cabo correctamente, excepto que muerde más de lo que puede masticar datos?

Descubrir con mayor precisión la naturaleza de su problema probablemente lo guiará en la dirección de una solución. Podría, por ejemplo, implementar su política de caída de tramas de manera más agresiva, mientras optimiza mejor su criterio de fragmentación de 8-10 segundos para lograr una sobrecarga general de RAM más baja

Sugerencias finales: tal vez considere cambiar a Linux, y mientras tanto, vuelva a habilitar el archivo de paginación (Linux lo llama el espacio de intercambio, lo que lo hace sonar más divertido, en mi humilde opinión, ¡como una reunión de intercambio o algo así!) ¡Buena suerte!

NS-MoCompSvc
fuente