Отображение памяти файлов и поведение системного кэша в WinXP - PullRequest
3 голосов
/ 04 мая 2010

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

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

У меня вопрос, как не дать системному кешу перегружать физическую память? Я попытался удалить буферизацию файла (используя FILE_FLAG_NO_BUFFERING), но с этим операции чтения занимают значительное количество времени и замедляют производительность приложения. Как добиться масштабируемости, не жертвуя при этом производительностью. Каковы общие методы, используемые в таких случаях?

У меня нет хорошего понимания поведения кэширования ОС WinXP. Любые хорошие ссылки, объясняющие то же самое, также будут полезны.

Ответы [ 2 ]

3 голосов
/ 06 октября 2010

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

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

Есть несколько разделов реестра, которые позволяют настроить поведение кэша, и некоторые из наших клиентов добились хороших результатов с этим.

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

Я не могу порекомендовать пользовательский менеджер памяти, но я знаю, что большинство приложений с большим весом имеют собственное кэширование (Exchange, SQL). Вы можете наблюдать это, запустив Process Monitor.

Если вы хотите полностью запретить менеджеру кэша использовать память для кэширования ваших файлов, вы должны отключить кэширование как чтения, так и записи:

FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH

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

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

Кроме того, я бы порекомендовал перейти на ОС серверного класса, даже Windows 2003 предоставит вам больше возможностей для настройки менеджера кэша. И, конечно, если вы перейдете на Windows 7 / Server 2008, вы получите еще больше улучшений производительности при тех же физических ресурсах из-за динамического размера выгружаемого / невыгружаемого пула и улучшений рабочего набора. Есть хорошая статья на эту тему здесь

1 голос
/ 15 июня 2012

Введите это в блокноте и сохраните как файл .vbs. Запускайте его всякий раз, когда понимаете, что системная память слишком мала. Системный кеш очищается и добавляется в ОЗУ. Я нашел это еще где-то в сети и дал это здесь, чтобы это могло помочь вам. Также рекомендуется позаботиться о том, чтобы первая запись никогда не превышала половины вашей оперативной памяти. Так что, если у вас есть 1 ГБ оперативной памяти, начните со следующего текста в вашем VBS-файле.

FreeMem=Space(240000000) <This one is to clear 512 MB ram> 
FreeMem=Space(120000000)  <This one is to clear 256 MB ram>   
FreeMem=Space(90000000)   <This one is to clear 128 MB ram> 
FreeMem=Space(48000000)  <This one is to clear 64 MB ram> 
FreeMem=Space(20000000)   <This one is to clear 52 MB ram> 
...