#server-performance

ZFS ARC-optimering: Tak, gränser och vad man ska mäta

11 min läsning - 24 juni 2026

hero section cover

ZFS ARC-optimering efter arbetsbelastning. Vilka inställningar som är viktiga, hur man ställer in zfs_arc_max på Linux och FreeBSD, och hur man vet när man är klar.

ZFS tar som standard tyst ungefär hälften av systemets RAM-minne för sin läscache, och på fel typ av server innebär det swap-aktivitet, OOM-avstängningar eller att en databas konkurrerar med filsystemet om minnet. ZFS ARC-justering handlar om att bestämma hur mycket av det RAM-minnet som ARC faktiskt får behålla, och vad du avstår från för att sätta gränsen. Det här inlägget behandlar hur ARC använder minne, vad du bör mäta innan du gör några ändringar, de få inställningar som är värda att ändra samt rimliga utgångspunkter för filservrar, hypervisorer, databaser och säkerhetskopieringsmål. För information om ZFS-snapshots, se vår guide till ZFS-snapshots.

Mät ARC innan du justerar något

Ändra inte en enda inställning förrän du har basvärden från en normal period med hög belastning. Ögonblicksbilder från lugna perioder leder dig i fel riktning. Nattliga säkerhetskopieringar, veckorapporter och batchjobb är vanligtvis de tillfällen då ARC-beteendet blir intressant, så samla in data under flera dagar.

Tre verktyg täcker det mesta av vad du behöver:

  • arcstat 1 ger en rullande realtidsvy av hit- och miss-räknare, efterfrågan kontra prefetch-aktivitet samt aktuell ARC-storlek. Använd det under belastningstester och säkerhetskopieringsfönster.
  • arc_summary skriver ut en enskild ögonblicksbild: ARC-storlek och mål, fördelningen mellan MFU och MRU, metadataproportioner samt aktiva inställningsparametrar. Kör arc_summary -s arc endast för ARC-avsnittet.
  • Råa räknare finns /proc/spl/kstat/zfs/arcstats på Linux och under kstat.zfs.misc och vfs.zfs sysctl-träd på FreeBSD. Hämta dessa från övervakningen istället för att analysera formaterad utdata.

De mätvärden som bör registreras innan någon ändring görs:

MätvärdeVar du hittar denVarför det är viktigt
ARC-storlek, mål, max (size, c, c_max)arcstat, kstatVisar om ARC har nått sin övre gräns eller om det fortfarande finns utrymme att växa
Träfffrekvens för efterfrågedata och metadataarcstat, arc_summaryEfterfrågefel leder direkt till applikationsfördröjning
Tillgängligt minne och swap-aktivitet (si/so)free -h, vmstat 1Kontinuerlig in- och utlagring medan ARC är stort är det tydligaste tecknet på minnesbelastning
Diskens servicetid (await) och utnyttjandeiostat -xKopplar samman ARC-missar med faktiska lagringsflaskhalsar
memory_throttle_count/proc/spl/kstat/zfs/arcstatsEtt stigande antal bekräftar att ZFS stryps på grund av minnespress

Det finns två saker som folk ofta missförstår här. Håll koll på tillgängligt minne, inte ledigt minne; Linux rapporterar gärna lågt ledigt RAM-minne som ett normaltillstånd, och det är i sig inget problem. Den signal som spelar roll är tillgängligt minne nära noll i kombination med ihållande swap-aktivitet (introduktionen till Linux minneshantering förklarar varför). Och betrakta träfffrekvensen som en trend, inte ett mål. En träfffrekvens på 99 % på en maskin som swappar är ett misslyckande i optimeringen, inte en framgång.


 

De fyra viktiga ARC-inställningarna

Det mesta av produktionsjusteringen handlar om fyra inställningar. Anpassa inställningen efter det tryck du faktiskt mätte i baslinjen. Aktiviteten på Swap pekar på zfs_arc_max. Återvinn churn som hela tiden rensar en varm cache pekar på zfs_arc_min. Långsamma kataloggenomgångar pekar på metadatagränsen.

