Я хотел бы упомянуть несколько вещей, которые я прочитал на эту тему.Ответ: нет , вы не хотите вторую догадываться об диспетчере памяти операционной системы.
Первая причина заключается в том, что вы хотите, чтобы ваша программа (например, MongoDB, SQL Server)попробуйте ограничить объем памяти, исходя из процента свободной оперативной памяти:
Время от времени,клиент попросит способ разработать свою программу так, чтобы она продолжала потреблять оперативную память до тех пор, пока не освободится только х%.Идея состоит в том, что их программа должна активно использовать оперативную память, при этом оставляя достаточно оперативной памяти (х%) для другого использования.Если вы не разрабатываете систему, в которой вы являетесь единственной программой, работающей на компьютере, это плохая идея.
(для объяснения прочитайте статью, почему плохо, включая изображения)
Далее следуют некоторые заметки от автора Varnish и обратного прокси:
То, что происходит со сложным управлением памятью у кальмаров, так это то, что он вступает в борьбу с сложным управлением памятью из ядер, и, как и любая гражданская война, которая никогда ничего не делает.объект в "RAM", и он быстро используется после создания.Затем, через некоторое время, больше нет попаданий, и ядро замечает это.Затем кто-то пытается получить память от ядра для чего-то, и ядро решает вытолкнуть эти неиспользуемые страницы памяти, чтобы освободить пространство и более разумно использовать (кэш-память) для некоторых данных, которые фактически используются программой.Это, однако, делается без ведома Squid об этом.Squid по-прежнему считает, что эти http-объекты находятся в ОЗУ, и они будут, как только он попытается получить к ним доступ, но до тех пор ОЗУ используется для чего-то продуктивного.
Представьте себе делать кэширование чего-либо из файла с отображенной памятью.В какой-то момент в будущем эта память, содержащая этот «кеш», будет выгружена на диск.
- ОС записала на жесткий диск что-то, что уже существует нажесткий диск
Затем наступает момент, когда вы хотите выполнить поиск из своей «кеш-памяти», а не «реальной» памяти.Вы пытаетесь получить доступ к «кэшу», и, поскольку он был выгружен из ОЗУ, аппаратное обеспечение выдает PAGE FAULT
, и кэш возвращается в ОЗУ.
- ваша кэш-память столь же медленнаяв качестве «реальной» памяти, поскольку оба больше не находятся в ОЗУ
Наконец, вы хотите освободить кэш (возможно, ваша программа закрывается).Если «кэш» был выгружен, ОС сначала должна заменить его, чтобы его можно было освободить.Если вместо этого вы просто удалили свой отображенный в память файл, все исчезло (ничего не нужно менять).
- в этом случае ваш кеш замедляет работу
Опять от Раймона Чена: Если ваше приложение закрывается - закройте уже:
Я регулярно использую программу, которая не следует этому правилу.Программа выделяет много памяти в течение своей жизни, и когда я выхожу из программы, она просто сидит там в течение нескольких минут, иногда вращаясь на 100% ЦП, иногда перемешивая жесткий диск (иногда оба).Когда я врываюсь в отладчик, чтобы посмотреть, что происходит, я обнаруживаю, что программа не делает ничего продуктивного.Это просто методично освобождает каждый последний байт памяти, который он выделил за время своей жизни.
Если мой компьютер не испытывал большой нагрузки на память, то большая часть памяти, выделенная программой за время ее жизни, не имеетеще не был выгружен, поэтому освобождение каждой последней капли памяти связано с процессоромоперация. С другой стороны, если я начал сборку или сделал
что-то еще интенсивное использование памяти, то большая часть памяти программы
было выделено в течение срока его службы, что означает, что
программа переносит всю эту память обратно с жесткого диска, просто так
это может позвонить бесплатно на это. Звучит злобно, на самом деле. "Прийти
вот, чтобы я мог сказать тебе уйти. "
Все это анально-рентивное управление памятью бессмысленно. Процесс
выходит Вся эта память будет освобождена, когда адресное пространство
уничтожены. Хватит тратить время и уже выходите.
Реальность такова, что программы больше не работают в "RAM" , они работают в памяти - виртуальных памяти.
Вы можете использовать кэш, но вы должны работать с диспетчером виртуальной памяти операционной системы:
- вы хотите, чтобы ваш кэш находился в пределах страниц , насколько это возможно
- вы хотите гарантировать, что они останутся в оперативной памяти, в силу того, что к ним часто обращаются (то есть на самом деле это полезный кеш)
Доступ:
- тысяча 1-байтовых местоположений вокруг файла 400 ГБ
намного дороже, чем доступ к
- одно 1000-байтовое расположение в файле 400 ГБ
Другими словами: вам не нужно кэшировать данных, вам нужна более локализованная структура данных .
Если вы храните важные данные на одной странице 4k, вы будете играть намного лучше с VMM; Windows - это ваш кеш.
Когда вы добавляете 64-байтовые строки кэша с выравниванием по четырем словам, появляется еще больше стимулов для настройки структуры вашей структуры данных. Но тогда вы не захотите, чтобы он был слишком компактным, иначе вы начнете страдать от потери производительности из-за сбросов кеша с False Sharing .