Dans Windows 8.1, existe-t-il un moyen de garantir qu'un processus n'est pas le premier à être tué lorsqu'il manque de RAM?

18

J'ai écrit une application .NET 4.5 qui met en mémoire tampon les données de couleur, infrarouge et de profondeur d'un Kinect v2, effectue un traitement sur celui-ci, puis le sauvegarde sur disque, sous forme non compressée; l'application .NET démarre également ffmpeg en tant que sous-processus et lui redirige les données de couleur à encoder en H.264.

Parce que je n'utilise pas de SSD, les données vidéo arrivent plus rapidement que je ne peux écrire sur le disque. Mais ça va, il est acceptable pour moi de supprimer les images vidéo lorsque je manque de RAM. Ma seule exigence est que tout ce que je garde soit principalement des morceaux de vidéo contigus de 8 à 10 secondes. J'ai donc ajouté de la logique dans mon application .NET 4.5 pour commencer à supprimer les trames vidéo lorsque je n'ai pas assez de RAM pour mettre en mémoire tampon 8 à 10 secondes de vidéo contiguës (environ 1,5 à 2 Go).

Et, pour éviter le débordement de page, j'ai complètement désactivé les fichiers de pagination. Cela me laisse un total de 16 Go de RAM physique.

Mon problème est que même avec ce mécanisme en place, parfois mon application .NET ou le sous-processus ffmpeg sont toujours tués lorsque Windows 8.1 panique à propos de la faible RAM, car évidemment mon application utilise le plus de RAM lorsqu'elle a un énorme arriéré de données vidéo pour écrire sur le disque. Existe-t-il un moyen de dire à Windows que mes processus sont plus importants que d'autres afin que Windows commence par tuer d'autres processus moins importants?

Kal
la source
10
Je ne pensais pas que Windows tuait les processus, je pensais que c'était une fonctionnalité Linux uniquement.
Scott Chamberlain
4
@ScottChamberlain: C'est parce que la désactivation du fichier d'échange sur Windows est très rare. Cela vous donne toutes sortes de comportements inattendus et inhabituels. La réponse évidente ici est "ne désactivez pas le fichier d'échange; cela oblige Windows à conserver les données inutilisées dans la RAM afin que votre application ne puisse pas utiliser cette RAM"
MSalters
1
S'il s'agissait d'une question StackOverflow, je pourrais vous indiquer CreateMemoryResourceNotificationlaquelle est beaucoup moins hacky.
MSalters
7
@Kal: Si l'accès au disque est un goulot d'étranglement, utilisez une compression plus forte, si le CPU est un goulot d'étranglement, utilisez une compression plus rapide. Si les deux sont un goulot d'étranglement, repensez l'ensemble de votre conception et recommencez, ou obtenez un meilleur matériel.
Mooing Duck
1
@FactorMystic OMG il a fait quoi? La désactivation du fichier d'échange va réduire considérablement votre RAM utilisable.
Aron

Réponses:

45

Windows ne tue pas les processus lorsque toute la RAM est utilisée. En réalité, les processus ne parviennent pas à allouer de la mémoire et se bloquent.

Cela se produit car toute votre mémoire physique est en cours d'utilisation et parce que le fichier d'échange est désactivé, le gestionnaire de mémoire n'a plus la possibilité d'écrire des pages qui ne sont pas utilisées. Cela garde votre RAM physique pleine et lorsque votre processus, ou toute autre chose en cours d'exécution à ce moment-là, essaie d'allouer une page, il échoue. Certaines applications se bloquent.

Cette présentation de Technet explique: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Le fichier d'échange empêche les applications de se bloquer lorsque vous utilisez toute votre mémoire en agissant comme un filet de sécurité pour le sur-engagement.

La mémoire virtuelle est à peu près le fondement de la façon dont les systèmes d'exploitation modernes allouent les ressources, il s'agit donc d'avoir des éléments dans la RAM qui sont en cours d'utilisation et de déplacer des éléments vers et depuis le disque.

Il n'y a vraiment que deux réponses:

  1. Réactivez le fichier d'échange et augmentez la RAM de votre ordinateur pour réduire la saturation du disque.
  2. Réduisez les besoins en mémoire de votre application.

L'essentiel est que la RAM n'est qu'un autre niveau de cache, et tout ce qui concerne la mémoire virtuelle, les fichiers d'échange, les fichiers mappés en mémoire, et tout cela se résume à ceci: si vous manquez de mémoire, vous devez ajouter plus.

Dawn Benton
la source
4
Ou utilisez moins ....
nhgrif
1
Veuillez noter que le backlog s'accumule car les données ne peuvent pas être écrites sur le disque assez rapidement. Je ne pense pas que l'activation de la mémoire virtuelle sur le même disque puisse y aider ...
Alexander
3
En fait, le fichier d'échange se trouvera ailleurs sur le disque. Et comme nous savons que ce n'est pas un SSD, cela signifie une recherche physique qui est l'opération de disque la plus lente.
MSalters
9
On dirait que vous avez besoin d'une gestion de mémoire explicite dans votre application alors ...
Joe
1
@Joe exactement cela. Le garbage collector va faire de la gestion de la mémoire un cauchemar dans ce type de situations. Ce type de situation est trivial pour moi à gérer en C ++ car j'ai un contrôle affiné de toute l'utilisation de la mémoire. Bien qu'il existe également des modèles de conception qui fonctionneront très bien dans ce cas en C #, ce n'est pas aussi simple que ce que la plupart des gens essaient de faire.
Thebluefish
0

Allez dans le panneau d'outils Windows et les paramètres avancés et désactivez les choses inutiles, comme les effets de fenêtre si vous ne l'avez pas déjà fait, et demandez à Sysinternals Process Explorer et / ou System Monitor de trouver et de désactiver tout ce qui est inutile qui gaspille le processeur ou la mémoire.

Plus important encore, utilisez Process Explorer et / ou System Monitor pour observer l'exécution de votre programme et voir exactement où et comment il échoue. Quel thread manque de mémoire et meurt en premier - le prgm principal ou la partie ffmpeg? Existe-t-il une DLL spécifique ou une autre ressource partagée dont la taille augmente de façon inattendue? Ou l'exécution se déroule-t-elle correctement, sauf en mordant plus qu'elle ne peut mâcher les données?

Déterminer plus précisément la nature de votre problème vous orientera probablement vers une solution. Vous pouvez, par exemple, mettre en œuvre votre politique de suppression de trame de manière plus agressive, tout en optimisant mieux votre critère de bloc de 8 à 10 secondes pour réduire la surcharge globale de RAM

Suggestions finales: envisagez peut-être de passer à Linux, et en attendant, réactivez le fichier d'échange (Linux l'appelle l'espace de swap, ce qui le rend plus amusant à mon humble avis, comme un swap-meet ou quelque chose!) Bonne chance.

NS-MoCompSvc
la source