313

О неочевидных особенностях использования видеопамяти в Windows

Краткое содержание поста: при отсутствии файла подкачки максимальный объём использующейся видеопамяти ограничивается "свободной" (не зарезервированной) оперативной памятью, размер которой в Windows может падать практически до нуля.


А теперь чуть более подробное, но по возможности всё ещё краткое описание ситуации. Сразу обмолвлюсь, что я не являюсь супер-специалистом в компьютерном железе и, возможно, рассказываю о каких-то супер-очевидных вещах, но лично для меня и нескольких моих знакомых это было открытием, так что, думаю, не помешает сделать на эту тему пост)


Некоторое время назад у меня иногда стали вылетать игры с ошибками о невозможности подгрузки текстур или карты теней. Обычно такое может случаться при нехватке видеопамяти (текстуры просто физически туда не помещаются), но проблема заключалась в том, что из моих 6 Гб оказывались заполненными ну максимум 4 Гб. Начал уже думать о частичном повреждении памяти и решил попробовать полностью её загрузить через MSI Kombustor:

По мониторингу в диспетчере задач и MSI Afterburner было выяснено, что действительно загрузка памяти прекращается по достижению определённого значения и не доходит до максимальных 6 Гб. Подозрителен был тот факт, что значение это всегда разное, чего не могло быть, если бы просто повредился один блок памяти.


Опытным путём было установлено, что момент прекращения загрузки совпадает с окончанием "свободной" части оперативной памяти. Слово "свободной" написано в кавычках, т.к. фактически Windows считает доступной всю оперативную память, которая не используется. Хотя большая часть остатка оперативки при этом может быть забита кэшированными данными (что полезно для ускорения работы), в случае необходимости Windows просто выкинет эти данные и запишет поверх информацию, необходимую для работы программ. В Диспетчере задач эта часть "зарезервированной" памяти обозначается белым прямоугольником:

Проблема в том, что при работе с графикой этот принцип почему-то не работает. Перед загрузкой данных в видеопамять Windows нужно сначала загрузить их в оперативку, и для этого она может использовать только тот "по-настоящему свободный" остаток памяти, что на рисунке я обозначил "доступно". Кэшированные (зарезервированные) данные почему-то не затираются, а должны быть предварительно сброшены в файл подкачки (если вдруг кто-нибудь в комментариях объяснит мне, почему, буду рад). Соответственно, если у вас не используется файл подкачки (а я при своих 16 гигах оперативки так и сделал), объём используемой видеопамяти будет ограничен только "свободной" (в понимании винды) оперативкой. Иногда этот объём может падать практически до нуля. Например, сейчас, когда я пишу этот пост, у меня там всего лишь 180 Мб)


Вывод: для корректного функционирования видеопамяти крайне желательно иметь файл подкачки (желательно по размеру самой видеопамяти), куда при загрузке текстур, карт теней и т.п. из оперативной памяти смогут сбрасываться кэшированные данные. Иначе возможны внезапные вылеты из игр даже при наличии свободной видеопамяти. Если у вас нет файла подкачки, советую попробовать загрузить всю видеопамять хоть через тот же бесплатный Комбустор)


P.S.: видеокарта NVIDIA GeForce GTX 1060

Лига Геймеров

55.4K поста91.8K подписчиков

Правила сообщества

Ничто не истинно, все дозволено, кроме политоты, за нее пермач, идите на ютуб
Помни!
- Новостные/информационные публикации постим в pikabu GAMES
- Развлекательный контент в
Лигу Геймеров



Нельзя:

Попрошайничать;

Рекламировать;

Оскорблять участников сообщества;

Нельзя оценивать Toki Tori ниже чем на 10 баллов из 10;

Выкладывать ваши кулвидосы с только что зареганных акков - пермач

За неэтичное использование сообщества - тоже бан. Если ты выкладываешь пост в наше сообщество и получаешь стартовые плюсы от наших подписчиков, не думай, что вытаскивать потом пост в своё личное сообщество будет умным поступком.

