ZFS ARC: O Mito da RAM Devorada e a Arte do Tuning Real
Seu servidor está sem RAM ou o ZFS está apenas fazendo o trabalho dele? Entenda o ARC, analise hit rates e saiba quando (e como) limitar a memória.
O chamado chega às 03:00 da manhã. O Grafana está sangrando vermelho. O alerta é claro e aterrorizante para quem não conhece a anatomia da vítima: RAM Usage > 95%.
O sysadmin júnior já está reiniciando serviços, convencido de que há um memory leak massivo na aplicação Java ou no banco de dados. Ele aponta para o comando free como prova do crime.
Mas, ao chegar na cena, a primeira regra da forense de sistemas se aplica: não confie no resumo, olhe os ponteiros.
A Ilusão Óptica do free

No Linux "vanilla" (com ext4 ou xfs), a memória não utilizada por aplicações é emprestada ao Page Cache. O kernel faz isso de forma transparente. Se a aplicação precisa da RAM de volta, o kernel descarta o cache instantaneamente. É um empréstimo sem burocracia.
Quando introduzimos o ZFS on Linux (ZoL), introduzimos um "corpo estranho" na gestão de memória. O ZFS tem seu próprio mecanismo de cache, o ARC (Adaptive Replacement Cache).
Veja a evidência que causou o pânico:
$ free -g
total used free shared buff/cache available
Mem: 64 60 1 0 3 2
Swap: 0 0 0
A interpretação errada: "Meu Deus, tenho 64GB e estou usando 60GB! Só tenho 1GB livre!"
A realidade forense: Você provavelmente tem 30GB ou 40GB de ARC que o free está contabilizando incorretamente como used (dependendo da versão do procps) ou que ele simplesmente não entende como "memória recuperável" da mesma forma que o Page Cache nativo.
Nota do Investigador: O ARC do ZFS não vive no Page Cache do Linux (LRU simples). Ele vive na memória alocada pelo kernel (via SPL - Solaris Porting Layer). Para o Linux, aquilo é memória em uso pelo kernel, não cache descartável.
O Modelo Mental: O Conflito de Inquilinos

