Сколько памяти должна использовать система кэширования в Windows? - PullRequest
7 голосов
/ 10 июня 2011

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

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

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

Ответы [ 5 ]

8 голосов
/ 10 июня 2011

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

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

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

  • Вам не нужно писать код.
  • Системный кеш учитывает все остальные запущенные процессы. Это не будет практичным для вас, чтобы взять это на себя.
  • В 64-битной Windows система может использовать всю кэш-память, доступную ей. В 32-битном процессе Delphi вы ограничены 32-битным адресным пространством.
  • Даже если ваш кэш заполнен и ваши файлы записаны на диск, доступ к локальному диску намного быстрее, чем запрос к базе данных и последующая передача файлов по сети.
1 голос
/ 10 июня 2011

Вопросы:

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

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

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

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

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

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

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

1 голос
/ 10 июня 2011

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

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

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

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

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

1 голос
/ 10 июня 2011

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

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

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

0 голосов
/ 10 июня 2011

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

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

...