Чи є в 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
Тоді здається, що вам потрібно чітко керувати пам'яттю у вашій програмі, то ...
Джо

1
@Joe саме це. Збирач сміття збирається зробити управління пам'яттю кошмаром у таких ситуаціях. Такий тип ситуацій для мене тривіальний для вирішення в C ++, тому що я чітко налаштований на контроль всього використання пам'яті. Хоча існують шаблони дизайну, які також добре працюватимуть для цього випадку і в C #, це не так просто, як те, що намагатиметься більшість людей.
Thebluefish

0

Перейдіть через панель інструментів Windows та додаткові налаштування та відключіть непотрібні речі, наприклад, віконні ефекти, якщо ви цього ще не зробили, і за допомогою програми Sysinternals Process Explorer та / або системного монітора знайдіть і вимкніть все, що витрачає процесор або пам'ять.

Що ще важливіше, використовуйте Провідник процесорів та / або Монітор системи, щоб спостерігати за виконанням вашої програми і точно бачити, де і як вона виходить з ладу. Який потік не вистачає пам’яті і вмирає першим - головним prgm або частиною ffmpeg? Чи є специфічний dll або інший спільний ресурс, який несподівано розміру повітряних куль? Або виконання виконується правильно, за винятком відкушування більше, ніж воно може пережовувати дані?

Точніше з'ясування природи вашої проблеми, ймовірно, вкаже вам на вирішення. Наприклад, ви можете більш агресивно реалізовувати політику скидання кадрів, оптимізуючи при цьому краще для ваших критеріїв 8-10 секунд, щоб досягти нижчих загальних витрат на оперативну пам'ять

Остаточні пропозиції: Можливо, подумайте про перехід на Linux, а тим часом знову ввімкніть файл підкачки (Linux називає його свопом простору, завдяки чому IMHO звучить веселіше, як swap-meet чи щось таке!).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.