Автор поста оценил этот комментарий
раскрыть ветку (1)
8
Автор поста оценил этот комментарий

Зачем запускать какие-то мутные экзешники, очищающие память, когда фактически то же самое делает алгоритм, основанный на файле подкачки? Кэшированные данные тоже полезны. Если у тебя медленный диск, то повторно программы будут запускаться намного быстрее, т.к. часть данных уже сидит в оперативке. В майкрософт ведь тоже не идиоты сидят. Если б проще было бы просто ввести периодическую очистку памяти, они бы наверняка так и сделали вместо того, чтоб заморачиваться с кэшированием.

показать ответы
Автор поста оценил этот комментарий

Что-что делает алгоритм, основанный на файле подкачки?

Оперативной памяти 16ГБ, файл подкачки 32ГБ, а всё равно жрёт 99% оперативной памяти чем-то, что по мнению винды мне может вот-вот сейчас вдруг снова понадобиться.

Именно, что идиоты. У меня диски в SSD в RAID-0, отдельно для системы, отдельно для игр. Не знаю проблем с недостатком отзывчивости дисковой подсистемы. А вот тупость ребят из микрософта знаю, отчего обновления винды отключены.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Сбрасывает туда эти данные, когда свободная память заканчивается. При отсутствии файла подкачки эти данные, по идее, должны просто затираться при необходимости, но вот с подгрузкой текстур в видеопамять это почему-то не работает. Иметь файл подкачки больше размера оперативной памяти практически бессмысленно.

показать ответы
4
Автор поста оценил этот комментарий

Вы пишете так, как будто 16 гб оперативки недостаточно для «раскрытия» 1060

раскрыть ветку (1)
7
Автор поста оценил этот комментарий

Как будто вообще объём оперативки играет большую роль в "раскрытии" видеокарты...)

показать ответы
Автор поста оценил этот комментарий

Имея SSD и достаточное к-во оперативки файл подкачки обычно не нужен. Более того, файл подкачки на SSD означает, что на него будут интенсивно записываться данные, что уменьшит срок его службы. И вообще если есть выбор: использовать файл подкачки или не использовать, для скорости работы лучше выбрать второе.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Какой бы большой не была оперативка, при долгой работе винда может всю её забить кэшем, и в отсутствии файла подкачки это приведёт к тем проблемам, что описаны в посте.

показать ответы
Автор поста оценил этот комментарий
Файл подкачки — это необязательный, скрытый системный файл на жестком диске. Файл страницы может сохранять (поддерживать) аварийные дампы системы и позволяет увеличить поддерживаемый объем выделяемых системных ресурсов (виртуальной памяти). Также он позволяет системе удалить редко используемые измененные страницы из физической памяти, позволяя более эффективно выделять ее для часто используемых страниц.

Микрософт пишет, что как именно как оперативку использует, причем сугубо для кеша.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
причем сугубо для кеша

Так я и пишу:

временно сбрасываться ненужные данные

При этом файл подкачки не "расширяет" объём оперативки в привычном смысле. Если программе для корректной работы нужно именно 8 гигов оперативки, а у тебя всего 4, она всё равно не будет работать, какой бы файл подкачки у тебя не был.

показать ответы
19
Автор поста оценил этот комментарий

> если вдруг кто-нибудь в комментариях объяснит мне, почему, буду рад

все просто. это механика работы виртуальной памяти.

нельзя просто так взять и освободить блок(особенно отображение файла)

но можно положить в файл подкачки.

приложению отдать память системе непросто.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

> нельзя просто так взять и освободить блок(особенно отображение файла)

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

показать ответы
0
Автор поста оценил этот комментарий

Лять костыли... тоже думал что у меня что-то из 8Гб видеопамяти бракованно, копал копал так ничего и не накопал... мне даже в голову не могло прийти, что чтобы заливать в видеопамять, нужно держать файл подкачки... мастдай... при 32Гб ОЗУ против 16ГБ кстати проблема пропадает :D

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

При желании и 32 гига можно забить кэшем, если система будет долго работать и запускать кучу всего)

