Сколько памяти должна использовать система кэширования в Windows?

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

Но я столкнулся с проблемой «сколько данных я должен кэшировать», и мне было интересно, есть ли какие-то золотые правила в Windows о том, какую стратегию я должен принять. Кэширование выполняется на клиенте, мне не нужно кеширование на сервере.

  1. Должен ли я всегда оставаться ниже x% использования глобальной памяти? И сколько бы это было? Что произойдет, если запустится другая программа, занимающая много памяти, нужно ли очищать кеш?
  2. Должен ли я запрашивать, сколько свободной памяти доступно до кэширования, и использовать фиксированный процент этой памяти для моих нужд?
  3. Я надеюсь, что мне не нужно идти туда, но должен ли я спросить пользователя, сколько памяти он готов выделить для моего приложения? Если да, то как я могу рассчитать значение по умолчанию для этого свойства и для тех, кто никогда не будет использовать этот параметр?

person jonjbar    schedule 10.06.2011    source источник
comment
Итак, одно изображение может быть запрошено несколькими клиентами? Или одно изображение может быть запрошено несколько раз с интервалом в 10 минут?   -  person Z80    schedule 10.06.2011
comment
Изображение может быть запрошено несколькими клиентами и несколько раз с интервалом в 10 минут, но я думаю, что это не имеет значения, поскольку мне нужна стратегия кэширования для клиента, а не для сервера.   -  person jonjbar    schedule 10.06.2011
comment
Я не понимаю. На стороне сервера вы хотите создать отдельный кеш для каждого клиента?   -  person Z80    schedule 10.06.2011
comment
Нет, мне нужно, чтобы клиенты кэшировали данные, загруженные с сервера, поскольку они могут использоваться много раз.   -  person jonjbar    schedule 10.06.2011


Ответы (5)


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

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

Некоторые преимущества:

  • Вам не нужно писать код.
  • Системный кеш учитывает все другие запущенные процессы. Было бы непрактично для вас брать это на себя.
  • В 64-битной Windows система может использовать всю доступную ей память для кеша. В 32-битном процессе Delphi вы ограничены 32-битным адресным пространством.
  • Даже если ваш кеш заполнен и ваши файлы нужно сбросить на диск, доступ к локальному диску выполняется намного быстрее, чем запрос к базе данных и последующая передача файлов по сети.
