Diagnóstico e Tuning de ARC/L2ARC no ZFS
PROPÓSITO
Entender se o cache do ZFS está ajudando e onde ele está falhando, antes de mexer em qualquer parâmetro.
Quando usar: Quando um pool está lento, ao avaliar se um L2ARC compensa, ou ao dimensionar a RAM de um servidor de armazenamento.
Pré-requisitos: TrueNAS SCALE ou OpenZFS com acesso ao shell.
1. Objetivo
Este documento descreve como avaliar a eficiência de cache do ZFS em ambientes TrueNAS SCALE, com foco em:
ARC em RAM;
L2ARC em SSD/NVMe;
hits e misses;
Demand Data;
MRU e MFU;
pressão de memória;
poluição/churn do L2ARC;
correlação entre as métricas;
critérios para decidir quando realizar tuning.
O objetivo principal não é obter o maior ARC hit ratio possível, mas reduzir acessos desnecessários ao pool físico e garantir baixa latência para as aplicações.
2. Caminho de uma leitura
De forma simplificada:
Aplicação / VM
|
v
+-----------+
| ARC | RAM
+-----------+
|
MISS
|
v
+-----------+
| L2ARC | SSD / NVMe
+-----------+
|
MISS
|
v
+-----------+
| ZFS POOL | HDD / RAIDZ
+-----------+O melhor cenário é:
Aplicação
|
v
ARC HIT
|
v
RAMO cenário mais caro é:
Aplicação
|
v
ARC MISS
|
v
L2ARC MISS
|
v
POOL3. ARC
O que é
ARC — Adaptive Replacement Cache — é o cache principal do ZFS e fica armazenado em RAM.
É a camada de cache mais rápida.
Exemplo:
ARC atual: 397 GiB
ARC máximo: 400 GiBIsso significa que o ZFS está utilizando aproximadamente 397 GiB dos 400 GiB permitidos.
O que observar
Principalmente:
ARC demand data accesses
Demand data hits
Demand data missesO ARC total accesses deve ser considerado apenas como contexto.
4. ARC Total x Demand Data
ARC Total
Inclui:
Demand Data;
Demand Metadata;
Prefetch Data;
Prefetch Metadata;
outros acessos internos.
Exemplo:
ARC total hits: 72%
ARC total misses: 27%Esse número pode enganar.
Metadata normalmente possui hit rate próximo de 100%, elevando artificialmente o percentual geral.
Demand Data
Representa leituras realmente solicitadas pelas aplicações:
máquinas virtuais;
bancos de dados;
NFS;
SMB;
iSCSI;
containers;
aplicações.
Exemplo:
Demand data hits: 65%
Demand data misses: 33%Para análise de performance,Demand Data deve ter prioridade sobre ARC Total.
5. Hit e Miss
Hit
Um hit significa que o dado foi encontrado no cache.
Aplicação
|
v
ARC
|
HITNão foi necessário buscar o dado em uma camada mais lenta.
Em geral:
mais HIT = melhorMiss
Um miss significa que o dado procurado não estava naquela camada de cache.
Exemplo:
ARC MISS
|
v
L2ARCOu:
L2ARC MISS
|
v
POOLEm geral:
menos MISS = melhor6. Threshold sugerido para Demand Data Miss
Os valores abaixo são referências práticas e não limites oficiais do OpenZFS.
| Demand Data Miss | Avaliação |
|---|---|
| 0–2% | EXCELENTE |
| >2–5% | BOM |
| >5–10% | ATENÇÃO |
| >10% | RUIM |
Um valor elevado significa que o ARC não consegue manter em RAM uma parcela importante do working set demandado pelas aplicações.
7. L2ARC
O que é
L2ARC é o segundo nível de cache do ZFS.
Normalmente utiliza:
SSD;
NVMe.
O L2ARC é:
mais lento que RAM
mais rápido que HDD/RAIDZSua função é receber dados que saíram do ARC e permitir que futuras leituras evitem acesso ao pool principal.
8. L2ARC Hit Ratio
Exemplo:
L2ARC hits: 30%
L2ARC misses: 70%Significa que, entre as consultas feitas ao L2ARC:
30% encontraram o dado no SSD
70% precisaram continuar para outra camadaThreshold prático:
| L2ARC Hit | Avaliação |
|---|---|
| >= 40% | EXCELENTE |
| 25–40% | BOM |
| 10–25% | ATENÇÃO |
| <10% | RUIM |
Esses valores devem ser interpretados junto com Demand Data.
9. MRU e MFU
MRU
MRU significa:
Most Recently UsedSão dados acessados recentemente.
Muito MRU no L2ARC pode indicar dados de passagem com pouca reutilização.
Exemplo:
MRU: 98%
MFU: 1%MRU alto isoladamente não é necessariamente problema.
MFU
MFU significa:
Most Frequently UsedSão dados acessados repetidamente.
Em geral, dados MFU são candidatos valiosos para permanecer no cache.
10. Poluição e churn
Pode haver poluição do L2ARC quando existe a combinação:
MRU muito alto
+
L2ARC hit baixo
+
muitos writes
+
MFU muito baixoChurn significa que dados entram e saem do L2ARC constantemente sem reutilização suficiente.
Exemplo:
L2ARC atual: 5 TiB
Writes: 10 TiB
Hit ratio: 12%Isso sugere que muito conteúdo já girou pelo cache com retorno baixo.
11. Low-memory abort
O contador:
Low memory abortsindica situações em que o ZFS deixou de alimentar o L2ARC por pressão de memória.
O importante é observar se ele aumenta.
Exemplo saudável:
Antes: 5
Depois: 5
Delta: 0Exemplo problemático:
Antes: 5
Depois: 8
Delta: +312. zfs_arc_max
Para consultar:
cat /sys/module/zfs/parameters/zfs_arc_maxPara converter o valor atual para GiB:
awk '{printf "%.2f GiB\n", $1/1024/1024/1024}' \
/sys/module/zfs/parameters/zfs_arc_maxExemplo de configuração em runtime para 400 GiB:
echo 429496729600 > /sys/module/zfs/parameters/zfs_arc_max13. Comandos rápidos para diagnóstico
13.1 Resumo principal: ARC + Demand Data + L2ARC
arc_summary | grep -E \
'ARC total accesses|Total hits:|Total misses:|ARC demand data accesses:|Demand data hits:|Demand data misses:|L2ARC breakdown:|Hit ratio:|Miss ratio:'Para performance, olhar primeiro:
Demand data hits
Demand data missesDepois:
L2ARC Hit ratio
L2ARC Miss ratio13.2 Apenas Demand Data
arc_summary | grep -A4 '^ARC demand data accesses:'Útil para verificar rapidamente os hits e misses históricos das leituras demandadas pelas aplicações.
13.3 Apenas ARC status
arc_summary | grep -A7 '^ARC status:'Mostra:
RAM total;
ARC mínimo;
ARC máximo;
target;
tamanho atual;
memória livre;
memória disponível.
13.4 Apenas L2ARC completo
arc_summary | grep -A30 '^L2ARC status:'Mostra:
saúde do L2ARC;
low-memory aborts;
tamanho;
MRU;
MFU;
prefetch;
hit ratio;
misses;
writes.
13.5 Apenas L2ARC breakdown
arc_summary | grep -A4 '^L2ARC breakdown:'Exemplo de saída:
L2ARC breakdown:
Hit ratio: 16.6 %
Miss ratio: 83.4 %13.6 MRU, MFU e Prefetch do L2ARC
arc_summary | grep -E \
'L2ARC size|MFU allocated size|MRU allocated size|Prefetch allocated size'13.7 Header do L2ARC
arc_summary | grep -E \
'L2 header size|Header size:'Ou com mais contexto:
arc_summary | grep -A12 '^ARC structural breakdown'13.8 Low-memory abort
arc_summary | grep -i 'Low memory aborts'Diretamente do kernel:
awk '$1=="l2_abort_lowmem" {print $3}' \
/proc/spl/kstat/zfs/arcstats13.9 Memória disponível
free -hOlhar principalmente a coluna:
availableNão analisar apenas free.
13.10 Principais contadores do L2ARC diretamente do kernel
grep -E \
'^l2_(hits|misses|size|asize|write_bytes|abort_lowmem|mru_asize|mfu_asize|prefetch_asize)' \
/proc/spl/kstat/zfs/arcstats13.11 Calcular L2ARC Hit Ratio diretamente
awk '
$1=="l2_hits" {
hits=$3
}
$1=="l2_misses" {
misses=$3
}
END {
total=hits+misses
printf "L2ARC hits: %d\n", hits
printf "L2ARC misses: %d\n", misses
if (total > 0)
printf "L2ARC hit: %.2f%%\n", hits/total*100
}
' /proc/spl/kstat/zfs/arcstats13.12 Calcular Demand Data diretamente
awk '
$1=="demand_data_hits" {
hits=$3
}
$1=="demand_data_iohits" {
iohits=$3
}
$1=="demand_data_misses" {
misses=$3
}
END {
total=hits+iohits+misses
printf "Demand hits: %d\n", hits
printf "Demand I/O hits: %d\n", iohits
printf "Demand misses: %d\n", misses
if (total > 0) {
printf "Hit: %.2f%%\n", hits/total*100
printf "I/O hit: %.2f%%\n", iohits/total*100
printf "Miss: %.2f%%\n", misses/total*100
}
}
' /proc/spl/kstat/zfs/arcstats13.13 Monitorar Demand Data e L2ARC ao vivo
Atualização a cada 10 segundos:
watch -n10 '
arc_summary | grep -E \
"ARC demand data accesses:|Demand data hits:|Demand data misses:|L2ARC breakdown:|Hit ratio:|Miss ratio:"
'13.14 Monitorar L2ARC completo
Atualização a cada 60 segundos:
watch -n60 "
arc_summary | grep -A30 '^L2ARC status:'
"13.15 Visão diária recomendada
watch -n10 '
arc_summary | grep -E \
"ARC demand data accesses:|Demand data hits:|Demand data misses:|L2ARC breakdown:|Hit ratio:|Miss ratio:|Low memory aborts:"
'Ordem de leitura:
1. Demand Data Miss
2. Low-memory aborts
3. L2ARC Hit Ratio
4. MRU / MFU
5. Writes no L2ARC14. Monitor por janela
Para uma análise mais confiável, utilizar medições por delta em vez de apenas os valores históricos do arc_summary.
Iniciar uma janela:
/root/arc-monitor.sh startDeixar o storage operar normalmente durante um período representativo:
30 minutos
1 hora
4 horasDepois:
/root/arc-monitor.sh reportO relatório deve comparar apenas os acessos realizados naquela janela.
15. Histórico x janela atual
O arc_summary mostra contadores acumulados desde o início da coleta.
Exemplo:
Demand miss histórico: 40%Isso não significa necessariamente que o storage esteja atualmente com 40% de miss.
Uma janela recente pode apresentar:
Demand miss atual: 0.5%Portanto:
arc_summary
=
visão histórica/acumuladaEnquanto:
arc-monitor.sh
=
visão da janela atualPara tuning, a janela atual durante uma carga representativa normalmente é mais importante.
16. Ordem correta de análise
1. Demand Data Miss
Pergunta:
Quanto das leituras solicitadas pelas aplicações está escapando do ARC?2. Low-memory aborts
Pergunta:
Há pressão de memória afetando o L2ARC?3. L2ARC Hit
Pergunta:
Quando o ARC não atende, o L2ARC consegue ajudar?4. MRU x MFU
Pergunta:
O L2ARC está armazenando dados reutilizados ou dados de passagem?5. L2ARC Writes
Pergunta:
Quanto está sendo escrito nos SSDs para obter esse benefício?6. ARC Total
Usar apenas como visão geral.
17. Matriz rápida de diagnóstico
| Demand Miss | L2 Hit | MRU | Interpretação |
|---|---|---|---|
| Baixo | Baixo | qualquer | ARC já resolve a carga |
| Baixo | Alto | qualquer | Situação excelente |
| Alto | Alto | moderado | L2ARC está ajudando |
| Alto | Baixo | Alto | Investigar poluição/churn |
| Alto | Baixo | Baixo | Working set/cache possivelmente insuficiente |
18. ARC excessivo
Sintomas:
ARC próximo da RAM total
+
MemAvailable baixa
+
low-memory aborts aumentandoPossível ação:
reduzir zfs_arc_maxSempre medir novamente após a alteração.
19. L2ARC poluído
Sintomas:
MRU muito alto
+
MFU muito baixo
+
L2ARC hit baixo
+
alto churnPossível ação:
avaliar l2arc_mfuonly=1Não ativar apenas porque MRU está alto.
20. l2arc_write_max
Consultar:
cat /sys/module/zfs/parameters/l2arc_write_maxConverter para MiB:
awk '{printf "%.2f MiB\n", $1/1024/1024}' \
/sys/module/zfs/parameters/l2arc_write_maxConsultar o intervalo de alimentação:
cat /sys/module/zfs/parameters/l2arc_feed_secsNão aumentar l2arc_write_max enquanto houver sinais de poluição.
Se o cache estiver armazenando dados pouco úteis, aumentar a velocidade significa apenas escrever esses dados mais rapidamente.
21. Consultar principais tunables
for p in \
zfs_arc_max \
l2arc_write_max \
l2arc_feed_secs \
l2arc_mfuonly \
l2arc_meta_percent \
l2arc_noprefetch
do
printf '%-25s = ' "$p"
cat "/sys/module/zfs/parameters/$p"
doneSaída típica:
zfs_arc_max = 429496729600
l2arc_write_max = 33554432
l2arc_feed_secs = 1
l2arc_mfuonly = 0
l2arc_meta_percent = 33
l2arc_noprefetch = 122. Situação saudável
Exemplo:
Demand miss: < 5%
Low-memory abort delta: 0
MemAvailable: confortável
L2ARC hit: razoável quando consultado
Writes no L2ARC: proporcionais ao benefícioNão é necessário que todas as métricas sejam perfeitas.
23. Situação de atenção
Investigar quando houver:
Demand miss > 10%
+
L2ARC hit < 10-20%
+
MRU > 95%
+
MFU muito baixo
+
alto volume de writesOu:
low-memory abort aumentando24. Regra principal
Demand Miss baixo
=
as aplicações estão sendo atendidas eficientemente pelo ARCMesmo que:
L2ARC hit seja baixoIsso pode ser perfeitamente saudável porque o L2ARC quase não precisa ser utilizado.
25. Situação que realmente merece tuning
Demand Miss alto
+
L2ARC Hit baixo
+
MRU muito alto
+
MFU muito baixo
+
muitos writes no L2ARC
+
low-memory aborts ou pouca memória disponívelNesse cenário existe forte justificativa para investigar e realizar tuning.
26. Procedimento recomendado
Sempre alterar uma coisa por vez:
1. Corrigir pressão de memória
|
v
2. Medir carga real
|
v
3. Avaliar Demand Miss
|
v
4. Avaliar L2ARC Hit
|
v
5. Avaliar MRU/MFU
|
v
6. Avaliar churn/writes
|
v
7. Alterar um tunable
|
v
8. Medir novamenteEvitar alterar simultaneamente:
zfs_arc_max
l2arc_mfuonly
l2arc_write_max
prefetchCaso contrário fica difícil identificar qual mudança realmente melhorou ou piorou o storage.
27. Objetivo final
O objetivo não é:
100% ARC Hit
100% L2ARC HitO objetivo é:
baixa latência
+
baixo Demand Data Miss
+
uso eficiente da RAM
+
L2ARC realmente útil
+
mínimo acesso possível ao RAIDZ
+
ausência de pressão de memóriaEm ZFS,mais cache não significa automaticamente melhor cache.
As métricas devem sempre ser correlacionadas com o workload real.