Justerbar parameterVad den görNär ska den ändrasRisk vid fel inställning
zfs_arc_maxHård övre gräns för ARC-RAM-användningSamkörning av databaser eller virtuella maskiner som behöver reserverat RAM-minneFör lågt: mer disk-I/O och latens. För högt: swap-tryck eller OOM.
zfs_arc_minGolv som förhindrar att ARC krymper kraftigtArbetsbelastningar med korta minnespikar som hela tiden rensar cachenFör högt: gör att applikationer svälter under verklig minnespress
zfs_arc_meta_limit_percentAndel av ARC som är tillgänglig för metadata (ersätter den äldre zfs_arc_meta_limit)Miljontals små filer, djupa katalogträd, långsamt ls/findFör lågt: katalogsökningar går på krypfart. För högt: begränsar datacaching.
zfs_arc_free_targetHur mycket ledigt systemminne ZFS försöker hålla tillgängligtServrar med plötsliga stora allokeringsspikar (uppstart av virtuella maskiner, stora frågeplaner)För högt: ARC förblir litet även när RAM-minne finns tillgängligt

Börja med den minsta ändringen som åtgärdar den belastning du kan se. För zfs_arc_max beror det rätta taket på arbetsbelastningen (behandlas i nästa avsnitt). För zfs_arc_minär en nedre gräns på 25–50 % av zfs_arc_max är en rimlig utgångspunkt om du överhuvudtaget behöver en. För metadata ger de senaste standardinställningarna i OpenZFS redan metadata 75 % av ARC via zfs_arc_meta_limit_percent, vilket är generöst för de flesta arbetsbelastningar; ändra detta endast när metadata-missar är tydligt synliga i arcstat.

Tillämpa ändringar på Linux och FreeBSD

På Linux testar du en ändring under körning genom att skriva till sysfs-parameterfilen. Ingen omstart behövs:

echo 17179869184 > /sys/module/zfs/parameters/zfs_arc_max

Det ställer in zfs_arc_max till 16 GiB omedelbart. För att ändringen ska bestå efter en omstart lägger du till den i /etc/modprobe.d/zfs.conf:

options zfs zfs_arc_max=17179869184

I FreeBSD använder körningsändringar sysctl:

sysctl vfs.zfs.arc_max=17179869184

Behåll samma värde i /boot/loader.conf:

vfs.zfs.arc_max="17179869184"

Ändra en inställning i taget, i små steg på cirka 10 % av det totala RAM-minnet. Håll koll på problemfönstret. Behåll ändringen endast om swap förblir noll och latensen är stabil. Gör ändringen permanent först efter att körningstestet har godkänts.

Anpassa ARC efter arbetsbelastning

Det totala RAM-minnet är fel utgångspunkt. Dimensioneringen av ARC bör baseras på arbetsbelastningsmixen på servern.

ArbetsbelastningStart zfs_arc_maxARC-prioritetAnmärkningarViktig mätparameter
Dedikerad filserver / NAS75–80 % av RAM-minnetData och metadataFörhämtning på. Aggressiv cachelagring är nyckeln.Total träfffrekvens
Virtualiseringsvärd30–40 % av RAM-minnetBalanseradLämna utrymme för gästramminne och värduppgifter. Alla värden som inte är noll si/so betyder att gränsen sänks ytterligare.Värdens swap (si/so)
Databasserver25–50 % av RAM-minnetMetadatainriktadReservera minne för DB-motorn först. Ställ in primarycache=metadata om motorn hanterar sin egen buffertcache.Efterfrågemissar
Mål för säkerhetskopiering/arkiveringKonservativ gränsEndast metadataInställt primarycache=metadata så att skanningar i ett steg inte tar bort användbara block.Missar vid förhämtning, träfffrekvens för metadata
Analys / upprepade läsningarHögre tak efter att andra cacher reserveratsMFU-intensivtL2ARC på NVMe kan behålla den aktiva arbetsuppsättningen mellan olika sökningar.Efterfrågemissar

