В Windows 8.1 есть ли способ гарантировать, что процесс не будет первым убитым при нехватке ОЗУ?

18

Я написал приложение .NET 4.5, которое буферизует данные о цвете, инфракрасном диапазоне и глубине с Kinect v2, выполняет некоторую обработку и затем выгружает их на диск в несжатом виде; Приложение .NET также запускает ffmpeg в качестве подпроцесса и передает ему данные о цвете для кодирования в виде H.264.

Поскольку я не использую SSD, видеоданные поступают быстрее, чем я могу записать на диск. Но это нормально, для меня приемлемо отказаться от видеокадров, когда у меня мало оперативной памяти. Мое единственное требование состоит в том, чтобы все, что я держу, было в основном непрерывным фрагментом видео продолжительностью от 8 до 10 секунд. Поэтому я добавил некоторую логику в свое приложение .NET 4.5, чтобы начать отбрасывать видеокадры, когда у меня недостаточно ОЗУ для буферизации непрерывных 8–10 секунд видео (примерно 1,5–2 ГБ).

И, чтобы предотвратить побои страниц, я полностью отключил файлы подкачки. Это оставляет мне в общей сложности 16 ГБ физической памяти.

Моя проблема в том, что даже с этим механизмом иногда мое приложение .NET или подпроцесс ffmpeg по-прежнему погибают, когда Windows 8.1 начинает волноваться из-за нехватки ОЗУ, потому что, очевидно, мое приложение использует наибольшее количество ОЗУ, когда у него огромные резервы видеоданных записать на диск. Есть ли способ сказать Windows, что мои процессы важнее других, чтобы Windows начала убивать другие менее важные процессы?

Кал
источник
10
Я не думал, что Windows убивает процессы, я думал, что это только функция Linux.
Скотт Чемберлен
4
@ScottChamberlain: это потому, что отключение файла подкачки в Windows очень редко. Это дает вам все виды неожиданного и необычного поведения. Очевидный ответ здесь - «не выключайте файл подкачки; это заставляет Windows хранить неиспользуемые данные в ОЗУ, чтобы ваше приложение не могло использовать эту ОЗУ»
MSalters
1
Если бы это был вопрос StackOverflow, я мог бы указать вам, CreateMemoryResourceNotificationчто гораздо менее хакерский.
MSalters
7
@Kal: если доступ к диску является узким местом, используйте более сильное сжатие, если ЦП является узким местом, используйте более быстрое сжатие. Если оба являются узким местом, переосмыслите весь свой дизайн и начните все сначала, или получите лучшее оборудование.
Mooing Duck
1
@FactorMystic OMG что он сделал? Отключение файла подкачки значительно сократит объем используемой оперативной памяти.
Арон

Ответы:

45

Windows не убивает процессы при использовании всей оперативной памяти. На самом деле происходит то, что процессам не удается выделить память и происходит сбой.

Это происходит из-за того, что вся ваша физическая память используется и поскольку файл подкачки отключен, диспетчер памяти больше не может писать страницы, которые не используются. Это сохраняет вашу физическую оперативную память заполненной, и когда ваш процесс или что-либо еще, запущенное в данный момент, пытается выделить страницу, происходит сбой. Некоторые приложения аварийно завершают работу.

Эта презентация от Technet объясняет: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Файл подкачки защищает приложения от сбоев, когда вы используете всю свою память, выступая в качестве поддержки для чрезмерной приверженности.

Виртуальная память - в значительной степени основа того, как современные операционные системы распределяют ресурсы, поэтому все дело в том, чтобы в оперативной памяти были занятые вещи, а также переносить данные с диска на диск.

На самом деле есть только два ответа:

  1. Повторно включите файл подкачки и увеличьте объем оперативной памяти на вашем компьютере, чтобы уменьшить перегрузку диска.
  2. Уменьшите требования к памяти вашего приложения.

Суть в том, что ОЗУ - это просто еще один уровень кеша, и все, что связано с виртуальной памятью, файлами подкачки, файлами отображения памяти и всем, что в основном сводится к следующему: если у вас заканчивается память, вам нужно добавить Больше.

Рассвет Бентон
источник
4
Или используйте меньше ....
nhgrif
1
Обратите внимание, что заделы накапливаются, потому что данные не могут быть записаны на диск достаточно быстро. Я не думаю, что включение виртуальной памяти на том же диске может помочь там ...
Александр
3
На самом деле файл подкачки будет где-то еще на диске. И поскольку мы знаем, что это не SSD, это означает физический поиск, который является самой медленной операцией на диске.
MSalters
9
Похоже, вам нужно явное управление памятью в вашем приложении ...
Joe
1
@ Точно так. Сборщик мусора собирается сделать управление памятью кошмаром в подобных ситуациях. Этот тип ситуации тривиален для меня в C ++, потому что я точно настроил контроль над использованием всей памяти. Хотя в C # и для этого случая есть шаблоны проектирования, которые будут прекрасно работать, это не так просто, как то, к чему стремилось бы большинство людей.
Thebluefish
0

Зайдите в Панель инструментов Windows и Расширенные настройки и отключите ненужные вещи, такие как эффекты окон, если вы этого еще не сделали, и получите Sysinternals Process Explorer и / или System Monitor, чтобы найти и отключить все постороннее, что тратит впустую процессор или память.

Что еще более важно, используйте Process Explorer и / или System Monitor, чтобы наблюдать за тем, как работает ваша программа, и точно знать, где и как она терпит неудачу. Какой поток не хватает памяти и умирает первым - основной prgm или часть ffmpeg? Существует ли определенный dll или другой общий ресурс, размер которого неожиданно увеличивается? Или выполнение идет правильно, за исключением того, что откусывает больше, чем может прожевать данные?

Более точное выяснение характера вашей проблемы, скорее всего, укажет вам решение. Например, вы можете более агрессивно реализовывать политику отбрасывания кадров, оптимизируя при этом более высокий критерий порции 8–10 секунд, чтобы снизить общую нагрузку на ОЗУ.

Заключительные предложения: Возможно, стоит подумать о переходе на Linux, а тем временем снова включить файл подкачки (linux называет его пространством подкачки, что делает его звучащим более увлекательным, IMHO, как своп-встреча или что-то в этом роде!) Удачи.

NS-MoCompSvc
источник