Para testar, preciso que o cache do zfs esteja frio.
Posso liberar o cache do pool removendo os discos de cache, exportando e importando o pool. Isso dá o efeito que desejo. Mas gostaria muito de não exportar o pool.
Existe uma maneira menos drástica de obter o mesmo efeito?
O que procuro é o equivalente a:
echo 3 > /proc/sys/vm/drop_caches
que faz o que eu quero para o ext4.
Fundo
Posso executar meu algoritmo de diferentes maneiras. Eu não me importo com o melhor desempenho. EUfazerse preocupam com o desempenho do pior caso. O pior caso seria em dados frios (dados tocados há tanto tempo que não estão mais em ARC/L2ARC).
Para escolher a maneira ideal de executar o algoritmo, preciso poder executá-lo no mesmo conjunto de testes. E este conjunto de teste deve estar frio. Isso vai completamente contra a estratégia de cache do ZFS: se eu executar o mesmo conjunto de testes repetidamente, os dados serão colocados no ARC - o que faz todo o sentido em circunstâncias normais, mas não aqui.
Posso exportar/importar na minha máquina de desenvolvedor, mas não posso fazer isso na produção. Liberando o cache, no entanto,vaiser aceitável na produção.
Prefiro que o ARC ainda funcione, para que os dados frios sejam armazenados em cache após serem lidos (novamente semelhante ao ext4), mas posso conviver com o ARC completamente desabilitado durante o teste.
Responder1
echo 3 > /proc/sys/vm/drop_caches
usadopara limpar o cache do ZFS, mas alguns commits recentes alteraram isso para limpá-lo apenas parcialmente.
Para restaurar o comportamento antigo, é necessário definir os zfs_arc_shrinker_limit
parâmetros do módulo para 0
(vejaaqui).
Então, para descartar o ARC sem exportar o pool:
echo 0 > /sys/module/zfs/parameters/zfs_arc_shrinker_limit
echo 3 > /proc/sys/vm/drop_caches
O acima irá cairquasetodo o ZFS ARC, deixando apenas alguns MB relacionados aos metadados básicos do pool.