En VM-värd måste dela minne med sina gäster, så en gräns på 30–40 % är ett säkert standardvärde och 50 % är redan för högt för de flesta konfigurationer. Databaser som PostgreSQL och MySQL hanterar sina egna buffertcacher, så du reserverar minne för motorn först och låter ARC ta det som blir över. Backupmål drar nytta av primarycache=metadata eftersom de data som läses sällan behövs igen, och man vill inte att en nattlig säkerhetskopiering ska gå igenom hela poolen och tömma resten av cachen efterhand. För alla arbetsbelastningar gäller att om swap-aktivitet förekommer medan ARC är låst vid zfs_arc_max att taket är för högt; den regeln gäller alltid.

Att diagnostisera problem och veta när man ska sluta

Ett för litet ARC visar sig som höga läs-IOPS, låga träfffrekvenser och långsam katalogbläddring samtidigt som systemet fortfarande har ledigt RAM-minne. Ett för stort ARC är mindre uppenbart. Träfffrekvensen ser bra ut, men servern börjar svappa, belastningsgenomsnittet stiger, processer blockeras i D medan kärnan återvinner ARC-sidor vid behov, och i värsta fall börjar OOM-killer välja offer. Cachen ser frisk ut och servern känns usel.

Metadatapress uppstår när demand_metadata_bytes ligger betydligt högre än demand_data_bytes i arc_summary. Det är då metadata konkurrerar med data om utrymme, och det är värt att höja gränsen för metadataandelen.

Jämför det du ser med den första inställningen som ska kontrolleras:

SymptomTrolig orsakFörsta inställningen att kontrolleraNästa steg
Hög await med många missar vid hög belastningArbetsminnet överskrider ARCzfs_arc_maxLägg till RAM eller lägg till L2ARC
Swap-aktivitet när ARC är stortARC begränsar operativsystemet eller apparnazfs_arc_maxSänk gränsen
Prestandan sjunker efter minnespikarAggressiv utplåning under återvinningzfs_arc_minStäll in en lägsta gräns på 25–50 % av arc_max
Långsamma ls, find, små filoperationerBrist på metadatacachezfs_arc_meta_limit_percentHöj andelen metadata
Ökar memory_throttle_countSystemomfattande minnesbelastningzfs_arc_maxSänk taket; kontrollera om L2ARC-indexet sväller

L2ARC är inte gratis. Indexet för L2ARC-poster finns i primär ARC, och om den extra belastningen överstiger ungefär en tredjedel av den totala ARC-kapaciteten gör den sekundära cachen mer skada än nytta. Använd L2ARC endast när arbetsuppsättningen är större än RAM-minnet men fortfarande ryms på en snabb NVMe-enhet, och endast när träfffrekvensen i den primära ARC-cachen redan är god.

Rätt tidpunkt att sluta med finjusteringen är när latensen är stabil, swap-användningen förblir noll under samma belastningsperiod som orsakade det ursprungliga problemet, och ytterligare ändringar inte längre förbättrar något. En hög träfffrekvens betyder ingenting om servern swappar. När du har passerat den punkten ska du sluta justera inställningarna och endast se över dem igen om samma problem återkommer under samma arbetsbelastning.

Om du behöver en server med tillräckligt med RAM-minne för att köra ZFS ordentligt utan att behöva konkurrera om minnet med dina virtuella maskiner eller databaser (det är värt att först läsa om hur mycket RAM-minne du faktiskt behöver), ta en titt på FDC:s dedikerade servrar.

Blogg

Utvalda denna vecka

Fler artiklar
iperf3-handledning: Testa nätverkshastigheten på Linux och Windows
#bandwidth#server-performance

iperf3-handledning: Testa nätverkshastigheten på Linux och Windows

Installera iperf3, kör bandbreddstester och justera TCP-buffertarna för exakta resultat på Linux och Windows. Omfattar UDP-, dubbelriktade och 10GbE+-tester

10 min läsning - 7 maj 2026

Fler artiklar
background image

Har du frågor eller behöver du en anpassad lösning?

icon

Flexibla alternativ

icon

Global räckvidd

icon

Omedelbar driftsättning

icon

Flexibla alternativ

icon

Global räckvidd

icon

Omedelbar driftsättning