Para entender o risco real, você precisa visualizar a briga por território.
O Page Cache (Nativo): É o cidadão de primeira classe. O Linux sabe exatamente quais páginas são "sujas" (precisam ser gravadas) e quais são "limpas" (podem ser descartadas agora). A liberação é na ordem de nanossegundos.
O ARC (O Inquilino): O ZFS aloca memória do kernel para armazenar metadados e dados. Ele segue a filosofia "Unused RAM is Wasted RAM". Ele vai crescer até atingir o
zfs_arc_max(geralmente 50% da RAM por padrão).
Onde mora o perigo (OOM Killer)
O mantra "RAM não usada é RAM desperdiçada" é lindo na teoria. Na prática, existe uma fricção física.
Quando sua aplicação pede 10GB de RAM subitamente:
O Linux vê que a memória livre é baixa.
O Linux emite um sinal de pressão de memória.
O ZFS recebe o sinal e começa a evictar (expulsar) dados do ARC para liberar espaço.
A Corrida da Morte: A velocidade com que o ZFS consegue liberar o ARC versus a velocidade com que a aplicação aloca memória.
Se a aplicação alocar mais rápido do que o ZFS consegue liberar, o Linux entra em pânico. Ele não vê o ARC diminuindo rápido o suficiente. Ele vê falta de memória iminente.
O resultado? O OOM Killer (Out of Memory Killer) acorda, saca a arma e atira no processo com maior pontuação (geralmente seu banco de dados ou o próprio processo que pediu memória).
Isolando a Variável: É ARC ou Leak?
Não adivinhe. Meça. Antes de culpar a aplicação, verifique o tamanho atual do ARC.
O arquivo da verdade não é o /proc/meminfo, é o arcstats.
# Verificando o tamanho real do ARC em Gigabytes
awk '/^size/ { print $3 / 1024 / 1024 / 1024 " GB" }' /proc/spl/kstat/zfs/arcstats
Se o comando acima retornar 32 GB e o seu free diz que você tem 60GB usados de 64GB, a matemática é simples:
Aplicação/Sistema: ~28 GB
ZFS ARC: 32 GB
Total: 60 GB
Veredito: Não há memory leak. O sistema está fazendo exatamente o que foi projetado para fazer: usar a RAM ociosa para acelerar leituras de disco.
Sinais Vitais vs. Sinais de Perigo
| Sinal | Interpretação Forense | Ação Necessária |
|---|---|---|
| RAM "Used" alta, ARC alto | Comportamento normal do ZFS. O sistema está saudável e rápido. | Nenhuma. Acalme a equipe. |
| Swap sendo usado | O Linux preferiu jogar páginas anônimas para o disco do que esperar o ARC encolher. | Perigo. O ARC pode estar configurado com um mínimo (zfs_arc_min) muito alto ou a pressão de memória é muito rápida. |
| OOM Killer nos logs | `dmesg | grep -i kill`. O kernel perdeu a paciência com o ZFS. |
Resumo da Investigação
O incidente reportado ("sem memória") é, na maioria das vezes, um falso positivo causado pela diferença de contabilidade entre o Linux e o ZFS.
O ARC deve ocupar a RAM livre. Isso é performance, não defeito.
O problema real não é o uso, é a latência de liberação.
Seu inimigo não é a barra vermelha no Grafana, é o OOM Killer disparando porque o ZFS não recuou rápido o suficiente.
Agora que sabemos que a "memória cheia" é (provavelmente) cache útil, precisamos validar se esse cache está realmente trabalhando para nós ou apenas ocupando espaço. É hora de olhar para a eficiência.
Modelo Mental: O Cérebro do ARC (Não é apenas um LRU)
Se você abrir o htop e vir 90% da sua RAM ocupada pelo ZFS, seu instinto de sysadmin "old school" grita: Vazamento de Memória.
Guarde o distintivo. Isso não é um crime; é uma estratégia de eficiência agressiva.
Para entender por que o ZFS se recusa a liberar RAM até o último milissegundo necessário, precisamos dissecar o algoritmo que o governa. A maioria dos sistemas de arquivos usa um LRU (Least Recently Used) simples: o que entrou por último fica no topo; quando enche, o que não foi tocado há mais tempo morre.
O LRU é "burro". Ele sofre de um problema fatal em armazenamento: Scan Thrashing.
Cenário do Crime: Você tem um banco de dados quente no cache. Às 03:00 AM, um backup via
rsyncoutarvarre o disco inteiro. Resultado no LRU: O backup lê terabytes de dados uma única vez. O LRU, cego, inunda o cache com esses dados inúteis e expulsa o banco de dados quente. O desempenho na manhã seguinte é catastrófico.
O ZFS usa o ARC (Adaptive Replacement Cache). Ele não olha apenas para quando você acessou um dado, mas com que frequência.
A Anatomia do ARC: Quatro Listas, Um Cérebro
Imagine o ARC como um bibliotecário com memória fotográfica e espaço limitado na mesa. Ele divide o cache em duas categorias principais, que competem por espaço em um cabo de guerra constante:
MRU (Most Recently Used): "Acabei de ver isso." Ótimo para dados novos e imediatos.
MFU (Most Frequently Used): "Vejo isso toda hora." A casa dos dados "quentes" e recorrentes.
Mas a genialidade do ARC (e onde a mágica forense acontece) não está no que ele guarda, mas no que ele lembra que expulsou. É aqui que entram as Ghost Lists (Listas Fantasmas).
O ARC mantém quatro listas lógicas:
T1 (Top 1 - MRU Real): Dados recentes que estão na RAM agora.
T2 (Top 2 - MFU Real): Dados frequentes que estão na RAM agora.
B1 (Bottom 1 - Ghost MRU): Metadados de dados recentes que foram expulsos da RAM. (O corpo sumiu, mas o fantasma ficou).
B2 (Bottom 2 - Ghost MFU): Metadados de dados frequentes que foram expulsos.
O Mecanismo de Aprendizado (O "Target P")
O ZFS possui um ponteiro móvel chamado p (target size). Ele dita quanto da RAM deve ser dedicada a dados Recentes (MRU) versus Frequentes (MFU).
Ele ajusta esse equilíbrio observando onde ocorrem os Phantom Hits (acertos nas listas fantasmas):
Hit na B1 (Ghost MRU):
- Significado: "O usuário pediu algo que eu acabei de jogar fora porque o cache de Recentes era pequeno demais."
- Ação: O ARC aumenta o tamanho alvo da lista MRU (empurra
ppara a esquerda). Ele aprende que precisa favorecer a novidade.
Hit na B2 (Ghost MFU):
- Significado: "O usuário pediu algo que é acessado sempre, mas eu joguei fora porque dei espaço demais para novidades passageiras."
- Ação: O ARC diminui o tamanho alvo da lista MRU (empurra
ppara a direita), preservando mais dados frequentes.
Isso torna o ZFS Scan Resistant. Quando aquele backup das 03:00 AM roda, ele enche a lista MRU. Os dados antigos do banco de dados (MFU) estão protegidos na lista T2. O backup passa, os dados do backup são descartados (porque foram lidos apenas uma vez e não migraram para MFU), e seu banco de dados continua quente na RAM.
O Mecanismo Adaptativo: O ARC ajusta dinamicamente o equilíbrio entre Recência (MRU) e Frequência (MFU) baseado em hits nas 'Ghost Lists'.
Evidência Forense: Vendo o Cérebro em Ação
Não confie na teoria. Verifique o comportamento. Se o seu servidor está lento, precisamos saber se o ARC está lutando para manter dados recentes ou frequentes.
No Linux, usamos o arcstat (parte do pacote ZFS) para ver essa batalha em tempo real. Não olhe apenas para o "hitrate"; olhe para a distribuição.
# Investigando a composição do cache e o movimento do fantasma
# Intervalo de 1 segundo. Focando em mru vs mfu.
arcstat -f time,c,p,mru,mfu,mru_ghost,mfu_ghost,hit% 1
O que analisar na saída:
c(Cache Size): O tamanho total atual do ARC.p(Target MRU): O tamanho alvo para a lista MRU.- Se
pestá próximo dec, seu workload é quase todo "dados novos/aleatórios". - Se
pestá baixo, o ZFS detectou que seus dados são repetitivos e está priorizando o MFU.
- Se
mru_ghostvsmfu_ghost: Se esses números estão explodindo, você tem "memory pressure". O sistema sabe o que deveria estar em cache, mas não tem RAM física para segurar os dados (apenas os metadados fantasmas).
[!NOTE] DICA DE PRODUÇÃO Se você vê um alto número de hits nas Ghost Lists (você pode inferir isso se o
pflutua agressivamente), isso é a prova definitiva de que adicionar mais RAM vai resolver o problema de I/O. O ZFS está literalmente lhe dizendo: "Eu sabia que precisava desse arquivo, mas não tive espaço".
Resumo do Modelo Mental
Não é apenas RAM usada: É RAM investida. O ZFS prefere expulsar páginas limpas de código de aplicação do que dados quentes do disco, porque ler do disco é ordens de magnitude mais lento.
Frequência vence Recência: Ao contrário do LRU, o ARC protege dados acessados repetidamente contra leituras sequenciais massivas (backups/scans).
Fantasmas guiam o caminho: O tamanho das listas não é fixo; ele respira conforme o padrão de acesso muda minuto a minuto.
Evidência: Diagnóstico Forense com arcstat
Chega de "achismo". Se o servidor está lento e o uso de RAM está alto, o administrador novato entra em pânico e limita o ARC. O investigador forense, porém, sabe que RAM livre é RAM desperdiçada. O crime não é o uso de memória; o crime é a latência de I/O.
Para absolver ou condenar o ZFS, precisamos interrogar o cache em tempo real. Nossa ferramenta principal é o arcstat (Python script nativo no ZFS on Linux/OpenZFS).
1. A Cena do Crime em Tempo Real
Não rode o comando sem argumentos. Precisamos de taxa de variação, não de acumulados desde o boot.
# Observe por 5 segundos, atualizando a cada 1 segundo
arcstat 1 5
A saída típica se parece com isso:
time read miss miss% dmis dm% pmis pm% mmis mm% sz c
10:00 12K 200 1 100 1 100 1 0 0 8G 8G
10:01 45K 12K 26 12K 26 0 0 0 0 8G 8G
...
2. Decodificando os Sinais Vitais
Aqui está como ler a matriz sem se perder no ruído:
read: O total de pedidos de leitura por segundo enviados ao ZFS.
miss% (Hit Rate Inverso): A métrica de vaidade. Todo mundo quer ver 0%, mas o contexto reina.
sz (Size): O tamanho atual do ARC.
c (Target Size): O tamanho alvo do ARC.
- Pista Forense: Se
sz<ce você tem RAM livre, o ARC está crescendo ("warming up"). Sesz>c, o kernel está pressionando o ZFS para liberar memória (memory pressure).
- Pista Forense: Se
A Falácia dos 90%: Um Hit Rate de 90% parece ótimo. Mas se você processa 100.000 IOPS, isso significa 10.000 IOPS vazando para o disco. Se seus discos são HDDs mecânicos (que suportam ~150 IOPS cada), seu sistema está morto, mesmo com "90% de sucesso".
3. O Conceito de "Working Set"
O ARC tenta manter em RAM os dados mais usados (MFU) e mais recentes (MRU). O desempenho cai drasticamente quando o conjunto de dados ativos (Working Set) excede o tamanho físico do ARC disponível. É aqui que o tuning vira um jogo de física, não de configuração.
A Curva do Working Set: Se o seu ARC for menor que os dados 'quentes' (Working Set), a performance despenca. Limitar o ARC incorretamente força leituras de disco desnecessárias.
4. Metadata vs. Data: A Diferença Letal
O arcstat padrão mistura tudo. Mas nem todo miss é igual.
Data Miss: O arquivo não estava na RAM. O sistema vai buscar o bloco no disco. Lento, mas esperado em leituras sequenciais grandes.
Metadata Miss: O ZFS não sabe onde o arquivo está, ou não tem as permissões/atributos em cache. Isso é catastrófico. Operações como
ls -R,findou varreduras de banco de dados travam completamente porque cada leitura exige buscar a estrutura da árvore no disco.
Para diferenciar, usamos o arc_summary ou olhamos colunas específicas do arcstat (mmis = metadata miss).
Investigação Profunda com arc_summary
Se o arcstat mostra fumaça, o arc_summary mostra o fogo.
# Focando apenas na eficiência do ARC
arc_summary -s arc
Procure a seção "ARC Size Breakdown".
Se você vir Metadata size ocupando uma porcentagem minúscula e o Metadata miss alto, seu gargalo não é largura de banda, é IOPS de seek.
Regra de Bolso Forense: Em servidores de arquivos com milhões de arquivos pequenos (ex: e-mail, hospedagem web), o cache de metadados é mais valioso que o cache de dados. Force o ZFS a priorizar metadados (
zfs_arc_meta_limit).
5. O Fantasma do Cache (Ghost Lists)
O ZFS é brilhante porque ele lembra do que acabou de expulsar. Estas são as Ghost Lists (listas fantasmas).
mru_ghost: Dados recentes que foram despejados.
mfu_ghost: Dados frequentes que foram despejados.
Se você tiver muitos "hits" nas listas fantasmas (visíveis via /proc/spl/kstat/zfs/arcstats ou arc_summary), a evidência é clara: Sua carga de trabalho se beneficiaria linearmente de mais RAM ou de um L2ARC (cache em SSD). O ZFS está dizendo: "Eu tinha esse dado agora pouco, mas tive que jogá-lo fora por falta de espaço".
Veredito: Diagnóstico Diferencial
Use esta tabela para determinar a causa raiz antes de tocar em qualquer configuração:
| Sintoma (arcstat) | Contexto | Causa Provável | Ação Recomendada |
|---|---|---|---|
| Hit% > 99%, mas lento | Latência alta no app | Gargalo não é leitura. Provavelmente escritas síncronas (ZIL) ou CPU. | Verifique iostat -x (escrita) e latência de rede. |
| Hit% < 80% | Backup ou Full Scan | Comportamento normal. Dados são lidos uma vez e descartados. | Ignorar. O ARC está fazendo seu trabalho ao não cachear lixo. |
| Hit% < 80% | Banco de Dados / VM | Working Set > RAM. O cache está thrashing. | Adicionar RAM, adicionar L2ARC ou tunar primarycache=metadata. |
| Metadata Miss Alto | ls lento, navegação lenta |
Cache de metadados insuficiente. | Aumentar zfs_arc_meta_limit_percent (padrão costuma ser 75%). |
| Ghost Hits Altos | Performance instável | O cache está despejando dados úteis prematuramente. | Evidência irrefutável para compra de hardware (RAM/SSD L2ARC). |
O Stack: A Guerra de Pressão de Memória (ZFS vs Kernel)
A Cena do Crime: Seu servidor tem 64GB de RAM. O monitoramento diz que 60GB estão "em uso". De repente, uma aplicação Java pede 2GB, o sistema engasga (stall) por 4 segundos e, no final, o kernel invoca o OOM Killer e assassina seu banco de dados.
O culpado imediato parece ser o ZFS "devorando" a RAM. O veredito real: Foi um problema de latência de comunicação entre o kernel do Linux e o ZFS.
Vamos dissecar o cadáver desse incidente.
O Alienígena no Kernel
Para entender a falha, você precisa entender o modelo mental correto: O ZFS não é nativo do ecossistema de memória do Linux.
O kernel do Linux gerencia sua própria cache de disco (Page Cache) de forma agressiva e integrada. Ele sabe exatamente quais páginas pode descartar instantaneamente quando uma aplicação pede memória. É uma conversa interna, fluida.
O ZFS, vindo do Solaris, traz seu próprio gerenciador de memória: o ARC (Adaptive Replacement Cache). No Linux (ZoL), o ARC não vive dentro do Page Cache; ele vive na memória alocada pelo kernel (slab/spl).
Quando a memória acaba, acontece uma negociação hostil:
Kernel: "Estou sem páginas livres. Preciso de RAM agora."
Kernel (Shrinker): Cutuca o ZFS pedindo para liberar memória.
ZFS: Precisa travar estruturas, decidir o que evictar (LRU/LFU), atualizar metadados, liberar o buffer e devolver a página ao kernel.
O "Gap" Mortal: A Velocidade de Evicção
O problema não é o tamanho do ARC. O problema é a derivada (taxa de variação).
Se a sua aplicação aloca memória mais rápido do que o ZFS consegue evictar dados do ARC, o kernel entra em pânico.
O Ciclo da Morte:
- App pede memória.
- Kernel vê RAM cheia -> Aciona Direct Reclaim.
- Kernel bloqueia a App enquanto espera o ZFS liberar RAM.
- ZFS começa a evicção (Isso custa CPU e I/O se houver dirty data).
- O Lag: Se o ZFS demorar milissegundos a mais do que a tolerância do kernel, o kernel assume que não há memória recuperável.
- OOM Killer: O kernel escolhe o processo mais gordo (geralmente o DB ou a App) e o mata para salvar o sistema.
Não foi falta de RAM. Foi falta de tempo de reação.
Evidência Forense: Como provar a culpa
Não adivinhe. Interrogue o sistema. Se você suspeita que o ARC não está reagindo rápido o suficiente à pressão de memória, procure por estes sinais.
1. O Tamanho vs. O Alvo
O ARC tem um tamanho atual (size) e um tamanho alvo (c). Se size > c, o ZFS sabe que precisa encolher, mas ainda não conseguiu.
# Verifique o estado instantâneo do ARC
grep -E '^c |^size ' /proc/spl/kstat/zfs/arcstats
Se você monitorar isso em loop durante um incidente e vir o size se recusando a baixar enquanto o c despenca, você encontrou o gargalo de evicção.
2. O Assassino de Memória (memory_throttle)
O ZFS possui contadores internos que indicam quantas vezes ele teve que frear operações para gerenciar memória.
# Procure por incrementos neste contador
awk '/memory_throttle_count/ {print $3}' /proc/spl/kstat/zfs/arcstats
Se este número estiver subindo, o ZFS está admitindo: "Estou segurando operações de disco porque não tenho memória livre para processá-las".
Tuning Real: Definindo as Fronteiras
No Solaris, deixar o ZFS gerenciar toda a RAM funcionava. No Linux, confiar na retração automática do ARC sob pressão é jogar roleta russa com seus processos.
Você deve impor limites rígidos.
A Regra de Ouro do zfs_arc_max
Nunca deixe o ARC crescer até competir com suas aplicações. Defina um teto seguro.
Cenário: Servidor de Banco de Dados.
Cálculo: RAM Total - (RAM da App + RAM do OS + Margem de Segurança 10%).
Se você tem 64GB e o MySQL precisa de 32GB:
# Defina o máximo do ARC para 24GB (exemplo)
# Valor em bytes: 24 * 1024^3 = 25769803776
echo 25769803776 > /sys/module/zfs/parameters/zfs_arc_max
Nota: Persista isso no /etc/modprobe.d/zfs.conf.
Isso elimina o "Gap Mortal". O ARC nunca crescerá a ponto de o kernel precisar pedir desesperadamente por RAM, pois a RAM livre para a aplicação já estará garantida fora do escopo do ZFS.
A Trincheira do zfs_arc_min
O inverso também é perigoso. Se o kernel estiver sob pressão (talvez por dentry cache ou buffers de rede), ele pode intimidar o ZFS a encolher o ARC até quase zero. Resultado: Performance de disco horrível porque seu cache sumiu.
Proteja seu cache mínimo:
# Garanta que o ARC nunca caia abaixo de 4GB, por exemplo
echo 4294967296 > /sys/module/zfs/parameters/zfs_arc_min
Resumo da Autópsia
Sintoma: OOM Kills intermitentes em cargas de pico.
Causa: O kernel pede memória mais rápido do que o ZFS consegue limpar o ARC (Latência de Shrink).
Solução: Não confie na negociação dinâmica. Use
zfs_arc_maxpara forçar o ZFS a deixar um "pulmão" de RAM livre para o sistema operacional e aplicações, evitando que a guerra de pressão sequer comece.
Produção: Tuning e a Armadilha do L2ARC
Você chega na cena do crime: um servidor de arquivos engasgando. O administrador jura que fez o "upgrade": instalou um SSD NVMe de 1TB para cache e limitou a RAM do ZFS para "sobrar memória para o sistema". O resultado? Latência alta e IOPS instáveis.
Aqui jaz o erro clássico: tratar o ZFS como um sistema de arquivos tradicional. O ZFS não "usa" RAM; ele é a RAM. O disco é apenas onde os dados vão para morrer (persistência).
Vamos dissecar a anatomia desse erro e como consertar.
1. O Modelo Mental: Working Set e Evicção
Antes de tocar em qualquer arquivo de configuração, você precisa entender o Working Set. O Working Set é a quantidade de dados "quentes" (acessados frequentemente) que sua aplicação precisa num intervalo de tempo relevante.
Cenário Ideal: Todo o Working Set cabe na ARC (RAM). Leituras são instantâneas.
Cenário Real: O Working Set é maior que a RAM. O ZFS precisa evictar (expulsar) dados da RAM para ler novos do disco.
O objetivo do tuning não é "economizar RAM", é garantir que o Working Set caiba no cache mais rápido disponível.
2. A Regra de Ouro do zfs_arc_max
Esqueça a regra preguiçosa de "50% da RAM para o ZFS". Isso é superstição, não engenharia. O ZFS é projetado para devolver memória ao sistema quando solicitado, mas em cargas extremas, essa devolução pode ser lenta, causando OOM (Out of Memory) em aplicações.
A Abordagem Forense para Dimensionamento:
Em vez de uma porcentagem arbitrária, calcule de trás para frente:
Quanto o SO precisa para não travar? (Geralmente 2GB-4GB para um Linux moderno headless).
Quanto suas aplicações realmente consomem? (Banco de dados, VMs, Containers). Meça o pico, não a média.
O resto é do ZFS.
Regra de Bolso (Pragmatismo MWL): Se é um Storage Server dedicado (NAS/SAN), defina
zfs_arc_maxparaTotal RAM - 2GB. Deixe o ZFS respirar. Se é um Hypervisor (Proxmox/Sistemas Mistos), definazfs_arc_maxrigidamente para evitar que o ZFS devore a RAM das VMs durante uma scrub.
Como aplicar (sem reiniciar):
# Exemplo: Limitando a 64GB (em bytes)
echo 68719476736 > /sys/module/zfs/parameters/zfs_arc_max
Nota: Para persistir, adicione em /etc/modprobe.d/zfs.conf.
3. A Armadilha do L2ARC (O "Cache" que Piora Tudo)
Aqui é onde a maioria cai. O raciocínio linear é: "Minha RAM está cheia. Vou adicionar um SSD rápido como L2ARC (Level 2 Cache) para expandir a memória."
O Problema Físico: O L2ARC precisa ser indexado. Para saber o que está no SSD, o ZFS precisa manter uma tabela de endereçamento na RAM (ARC).
A Matemática do Desastre
Cada bloco de dados no L2ARC consome cerca de 70 bytes de RAM na ARC para o cabeçalho (header).
Parece pouco? Vamos escalar:
Você tem 64GB de RAM.
Você adiciona um SSD de 2TB como L2ARC.
Você enche o L2ARC com blocos pequenos (ex: 4K ou 8K volblocksize).
Resultado: O ZFS pode precisar de 10GB a 20GB de RAM apenas para mapear o L2ARC.
A Consequência: Para acomodar os headers do L2ARC, o ZFS expulsa dados reais da ARC. Você trocou dados cacheados na RAM (nanosegundos) por dados cacheados no SSD (microsegundos), e ainda pagou uma multa de RAM por isso. Seu "upgrade" acabou de tornar o sistema mais lento.
Sinal de Perigo: Se o seu
arc_summarymostra uma taxa de acerto (Hit Rate) da ARC caindo após adicionar um L2ARC, remova o SSD imediatamente.
4. O Veredito: Quando usar L2ARC?
Não adicione L2ARC por "instinto". Adicione apenas se passar neste checklist:
| Variável | Condição | Ação |
|---|---|---|
| RAM Atual | < 64GB | NÃO USE L2ARC. Compre mais RAM. A taxa de indexação vai matar sua performance. |
| ARC Hit Rate | > 90% | NÃO USE L2ARC. Seu cache atual já resolve. O L2ARC ficará ocioso. |
| Workload | Escrita Sequencial Pura | NÃO USE L2ARC. L2ARC é apenas para leitura. |
| Workload | Leitura Randômica Massiva | SIM. Se o Working Set for 5x maior que a RAM máx possível. |
5. Investigando a Eficiência (Métricas Reais)
Não adivinhe. Pergunte ao kernel. Use o arc_summary ou olhe direto no /proc.
O que procurar no relatório:
ARC Size: Está batendo no
c_max(limite máximo)? Se sim, há pressão de memória.Hit Ratio:
> 95%: Excelente. Não toque em nada.< 80%: Problema. O Working Set não cabe.
L2ARC Breakdown (Se instalado):
- Olhe para
L2ARC HitsvsL2ARC Misses. Se você tem milhões de misses no L2ARC e poucos hits, o SSD está apenas gastando eletricidade e RAM de indexação.
- Olhe para
Comando Rápido para Diagnóstico
Se você não tem arc_summary, extraia a verdade crua:
# Verifique a eficiência do ARC (Hits vs Misses)
grep -E 'hits|misses' /proc/spl/kstat/zfs/arcstats
# Verifique o tamanho atual vs o alvo (c) e máximo (c_max)
grep -E 'c_max|size' /proc/spl/kstat/zfs/arcstats
Resumo da Operação
RAM é Rei: Maximize a RAM física antes de pensar em cache em disco.
Ajuste o Teto: Defina
zfs_arc_maxbaseando-se no que o resto do sistema precisa, não numa % cega.Cuidado com o L2ARC: Adicionar cache SSD em sistemas com pouca RAM (<64GB) é geralmente contraproducente devido ao custo dos headers na memória.
Meça o Working Set: Se o seu ARC Hit Rate é 99%, você não tem um problema de cache, você tem um problema de ansiedade.
Kenji Tanaka
Especialista em Performance de I/O
Obscecado por latência zero. Analisa traces de kernel e otimiza drivers de storage para bancos de dados de alta frequência.