No Windows 8.1, existe uma maneira de garantir que um processo não seja o primeiro a ser eliminado quando ficar sem RAM?

18

Eu escrevi um aplicativo .NET 4.5 que armazena em buffer dados de cor, infravermelho e profundidade de um Kinect v2, realiza algum processamento nele e, em seguida, faz o dump para o disco, em formato descompactado; o aplicativo .NET também inicia o ffmpeg como um subprocesso e canaliza os dados de cor para que ele seja codificado como H.264.

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

E, para evitar o espancamento de páginas, 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 são mortos quando o Windows 8.1 enlouquece com pouca RAM, porque obviamente meu aplicativo está usando a maior parte da RAM quando tem um enorme backlog de dados de vídeo para gravar no disco. Existe uma maneira de dizer ao Windows que meus processos são mais importantes do que outros, para que o Windows comece a matar outros processos menos importantes primeiro?

    
por Kal 18.12.2014 / 04:02

2 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 falhar.

Isso está acontecendo porque toda a sua memória física está em uso e, como o arquivo de paginação está desabilitado, o gerenciador de memória não tem mais a capacidade de escrever 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. Algumas aplicações falham.

Esta apresentação da Technet explica: link

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

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

Existem apenas duas respostas:

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

O resultado é que a RAM é apenas outro nível de cache, e todo o material sobre memória virtual, arquivos de paginação, arquivos mapeados na memória e tudo o que se resume a isso: se você está ficando sem memória, precisa adicionar mais.

    
por 18.12.2014 / 05:30
0

Vá até o Painel de ferramentas do Windows & Configurações avançadas & desative as coisas desnecessárias, como efeitos de janela, se você ainda não tiver, e obtenha o Sysinternals Process Explorer & ou o Monitor do Sistema para localizar & desligue qualquer coisa estranha que esteja desperdiçando CPU ou memória.

Mais importante ainda, use o Process Explorer e / ou o Monitor do sistema para observar como seu programa está sendo executado e ver exatamente onde & como isso falha. Qual encadeamento fica sem memória e morre primeiro - a parte principal do prgm ou do ffmpeg? Existe uma dll específica ou outro recurso compartilhado que balões inesperadamente em tamanho? Ou a execução está procedendo corretamente, exceto morder mais do que pode mastigar nos dados?

Descobrir com mais precisão a natureza do seu problema provavelmente indicará a direção de uma solução. Você poderia, por exemplo, implementar sua política de eliminação de quadros de forma mais agressiva, otimizando ao mesmo tempo seu 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 swap, o que faz parecer mais divertido, IMHO, como um swap-meet ou algo assim!) Boa sorte .

    
por 20.12.2014 / 04:56