person David Heffernan    schedule 10.06.2011
comment
Это очень интересно, но меня немного беспокоят антивирусные сканеры, как упоминалось в следующем посте, где они замедляли процесс: stackoverflow.com/questions/5242676/ - person jonjbar; 10.06.2011
comment
Вы пишете его только один раз и, по-видимому, читаете его много раз. Сканер вирусов, если он просканирует файл, займет крошечную часть потраченного времени. Если вы снова и снова записываете в файл в горячем цикле в своем коде, у вас могут возникнуть проблемы. Весь смысл кэша в том, что вы редко в него пишете, но чаще читаете. - person David Heffernan; 10.06.2011
comment
@John - Вы можете поставить исключение, чтобы антивирус не сканировал ваши общие / кэшированные файлы. - person Z80; 10.06.2011
comment
@Altar Это сработало бы, если бы я контролировал сервер, но это произойдет на нескольких клиентах с огромным количеством возможных установленных антивирусных программ. - person jonjbar; 10.06.2011
comment
@David Большое спасибо, я думаю, что это то, что мне нужно. Отличные ответы. - person jonjbar; 10.06.2011
comment
@ Джон, я почти уверен, что проблема с антивирусом на самом деле не будет проблемой. Если вы попытаетесь сделать это самостоятельно, вы, вероятно, пострадаете от снижения производительности, потому что приложениям пользовательского пространства трудно делать это где угодно почти так же хорошо, как это делает система. - person David Heffernan; 10.06.2011
comment
@David: знайте, как работает файловый кеш и его настройки по умолчанию. Он отличается в клиентской и серверной версиях ОС (см., например, support.microsoft.com/kb/837331), и он является общим для всех процессов. Кэш приложения находится под контролем только приложения, которое знает, как обращаться со своими данными (т. е. со списком MRU или LRU?) - person ; 10.06.2011
comment
@Idsandon Приложение может знать, как обрабатывать свои собственные данные, но как оно должно знать о том, как все другие приложения в системе используют общие ресурсы? - person David Heffernan; 10.06.2011
comment
@ Дэвид: точно. ИМХО, кеш приложения не должен конкурировать с выделениями, находящимися вне его контроля. Использование файлового кеша Windows 1) Размер кеша определяется Windows, а не вами (см. kb), и не может превышать заданную сумму 2) Другое приложение может принудительно перенести ваш временный файл на диски, поскольку оно также использует кеш, и у вас нет контроля над тем, что находится в кеше памяти, а что на диске. Кэш приложения не должен быть общим ресурсом, он должен быть выделенным ресурсом. При необходимости с 2003 года можно использовать поддержку больших страниц, что может повысить производительность при правильном использовании. - person ; 10.06.2011
comment
@ldsandon, то, что вы говорите, вероятно, верно для серверных приложений, потому что им разрешено быть эгоистичными (то есть: захватывать столько невыгружаемой памяти, сколько им нужно, независимо от других приложений; если оперативной памяти недостаточно, администратор должен добавить еще). На стороне рабочего стола/клиента все работает иначе, пользователи могут одновременно запускать несколько приложений, и все они хотят получить как можно больше кеша. Просто представьте, что ваш веб-браузер выделяет большие объемы некэшированной памяти для своего кеша, потому что он действительно хочет контролировать все. Я бы закончил процесс сразу! - person Cosmin Prund; 10.06.2011
comment
@Cosmin: существуют тяжеловесные клиентские приложения, которым обычно разрешается (пользователем) захватывать столько памяти, сколько необходимо. Подумайте о видеомонтаже, 3D-моделировании и так далее. Вы действительно не заботитесь о других приложениях, когда вам нужно выполнить задачу и как можно скорее. Конечно, есть приложение и приложение, вы не ожидаете, что утилита или даже браузер будут работать таким образом, но вы можете добровольно предоставить своему основному приложению всю доступную память, если это позволяет вам работать быстрее и лучше. Есть также рабочие станции, более или менее посвященные одному приложению. - person ; 11.06.2011

Это зависит от того, какое другое программное обеспечение работает на сервере. Я бы сделал возможной настройку вручную сначала. Разработайте систему, которая может использовать определенный объем памяти. Если вы можете, создайте его так, чтобы вы могли изменить это значение во время его работы.

Если у вас есть эти возможности, вы можете попробовать некоторые настройки, чтобы увидеть, что работает лучше всего. Я не знаю никаких золотых правил, но я полагаю, что вы должны иметь возможность установить процент от общей памяти или общей доступной памяти с определенным минимальным объемом памяти, который будет всегда свободен для системы. Если вы сэкономите минимум 500 МБ для серверной ОС, вы можете использовать остальное или 90% остатка для своего кеша. Но эти цифры зависят от версии ОС и других приложений, работающих на сервере.

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

person GolezTrol    schedule 10.06.2011
comment
стратегия, заключающаяся в том, чтобы оставить небольшую часть системе и использовать оставшуюся часть (здесь вы говорите 90%), нереалистична. Фрагментация памяти может уменьшить доступное пространство для кэширования. - person az01; 10.06.2011
comment
Спасибо вам обоим за ваш вклад. - person jonjbar; 10.06.2011