Автор поста оценил этот комментарий

Ну, может и загружается. Я не знаю, как это точно устроено.

Суть в том, что когда оперативка занята не полностью, но возникают проблемы с памятью, то дело не в кэше, а в коммите. Вот, на этом скриншоте видно, что памяти свободно более 4 гигабайт, но в коммите (пункт "выделено" на скриншоте) есть всего 1.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ну так вот эти дополнительные гигабайты в коммите и забиты кэшем (белая область на полосе сверху). В нормальном режиме он затирается при необходимости записи новых данных (даже если нет файла подкачки), но именно при передаче данных в видеопамять это почему-то не происходит.

0
Автор поста оценил этот комментарий

Плюсую.

@G0nZaleZ, проверь, когда у тебя начинаться проблемы с выделением памяти программам, то что у тебя в графе "выделено" в диспетчере задач? По идее именно от того, что его свободно меньше, чем нужно видеопамяти, возникает проблема.


А видеопамять с этим связана так:

Обычно коммит (на русский в диспетчере задач перевели как "выделено") примерно равен физическому потреблению памяти. Он почти всегда больше реального потребления памяти, но не сильно.

Однако при загрузке видеопамяти обычно (подозреваю, что это особенность dx11, но не уверен) равное по объему протестантство выделяется в обычной памяти. Оно не используется, это просто подстраховка на случай, если видеопамяти не хватит. Однако при этом использование коммита увеличивается на объем занятой видеопамяти.

А если файла подкачки нет, то объем коммита равен объему физической памяти. И вот получения, что память свободная есть, а использоваться не может, потому что свободного коммита нету. А вовсе не из-за кэша.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Мне всё-таки кажется, что это просто информация сперва физически подгружается в оперативку, потом сбрасывается в видеопамять. Вероятно, это может варьироваться от конкретных API и низкоуровневых реализаций в разных играх, но вот, например, как заполняется оперативка при тесте в комбусторе. График весьма характерный.

Причём после загрузки память начинает потихоньку освобождаться, а в освободившееся место снова подгружаются кэшированные данные из файла подкачки (видно, что кэш полностью заполнил остаток памяти даже после освобождения).

Иллюстрация к комментарию
показать ответы
DELETED
Автор поста оценил этот комментарий

тут похоже на какую-то говносборку винды, битую ОЗУ, избыточный разгон с перегревом VRM питалова процессора на материнке и прочими последствиями, побои на накопителе, проблемы с питанием PCI-E материнки или последствия неверных твиков системы. ей богу, сижу без ФП (ставлю минимальный размер для дампов на случай BSOD, что бывают, хоть и крайне редко) на домашней пекарне со времен 8 гб озу и видеокарты на 1 гб. сейчас имею видеокарту на 11 гб и 32 гб озу. никогда таких проблем не было и нет, хотя были видеокарты на 1 гб, 2гб, 3гб, 6гб, 8гб, оперативка была 8гб и 16гб когда-то. от советов "ставь подкачку 100500 ГБ" вообще волосы дыбом.

для тестирования видеокарт есть еще video memory stress test. она не сказать, чтобы новая, но попробовать интереса ради можно.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Столько диагнозов по одной ситуации)

Попробуй ради интереса вообще отключить файл подкачки, забить большую часть оперативки кэшем, а потом через тот же комбустор залить за видюху 11 гигов текстур. Удивишься)


есть еще video memory stress test

Пробовал. Но она настолько древняя, что оказалась не способна даже весь объём памяти на моей видюхе распознать.

0
Автор поста оценил этот комментарий

Как бы кэш браузера не исчезает с перезагрузкой. И его надо чистить регулярно. Или уже нет?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

1
Автор поста оценил этот комментарий

видать большим куском грузит.

и кешу места нехватает.

тут проверить надо

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

показать ответы
Автор поста оценил этот комментарий

Допустим, есть ситуация: 50% оперативки используется, 50% потенциально зарезервировано.

Игре нужно подгрузить данные в оперативку.


