No Windows 8.1, existe uma maneira de garantir que um processo não seja o primeiro a ser morto ao ficar sem memória RAM?

18

Eu escrevi um aplicativo .NET 4.5 que armazena em buffer dados de cores, infravermelho e profundidade de um Kinect v2, realiza algum processamento nele e o despeja em disco, de forma descompactada; o aplicativo .NET também inicia o ffmpeg como um subprocesso e canaliza dados de cores para que sejam codificados como H.264.

Como não estou usando um SSD, os dados do vídeo chegam mais rapidamente do que posso gravar no disco. Mas tudo bem, é aceitável descartar quadros de vídeo quando estou com pouca memória RAM. Meu único requisito é que tudo o que eu mantenho seja na maior parte contíguo em pedaços de vídeo de 8 a 10 segundos. Portanto, adicionei alguma lógica no meu aplicativo .NET 4.5 para começar a descartar os quadros de vídeo quando não tenho RAM suficiente para armazenar em buffer 8 a 10 segundos contíguos de vídeo (aproximadamente 1,5 a 2 GB).

E, para evitar o surto de página, desativei completamente os arquivos de paginação. Isso me deixa com um total de 16 GB de RAM física.

Meu problema é que, mesmo com esse mecanismo, às vezes meu aplicativo .NET ou o subprocesso ffmpeg ainda é morto quando o Windows 8.1 fica surtado com pouca memória RAM, porque obviamente meu aplicativo está usando mais memória RAM quando possui um grande estoque de dados de vídeo para gravar no disco. Existe uma maneira de dizer ao Windows que meus processos são mais importantes que outros, para que o Windows comece a matar outros processos menos importantes primeiro?

Kal
fonte
10
Eu não acho que o Windows matou processos, achei que esse era um recurso exclusivo do Linux.
Scott Chamberlain
4
@ScottChamberlain: Isso porque desligar o arquivo de paginação no Windows é muito raro. Você recebe todos os tipos de comportamento inesperado e incomum. A resposta óbvia aqui é "não desligue o arquivo de paginação; que as forças do Windows para manter os dados não utilizados na RAM para que o seu aplicativo não pode usar esse RAM"
MSalters
11
Se essa fosse uma pergunta do StackOverflow, eu poderia apontar para você CreateMemoryResourceNotificationque é muito menos invasivo.
MSalters
7
@ Kal: Se o acesso ao disco for um gargalo, use uma compactação mais forte; se a CPU for um gargalo, use uma compactação mais rápida. Se os dois tiverem um gargalo, repense todo o design e comece novamente ou obtenha um hardware melhor.
Mooing Duck
11
@FactorMystic OMG ele fez o que? Desativar o arquivo de paginação reduzirá significativamente sua RAM utilizável.
Aron

Respostas:

45

O Windows não mata processos quando toda a RAM é usada. O que realmente acontece é que os processos não conseguem alocar memória e travar.

Isso está acontecendo porque toda a sua memória física está em uso e porque o arquivo de paginação está desativado, o gerenciador de memória não tem mais a capacidade de gravar páginas que não estão sendo usadas. Isso mantém sua RAM física cheia e, quando seu processo, ou qualquer outra coisa em execução no momento, tenta alocar uma página, ela falha. Alguns aplicativos falham.

Esta apresentação da Technet explica: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

O arquivo de paginação evita que os aplicativos travem quando você utiliza toda a sua memória, agindo como um pano de fundo para o comprometimento excessivo.

A memória virtual é basicamente a base de como os sistemas operacionais modernos alocam recursos, portanto, tudo se resume a ter coisas em RAM que estão em uso e mover coisas para dentro e para fora do disco.

Na verdade, existem apenas duas respostas:

  1. Reative o arquivo de paginação e aumente a RAM do seu computador para reduzir o problema de disco.
  2. Reduza os requisitos de memória do seu aplicativo.

A conclusão é que a RAM é apenas outro nível de cache, e tudo sobre memória virtual, arquivos de paginação, arquivos mapeados na memória e tudo basicamente se resume a isso: se você estiver ficando sem memória, precisará adicionar Mais.

Dawn Benton
fonte
4
Ou use menos ....
nhgrif
11
Observe que a lista de pendências está aumentando porque os dados não podem ser gravados no disco com rapidez suficiente. Eu não acho que a ativação da memória virtual no mesmo disco pode ajudar lá ...
Alexander
3
De fato, o arquivo de paginação estará em outro lugar no disco. E como sabemos que não é um SSD, isso significa uma busca física que é a operação de disco mais lenta.
MSalters
9
Parece que você precisa de gerenciamento explícito de memória em seu aplicativo, então ...
Joe
11
@ Joe exatamente isso. O coletor de lixo tornará o gerenciamento de memória um pesadelo nesse tipo de situação. Esse tipo de situação é trivial para mim, em C ++, porque tenho um controle refinado de todo o uso de memória. Embora existam padrões de design que também funcionem bem neste caso em C #, não é tão simples quanto o que a maioria das pessoas tentaria.
Thebluefish
0

Acesse o Painel de Ferramentas do Windows e as Configurações Avançadas e desative itens desnecessários, como efeitos de janela, se ainda não o tiver, e obtenha o Sysinternals Process Explorer e / ou System Monitor para encontrar e desativar qualquer coisa estranha que esteja desperdiçando CPU ou memória.

Mais importante, use o Process Explorer e / ou o System Monitor para observar como o programa está sendo executado e ver exatamente onde e como ele falha. Qual thread fica com pouca memória e morre primeiro - o prgm principal ou a parte ffmpeg? Existe uma dll específica ou outro recurso compartilhado que aumenta inesperadamente de tamanho? Ou a execução está ocorrendo corretamente, exceto mordendo mais do que pode mastigar dados?

Descobrir com mais precisão a natureza do seu problema provavelmente o indicará na direção de uma solução. Você poderia, por exemplo, implementar sua política de queda de quadros de forma mais agressiva, otimizando melhor o critério de 8 a 10 segundos para obter uma sobrecarga geral de RAM mais baixa

Sugestões finais: talvez considere mudar para o Linux e, enquanto isso, reative o arquivo de paginação (o linux chama de espaço de troca, o que torna o IMHO mais divertido, como um encontro de troca ou algo assim!) Boa sorte.

NS-MoCompSvc
fonte