Вопросы:

  1. Одно изображение может быть запрошено несколькими клиентами? Или одно изображение может быть запрошено несколько раз за короткий промежуток времени?

  2. Насколько короткий интервал?

  3. Скорость сети действительно высокая? Выше, чем скорость жесткого диска?? Если у вас обычная сеть, то жесткий диск сможет считывать файлы с диска и доставлять их по сети в режиме реального времени. Тем более, что Windows уже хорошо кэширует, поэтому самые последние файлы уже находятся в кеше.

  4. Основная цель компьютера, на котором запущено серверное приложение, — запустить сервер? Или просто обычный компьютер используется и для других задач? Другими словами, это выделенный сервер или обычная рабочая станция/рабочий стол?

но должен ли я спросить пользователя, сколько памяти он готов выделить для моего приложения?

Я бы обязательно туда пошла!!! Если пользователь считает, что серверное приложение не является важным приложением, он, вероятно, присвоит ему низкий приоритет (малый объем кеша). В противном случае, если он считает, что это самое важное работающее приложение, это позволит приложению выделить всю необходимую ему оперативную память в ущерб другим менее важным приложениям.

Просто доставьте приложение с этим параметром, установленным по умолчанию на приемлемое значение (которое будет примерно х% от общего объема ОЗУ). Я буду использовать примерно 70% от общего объема ОЗУ, если основная цель компьютера — это серверное приложение, и около 40-50%, если его целью является компьютер «общего пользования».

person Z80    schedule 10.06.2011
comment
Как пояснялось выше, мне нужна клиентская система кэширования, в которой данные, загруженные с сервера, кэшируются для быстрого доступа. Спасибо за ваш вклад. - person jonjbar; 10.06.2011

Серверному приложению обычно требуются ресурсы, выделенные его администратором для собственного использования. Я бы не заботился о поведении других приложений, я бы заботился о том, чтобы быть «вежливым» приложением, поэтому оно должно позволять администратору настраивать размер кэша памяти и т. Д., Который является единственным, кто знает, как правильно настроить свои системы. (как правило...)

Значения по умолчанию в любом случае должны учитывать, сколько памяти доступно в целом, особенно в 32-разрядных системах с объемом памяти менее 4 ГБ (поскольку Delphi предоставляет только 32-разрядные приложения), чтобы оставить что-то свободным для операционных систем и избежать слишком частого обмена. . Также желательно попросить пользователя выбрать его при настройке.

Если приложение является единственным, работающим на сервере, значение от 40 до 75% доступной памяти может быть приемлемым (в зависимости от того, сколько памяти требуется за пределами кеша), но опять же, спросите пользователя, потому что это почти невозможно узнать. какие другие запущенные приложения могут понадобиться. Вы также можете иметь минимальный размер кеша и максимальный размер кеша, начать с выделения меньшего значения, а затем увеличить его, когда и если это необходимо, и уменьшить его, если это необходимо.

В 32-битной системе это тип использования памяти, который может выиграть от использования PAE/AWE для доступа к более чем 3 ГБ памяти.

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

person Community    schedule 10.06.2011
comment
Если кеширование выполняется на стороне клиента, применимы те же соображения, пусть пользователь выбирает, какие настройки ему подходят лучше всего (такие приложения, как Photoshop, имеют такие параметры конфигурации). Если приложение является основным приложением, которое пользователь будет использовать в данный момент времени, оно будет охотно предоставлять как можно больше памяти для эффективной работы, но, опять же, только пользователь может знать, сколько в порядке. Кроме того, это приложение предназначено для профессиональных пользователей или для обычных? Первый тип обычно нуждается в контроле, второму может потребоваться больше указаний и автоматически вычисляемых значений. - person ; 10.06.2011

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

Возможно, стоит провести анализ, прежде чем тратить слишком много времени на мелкие детали.

person Community    schedule 10.06.2011
comment
Кэш создается клиентами, поэтому каждый клиент владеет своим собственным кешем. Что касается размера файла, каждый из них не такой уж большой, но проблемой является дополнительная память, связанная с тем, что все они находятся в кеше клиента, поэтому мой вопрос о том, сколько кеша я должен выделить в клиенте. - person jonjbar; 10.06.2011