Вариант 1. Кэширование файлов в оперативку включено и работает.

Система начинает перекладывать редко используемые страницы на накопитель, и только потом подгружает нужные данные с накопителя.

Вариант 2. Кэширование файлов в оперативку выключено / не работает благодаря "мутному экзешнику".

50% памяти просто свободны, следовательно игра просто загружает данные с диска.


Как итог, в первом случае при загрузке данных добавляется ещё и запись на накопитель, а запись обычно медленнее. Отсюда могут быть лишние фризы.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Скорее всего, это работает каким-то иным образом. Когда тестировал загрузку памяти комбустером, не замечал какого-то падения скорости загрузки после заполнения свободной оперативки (хотя хард у меня древний и весьма медленный). Если б наличие файла подкачки значительно влияло на производительность, должен был бы быть такой эффект.

Автор поста оценил этот комментарий
Сбрасывает туда эти данные, когда свободная память заканчивается.

Ну нафиг это бесполезное перекладывание лишь теоретически с некоторой вероятностью возможно нужного кеша?


Иметь файл подкачки больше размера оперативной памяти практически бессмысленно.

В теории при достаточном объеме оперативной памяти файл подкачки не нужен совсем, но внезапно оказалось, что это не так. Если чему-нибудь (два открытых браузера с вкладками, файлообменник, игра и .т.д.) понадобится файл подкачки - добро пожаловать, всем хватит места (ещё 140ГБ системного RAID-0 не знаю чем заполнить), но оперативка пусть будет свободной. Не могут рукожопы из мелкософта, может простая утилита.


А работа видеокарты с упором в диск = бесячие фризы.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Ну нафиг это бесполезное перекладывание лишь теоретически с некоторой вероятностью возможно нужного кеша?

Чтобы потом его можно было быстро оттуда взять, если понадобится.


Возможно, ты воспринимаешь файл подкачки как некую "дополнительную оперативку", но нет, он так не работает. Туда лишь могут временно сбрасываться ненужные данные. Если какая-нибудь программа у тебя вдруг заведёт миллиард переменных, которые заполнят всю память, "лишние" из них не будут продолжать записываться на диск, какой файл подкачки у тебя бы не был (если, конечно, в самой проге не предусмотрено использование диска, но это уже не про файл подкачки), а программа просто вылетит из-за нехватки памяти)

показать ответы
0
Автор поста оценил этот комментарий

Но везде пишут об обратной пропорциональности размеров озу и подкачки

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Но это не значит, что подкачка вообще не нужна. Её полное отсутствие может привести к проблемам, описанным в посте.

показать ответы
0
Автор поста оценил этот комментарий

Ну, по идее, подкачка нужна, когда оперативки мало (не зря ее нужно тем больше, чем меньше на пк озу). Если у меня ее 16гб, а игры требуют меньше, то подкачка мне ни к чему, т.к. оперативки хватает.

https://www.youtube.com/watch?v=RJtDptJNu38&t=279s

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну только вот у меня как раз 16 - и такая фигня)
Необходимость файла подкачки не зависит от объёма памяти, т.к. любую память можно забить кэшем.

показать ответы
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну плохой гайд, значит) У меня вот игры иногда вылетали при заполнении 4-5 гигов видеопамяти.

показать ответы
0
Автор поста оценил этот комментарий
Уважаемый, не надо ёрничать, винда разная бывает и в зависимости от того какая именно можно делать выводы)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Окей. Тогда ещё на скрин диспетчера задач посмотреть)
А вообще, конечно же, если не указано, имеется в виду последняя версия. Но насколько мне известно, принцип работы с памятью в винде ещё с висты не менялся.

показать ответы
Автор поста оценил этот комментарий
Прочитал всю ветку, но не понял, какая ось у тс и зачем ему столько видеопамяти
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

А заголовок если прочитать?)

показать ответы
0
Автор поста оценил этот комментарий

после перезагрузки кэш тоже полон? или у вас открыт браузер и тогда уже кэш занимает столько места?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

