Итак, доргие читатели, сегодня мы поговорим о сжатии страниц памяти в windows.

В один прекрасный момент, открыв Task Manager в Windows 11, я обратил внимание на то, что RAM бывает ещё и (Compressed). Именно в скобочках.

С этой технологией мы знакомы уже некоторое время. Ещё в стародавние времена, в мелких платах на основе arm это уже применялось в виде vendor-specific модулей ядра linux zram/zswap итд. А это, на минуточку, 2011-й год.
Потом, это дело обосновалось в андроидных устройствах. А потом и в i-устройствах. Потом оно заехало на linux-desktop-ы, потом на mac os. И вот наконец-то сжатие памяти появилось в windows.

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

Иными словами, сжатая память вносит некоторые задержки в работу не только системы, но и задач, выполняющихся на этой системе. И всё бы хорошо, если бы этой задачей не была бы очередная игрушка. Собственно, в системе 32 гига памяти и на сегодняшний момент для просмотра сериальчиков, ютуба и простеньких игрушек этого вполне достаточно даже без применения сжатия. При этом некоторое количество памяти под кэш файловой системы есть, есть память под шаредные данные для обработки видео и 3d-графики и даже про запас кое-чего остаётся. Почему бы не сжимать только если у нас не возникает в этом реальная необходимость? Но нет, это слишком сложно, тем более, что своп должен работать быстро и прозрачно. Собственно, быстрая работа свопа в windows - это внезапно её отличное свойство, в других ос с этим серьёзные проблемы.

СтОит также отметить, что windows сжимает только те страницы памяти, которые по её мнению редко используются. Но каков алгоритм определения редкоиспользуемости - это загадка, он вроде как не гуглится.

Но у меня есть другая проблема - в системе стоит процессор core i3-12100T (4 ядра, 8 потоков) и работает это дело без турбы, в виду некоторой компактности форм-фактора - надо было влезть в тумбочку под телевизор. То есть процессор-то и есть в некотором роде constraint. Если бы в широкой доступности был какой-нибудь i5-13400t или какой-то другой примерно с таким же термопакетом и более выгодным соотношением number of cores / watt, то я бы взял бы его, не задумываясь. Иными словами, для обеспечения отсуствия фризов и стабильного fps мне пришлось поколдовать над системой - выкорчевать windows defender и вот теперь memory compression.

Итак, самое первое, что нам надо сделать - это добыть powershell запущенный от имени администратора:

PS C:\> Get-MMAgent

ApplicationLaunchPrefetching : True
ApplicationPreLaunch         : True
MaxOperationAPIFiles         : 512
MemoryCompression            : True
OperationAPI                 : True
PageCombining                : False
PSComputerName

Нас интересует MemoryCompression - тут он true, а нам бы его в false перевести и делается это очень просто:

PS C:\> Disable-MMAgent -MemoryCompression

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

Для пущей производительности можно выключить PageCombining, если оно включено. А если не хочется, чтобы windows пред-загружала некоторы прогаммы, которые по её мнению могут понадобиться , то можно ей выключить ApplicationPreLaunch.

На сём имеет смысл прерваться с оптимизацией windows 11.

Next Post