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

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

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

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

5 ответов


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

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

преимущества:

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

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

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

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


вопросы:

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

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

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

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

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

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

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


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

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

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

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

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


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

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