Suponha que eu tenha alguns dados que são acessados com frequência e alguns dados acessados com menos frequência. Entendo que a ARC acabará por aprender a parar de despejar os dados frequentemente acedidos para dar espaço a outros dados apenas porque os outros dados foram acedidos recentemente. Suponha que eu esteja executando um sistema ZFS há algum tempo e ele tenha percebido esse padrão de acesso.
Se eu reiniciar minha caixa e os dados acessados com frequência forem apenas lidos e, portanto, no ARC, novas leituras de outros dados causarão seu despejo? Ou o ZFS lembra que esses dados são usados com frequência?
Se depender da implementação, esta questão pertence especificamente ao Solaris.
Responder1
O ARC não possui contadores persistentes, portanto será necessário ver seu padrão de acesso novamente para determinar se algo é usado com frequência. No entanto, ele não removerá nada até que esteja cheio/há pressão de memória de alguma outra coisa no sistema, portanto, na primeira inicializaçãotudoque for lido ou escrito terminará no cache. Contanto que seus dados acessados com frequência sejam lidos duas vezes antes disso, eles deverão entrar na lista “MFU”.
Você pode ler mais sobre o algoritmo ARCaqui. Resumindo, na verdade é feito a partir de duas listas LRU, uma para coisas que foram acessadas uma vez (a “lista MRU”) e outra para coisas que foram acessadas duas ou mais (a “lista MFU” – sim, a nome está incorreto, ele realmente usa LRU para despejar porque LRU é mais rápido e simples de implementar que MFU). Existem também “listas fantasmas” que rastreiam as chaves recentemente despejadas (mas não os dados) de cada lista, o que ajuda a determinar o tamanho que os dois caches devem ter em relação um ao outro.
O L2ARC é persistente (geralmente armazenado em SSDs), mas não usa o algoritmo ARC (outro nome abaixo do ideal). Eu acredito que ele simplesmente faz um round-robin dos dados no cache. Além disso, acredito que você não pode reutilizá-lo após uma reinicialização, a menos que esteja usando o fork do OpenZFS da Nexenta (não acho que eles o tenham lançado no upstream ainda).
Exceto o recurso “Persistent L2ARC” da Nexenta, nada nesta resposta é específico da plataforma.