После перезагрузки, естественно, он минимален. Забиваться он начинает уже по мере работы различных программ, служб и т.п.

1
Автор поста оценил этот комментарий
Иметь файл подкачки больше размера оперативной памяти практически бессмысленно.
В старых статьях про оптимизацию винды писали, что это даже вредно, потому что тогда своп становится приоритетом, а работает хард медленнее любой памяти. 
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Это уже что-то странное. Данные программ в любом случае изначально пишутся в оперативку, а только потом они уже могут сбрасываться в своп.

показать ответы
5
Автор поста оценил этот комментарий

> если вдруг кто-нибудь в комментариях объяснит мне, почему, буду рад


Если и правда интересно, то советую навернуть пятую главу Windows Internals и документацию по WDDM. Ответ вкратце - так надо, винде херово без файла подкачки)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Зачем нужен файл подкачки, я представляю) Интересно именно то, почему с какими-то рядовыми программами кэш затирается по мере надобности свободной оперативки, а вот именно при загрузке данных в видеопамять нет.

показать ответы
0
Автор поста оценил этот комментарий

Вообще, изначально цель была чтобы он именно расширял доступную память :)

Но, есть нюансы и не всякое приложение прямо так сразу выделит себе 8 гиг одним куском, там вроде лимит 2 гига на массив, то есть надо несколько массивов делать и все такое, читайте хабр в общем :)

Что касается видеопамяти, имхо это косяк программы, которая сначала все грузит в оперативку и только потом пихает в видеопамять.

Найдите уроки программирования по графике с примерами как залить текстуры в память, и сто пудов у вас получится забить весь объем, просто лейте по чуть чуть, не все сразу.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
там вроде лимит 2 гига на массив

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

показать ответы
5
Автор поста оценил этот комментарий

Бро вообще не понял что ты написал.

У тебя есть виртуальная память, которую винда использует.
Виртуальная память -- это:
1. ОЗУ

2. ОЗУ + фикс.файл подкачки
3. ОЗУ + расширяемый файл подкачки.

Если твоя программа "запросила ещё памяти" -- ей винда откусит кусок от этой виртуальной памяти.

Как только ВСЕ ПРОГРАММЫ ВМЕСТЕ попросили памяти больше, чем у тебя есть -- вероятнее всего последняя программа крашится (мало программ умеют обрабатывать "нет памяти").
Заметь ошибка "нет памяти" бывает в случаях, если:
в.1 -- закончилась ОЗУ
в.2 -- закончилась ОЗУ + файл подкачки
в.3 -- закочилось ОЗУ + всё свободное место на диске.

ПС
Чем в этом смысле память под "графические потребности" (не обязательно текстуры, там 3Д модельки могут быть) отличается от любого другого выделения (например под ворд, чтобы текст туда поместился) -- ну по-моему ничем.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ты действительно не понял.


Посмотри скрин из диспетчера задач в посте, например. Доступно 10 гигов памяти. Для загрузки текстур в видеокарту требуется 6. Однако все 6 гигов загрузить не удастся, будет использована только та часть памяти, что обозначена красной скобкой, т.к. остальная часть из этих 10 гигов забита кэшем. При любой "рядовой" операции использования памяти можно использовать все 10 гигов, т.к. кэш автоматически затирается, если достигается лимит. Однако именно при загрузке текстур в видеокарту этого почему-то не происходит. Происходит только при наличии файла подкачки.


И да, исходя из твоего текста можно подумать, что винда может использовать весь объём оперативки + файл подкачки, как полноценную память, однако это не так. Файл подкачки используется только для сброса туда данных из оперативки. Если же программе требуется, скажем, 6 гигов оперативки, а у тебя всего 4 + 2 гига файл подкачки, то выполнение программы остановится при заполнении этих 4 гигов.

показать ответы
0
Автор поста оценил этот комментарий
У меня вопрос, есть ссд с виндой и есть обычный с играми. На каком из дисков мне надо сделать файл подкачки чтобы заработал этот способ для игр?
раскрыть ветку (1)
Автор поста оценил этот комментарий

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

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества