Предположим, у меня есть некоторые данные, к которым обращаются часто, и некоторые данные, к которым обращаются реже. Я понимаю, что ARC в конечном итоге научится прекращать вытеснять часто обращающиеся данные, чтобы освободить место для других данных, просто потому, что к другим данным недавно обращались. Предположим, что я использую систему ZFS уже довольно давно, и она уловила эту схему доступа.
Если я перезагружу свой ящик и часто используемые данные просто считываются и, таким образом, попадают в ARC, вызовут ли новые чтения других данных их вытеснение? Или ZFS помнит, что эти данные часто используются?
Если это зависит от реализации, то этот вопрос относится конкретно к Solaris.
решение1
ARC не имеет постоянных счетчиков, поэтому ему придется снова увидеть ваш шаблон доступа, чтобы определить, что что-то используется часто. Однако он не будет ничего вытеснять, пока не заполнится/не возникнет давления памяти из-за чего-то еще в системе, поэтому при первой загрузкевсечто считывается или записывается, попадет в кэш. Если ваши часто используемые данные будут прочитаны дважды до этого, они должны попасть в список «MFU».
Подробнее об алгоритме ARC можно прочитать здесь.здесь. В двух словах, он фактически сделан из двух списков LRU, один для вещей, к которым был доступ один раз («список MRU»), и один для вещей, к которым был доступ дважды или больше («список MFU» — да, название неверное, он действительно использует LRU для вытеснения, потому что LRU быстрее и проще в реализации, чем MFU). Существуют также «списки призраков», которые отслеживают недавно вытесненные ключи (но не данные) из каждого списка, что помогает ему определить, насколько большими должны быть два кэша относительно друг друга.
L2ARC является постоянным (обычно хранится на SSD), но не использует алгоритм ARC (еще одно неоптимальное название). Я считаю, что он просто циклически перебирает данные в кэше. Кроме того, я считаю, что вы не сможете повторно использовать его после перезагрузки, если только вы не используете форк OpenZFS от Nexenta (я не думаю, что они уже выложили его в апстрим).
За исключением функции Nexenta «Persistent L2ARC», в этом ответе нет ничего специфичного для платформы.