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

Или было бы быстрее перечитать эти данные из отображаемой памяти еще раз, поскольку ОС может реализовать свой собственный кеш?

Природа данных заранее неизвестна, предполагается, что чтение файлов происходит случайно.


person Alex Radzivanovich    schedule 25.03.2010    source источник
comment
+1 за очень хороший вопрос. Если кто-то не спросит, они не узнают ответ.   -  person Ian Boyd    schedule 17.05.2012


Ответы (2)


Я хотел упомянуть несколько вещей, которые я читал по этому вопросу. Ответ нет, вы не хотите сомневаться в диспетчере памяти операционной системы.

Первый исходит из идеи, что вы хотите, чтобы ваша программа (например, MongoDB, SQL Server) пыталась ограничить вашу память на основе процента свободной ОЗУ:

Не пытайтесь выделить память, пока не останется только x% бесплатно

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

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

Далее следует несколько заметок от автора Varnish и обратного прокси:

Varnish Cache — заметки архитектора

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

Происходит следующее: Squid создает объект HTTP в «ОЗУ», и он используется несколько раз быстро после создания. Затем через некоторое время он больше не получает попаданий, и ядро ​​​​замечает это. Затем кто-то пытается получить память из ядра для чего-то, и ядро ​​решает вытолкнуть эти неиспользуемые страницы памяти в пространство подкачки и более разумно использовать (кеш-RAM) для некоторых данных, которые фактически используются программой. Однако это делается без ведома кальмара. Squid по-прежнему думает, что эти http-объекты находятся в оперативной памяти, и они будут в ту же секунду, когда он попытается получить к ним доступ, но до тех пор оперативная память используется для чего-то продуктивного.

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

  • ОС записала на жесткий диск то, что уже существует на жестком диске

Затем наступает время, когда вы хотите выполнить поиск из вашей «кэш-памяти», а не из «реальной» памяти. Вы пытаетесь получить доступ к «кэшу», и, поскольку он был выгружен из ОЗУ, аппаратное обеспечение поднимает PAGE FAULT, и кеш выгружается обратно в ОЗУ.

  • ваша кеш-память такая же медленная, как и «настоящая» память, поскольку обе они больше не находятся в ОЗУ

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

  • в этом случае ваш кеш замедляет работу

Снова от Рэймона Чена: Если ваше приложение закрывается — закройте уже:

Когда DLL_PROCESS_DETACH сообщает, что процесс завершается, лучше всего просто вернуться, ничего не делая

Я регулярно использую программу, которая не следует этому правилу. Программа выделяет много памяти в течение своей жизни, и когда я выхожу из программы, она просто сидит там несколько минут, иногда крутится на 100% процессоре, иногда крутит жесткий диск (иногда и то, и другое). Когда я запускаю отладчик, чтобы посмотреть, что происходит, я обнаруживаю, что программа не делает ничего продуктивного. Он просто методично освобождает каждый последний байт памяти, выделенный за время его существования.

Если бы мой компьютер не испытывал большой нагрузки на память, то большая часть памяти, выделенная программе за время ее существования, еще не была выгружена, поэтому освобождение каждой последней капли памяти — это операция, связанная с процессором. С другой стороны, если я запустил сборку или сделал что-то еще, интенсивно использующее память, то большая часть памяти, выделенная программе за время ее существования, была выгружена, что означает, что программа выгружает всю эту память обратно из жесткий диск, просто чтобы он мог позвонить бесплатно на нем. На самом деле звучит как-то злобно. «Иди сюда, чтобы я мог сказать тебе уйти».

Все это анально-рентабельное управление памятью бессмысленно. Процесс завершается. Вся эта память будет освобождена при уничтожении адресного пространства. Хватит тратить время и просто выйдите уже.


Реальность такова, что программы больше не работают в "ОЗУ", они работают в памятивиртуальной память.

Вы можете использовать кеш, но вам нужно работать с диспетчером виртуальной памяти операционной системы:

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

Доступ:

  • тысяча 1-байтовых ячеек вокруг файла размером 400 ГБ

гораздо дороже, чем доступ

  • одно место размером 1000 байт в файле размером 400 ГБ

Другими словами: вам не нужно кешировать данные, вам нужна более локализованная структура данных.

Если вы храните свои важные данные на одной странице размером 4 КБ, вам будет гораздо удобнее играть с VMM; Windows это ваш кеш.

Когда вы добавляете 64-байтовые строки кэша, выровненные по четырем словам, появляется еще больше стимулов для настройки макета структуры данных. Но тогда вы не хотите, чтобы он был слишком компактным, иначе вы начнете страдать от снижения производительности из-за сброса кеша из False Sharing.

person Ian Boyd    schedule 17.05.2012
comment
Согласованный. Хотя, если вы понимаете смысл кэширования в разговорной речи, конечно, иногда имеет смысл иметь вторую копию данных, если представление на диске не соответствует тому, которое требуется в ОЗУ. Хотя это растягивает значение кэширования, и вы, вероятно, все равно удалили бы данные после преобразования. - person uliwitness; 08.04.2016

Ответ сильно зависит от ОС. Вообще говоря, кэшировать эти данные смысла не будет. Как «кэшированные» данные, так и отображаемые в память могут быть удалены в любое время.

Если и будет какая-то разница, то она будет специфичной для ОС - если вам не нужна такая детализация, нет смысла кэшировать данные.

person Yuval Adam    schedule 25.03.2010