FreeBSD మరియు Linux లో ZFS కోసం RAM వినియోగం ఎలా?
ZFS ద్వారా లభించే డేటా భద్రత మరియు కంప్రెషన్ ఫీచర్ల కోసం ఎంత RAM కేటాయించాలో తెలుసుకోండి. తక్కువ మెమరీ ఉన్న VPS సర్వర్లలో ARC మెమరీ వినియోగాన్ని ఎలా నియంత్రించాలో ఈ గైడ్ వివరిస్తుంది.
ZFS మీకు ఏమి ఇస్తుంది, ఏమి తీసుకుంటుంది
FreeBSD మరియు Linux లపై ZFS ఇప్పుడు ఒకే codebase గా, అంటే OpenZFS గా ఉంది, కాబట్టి రెండు సిస్టమ్లలోనూ ఫీచర్లు ఒకేలా ఉంటాయి. ZFS నడుస్తున్న సర్వర్లో checksum చేయబడిన డేటా, డేటా మారే వరకు ఎటువంటి ఖర్చు లేని snapshots, zfs send తో replication, మరియు కేవలం ఒక property సెట్ చేయడం ద్వారా compression వంటి సౌకర్యాలు లభిస్తాయి. ఇది తీసుకునేది మెమరీ: ARC (adaptive replacement cache) డిఫాల్ట్గా RAM లో ఎక్కువ భాగాన్ని ఆక్రమిస్తుంది. 2 GB లేదా 4 GB VPS (virtual private server) లో ఆ మెమరీ మీ అప్లికేషన్కు అవసరమైనదే కావచ్చు.
ఈ గైడ్ ZFS ను నలభై డ్రైవ్ బేలు ఉన్న స్టోరేజ్ బాక్స్ కోణంలో కాకుండా, ఒకటి లేదా రెండు virtual disks ఉన్న అద్దె VPS కోణంలో విశ్లేషిస్తుంది. ఆ పరిమితుల్లో కూడా ఉపయోగపడే ఫీచర్లు మాత్రమే మీ సమయాన్ని కేటాయించదగినవి. ఏవి ఉపయోగపడవో, pool ను నిర్మించే ముందే తెలుసుకోవడం మంచిది.
OpenZFS on FreeBSD మరియు Linux: ఒకే కోడ్బేస్, రెండు ప్యాకేజింగ్ విధానాలు
FreeBSD తన బేస్ సిస్టమ్లో 2008 నాటి FreeBSD 7.0 నుండి ZFSను కలిగి ఉంది, మొదట్లో ఇది ప్రయోగాత్మక ఫీచర్గా ఉండేది. డిసెంబర్ 2020లో వచ్చిన OpenZFS 2.0 నుండి, FreeBSD మరియు Linux రెండూ ఒకే సోర్స్ ట్రీ నుండి బిల్డ్ అవుతున్నాయి. కాబట్టి zfs మరియు zpool రెండింటిలోనూ ఒకేలా పనిచేస్తాయి, మరియు ఒక సిస్టమ్లో సృష్టించిన pool మరొక దానిలో సులభంగా import అవుతుంది.
Linuxలో ZFS ఒక ప్యాకేజీగా, FreeBSDలో బేస్ సిస్టమ్లో భాగంగా ఉండటానికి కారణం లైసెన్సింగ్. OpenZFS అనేది CDDL (common development and distribution license) కింద ఉంటుంది. Linux kernel అనేది GPL (general public license) వెర్షన్ 2 కింద ఉంటుంది. Linux kernel ప్రాజెక్ట్ ఈ రెండింటినీ పరస్పర విరుద్ధమైనవిగా పరిగణిస్తుంది, కాబట్టి ZFS కోడ్ mainline Linuxలో విలీనం చేయబడలేదు. ప్రతి డిస్ట్రిబ్యూషన్ దీనిని ఎలా అందించాలో నిర్ణయించుకుంటుంది. FreeBSDకి అటువంటి వివాదం లేదు, కాబట్టి ZFS నేరుగా అందుబాటులో ఉంటుంది. ఇది కేవలం ప్యాకేజింగ్ తేడా మాత్రమే, దీని గురించి మీరు ప్రత్యేకంగా ఏ పక్షం వహించాల్సిన అవసరం లేదు.
SSD Nodes FreeBSD ఇమేజ్లను అందించదు, కాబట్టి ఇక్కడ అద్దెకు తీసుకున్న సర్వర్లో ఈ గైడ్లోని Linuxకు సంబంధించిన భాగం మాత్రమే వర్తిస్తుంది. మీరు వేరే చోట FreeBSDని ఉపయోగిస్తుంటే, a FreeBSD serverలో ZFS నేరుగా లభిస్తుంది, దీని కోసం ఎటువంటి మాడ్యూల్ బిల్డ్ చేయాల్సిన అవసరం లేదు మరియు kernel అప్గ్రేడ్ల గురించి ఆందోళన చెందాల్సిన పని లేదు.
ZFS ని ఇన్స్టాల్ చేసి pool ను సృష్టించడం
Ubuntu లో ఈ మాడ్యూల్ kernel ప్యాకేజీలలోనే ఉంటుంది, కాబట్టి మీరు కేవలం కమాండ్లను మాత్రమే ఇన్స్టాల్ చేయాలి.
sudo apt update
sudo apt install -y zfsutils-linux
zfs versionzfs version రెండు లైన్లను ప్రింట్ చేస్తుంది, అవి userland వెర్షన్ మరియు kernel మాడ్యూల్ వెర్షన్. కేవలం ఒక లైన్ మాత్రమే కనిపిస్తే, మాడ్యూల్ లోడ్ కాలేదని అర్థం. ఈ ప్యాకేజీ universe కాంపోనెంట్లో ఉంటుంది, ఇది Ubuntu సర్వర్ ఇమేజ్లలో డిఫాల్ట్గా ఎనేబుల్ అయి ఉంటుంది; ఒకవేళ apt దీనిని గుర్తించలేకపోతే, ముందుగా sudo add-apt-repository universe రన్ చేయండి.
Debian లో ప్యాకేజీలు contrib కాంపోనెంట్లో ఉంటాయి మరియు మాడ్యూల్ మీ మెషీన్లో DKMS (dynamic kernel module support) ద్వారా బిల్డ్ అవుతుంది. contrib ను /etc/apt/sources.list.d/debian.sources లోని Components: లైన్కు జోడించి, sudo apt update రన్ చేయండి, ఆపై:
sudo apt install -y linux-headers-$(dpkg --print-architecture) zfs-dkms zfsutils-linuxఈ ఇన్స్టాలేషన్ మాడ్యూల్ను కంపైల్ చేస్తుంది మరియు Building initial module for 6.12.0-... అని ప్రింట్ చేస్తుంది, దీనికి కొన్ని నిమిషాల సమయం పడుతుంది. దీని అర్థం గుర్తుంచుకోండి: ప్రతి kernel అప్గ్రేడ్ సమయంలో ఇది మళ్ళీ బిల్డ్ అవుతుంది, ఒకవేళ బిల్డ్ విఫలమైతే మీరు దానిని సరిచేసే వరకు మీ pool ఇంపోర్ట్ కాదు.
FreeBSD లో ఏదీ ఇన్స్టాల్ చేయాల్సిన అవసరం లేదు. కేవలం సర్వీసును ఎనేబుల్ చేసి ప్రారంభించండి.
sysrc zfs_enable=YES
service zfs startఇప్పుడు pool గురించి. ముందుగా స్థిరమైన (stable) డివైజ్ పాత్లను చూడండి, ఎందుకంటే /dev/vdb డిటెక్షన్ క్రమాన్ని బట్టి మారుతుంటుంది మరియు మీరు మరొక వాల్యూమ్ను జోడించినప్పుడు ఇది మారవచ్చు.
ls -l /dev/disk/by-id/
sudo zpool create -o ashift=12 tank /dev/disk/by-id/virtio-abc123def456
zpool status tankzpool status కమాండ్ state: ONLINE ను ప్రింట్ చేయాలి, అందులో మీ డివైజ్ tank కింద కనిపిస్తుంది. ashift=12 అనేది pool యొక్క అతిచిన్న బ్లాక్ను 4 KiB వద్ద సెట్ చేస్తుంది, ఇది ప్రస్తుత SSDలకు సరిపోతుంది మరియు దీనిని సృష్టించిన తర్వాత మార్చలేము.
చాలా అద్దెకు తీసుకునే ఇమేజ్లు ext4 రూట్ నుండి బూట్ అవుతాయి, కాబట్టి ఇక్కడ ZFS అనేది రూట్ ఫైల్సిస్టమ్ కాకుండా రెండవ వాల్యూమ్పై ఉండే డేటా pool. మీరు బిల్డ్ చేయడానికి ముందు డివైజ్ మీరు అనుకున్నదేనని నిర్ధారించుకోండి, ఎందుకంటే మీకు ఇచ్చిన NVMe డిస్క్ను నిర్ధారించుకోవడం ఒక్క నిమిషం పని, కానీ మళ్ళీ రీబిల్డ్ చేయడం అంటే ఒక మధ్యాహ్నం సమయం వృథా.
Checksums కేవలం pool లో redundancy ఉన్నప్పుడు మాత్రమే మరమ్మత్తు చేయగలవు
ZFS రాసే ప్రతి block ఒక checksum ను కలిగి ఉంటుంది మరియు ప్రతి read ఆ checksum ను సరిచూస్తుంది. లోపాన్ని గుర్తించడం ఎల్లప్పుడూ జరుగుతుంది. కానీ మరమ్మత్తు చేయడానికి రెండవ కాపీ అవసరం.
ఒకే డిస్క్ ఉన్న pool లో, ZFS మీకు అసలు విషయాన్ని తెలియజేసి ఆగిపోతుంది. zpool status -v దీనిని ఈ విధంగా చూపిస్తుంది:
status: One or more devices has experienced an error resulting in data
corruption.
action: Restore the file in question if possible. Otherwise restore the
entire pool from backup.
errors: Permanent errors have been detected in the following files:
/tank/data/archive.tarపాడైన ఫైల్ పేరు ఇక్కడ కనిపిస్తుంది. ext4 అయితే ఎటువంటి హెచ్చరిక లేకుండానే ఆ పాడైన bytes ను ఇచ్చేది, కాబట్టి ZFS అందించే ఈ సమాచారం విలువైనది. అయితే, pool లో మరమ్మత్తు చేయడానికి రెండవ కాపీ లేనందున ZFS దీనిని సరిచేయలేదు.
Mirror ఉన్నప్పుడు, అదే read మంచి కాపీ ఉన్న వైపు నుండి జరుగుతుంది, పాడైన block తిరిగి రాయబడుతుంది, మరియు ఈ సంఘటన zpool status లోని CKSUM కాలమ్ లో కనిపిస్తుంది. దీనినే self-healing అంటారు, దీనికి రెండు పరికరాలు అవసరం.
sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2VPS లలో, హోస్ట్ స్టోరేజ్ సాధారణంగా ఇప్పటికే redundant గా ఉంటుంది, తరచుగా hypervisor కింద RAID 10 అమర్చబడి ఉంటుంది. ఇది డిస్క్ పాడైపోయినప్పుడు మిమ్మల్ని రక్షిస్తుంది. కానీ ఒక block తప్పుగా వచ్చినప్పుడు అది మీకు తెలియజేయదు, ఎందుకంటే ఏ కాపీ సరైనదో ఆ array కి తెలియదు. ZFS కు అది తెలుసు, ఎందుకంటే అది రాసిన డేటాను checksum తో పోల్చి చూస్తుంది.
మీకు ఒకే virtual disk ఉండి, కొంత మరమ్మత్తు సామర్థ్యం కావాలనుకుంటే, sudo zfs set copies=2 tank/important ఆ dataset లోని ప్రతి block యొక్క రెండు కాపీలను అదే డిస్క్ లో నిల్వ చేస్తుంది. ఇది ఆ dataset తీసుకునే స్థలాన్ని రెట్టింపు చేస్తుంది, ఒక పాడైన block నుండి రక్షిస్తుంది, కానీ మొత్తం volume పోయినప్పుడు ఇది ఏమీ చేయలేదు.
Scrub అనేది pool లోని ప్రతిదాన్ని చదివి సరిచూస్తుంది.
sudo zpool scrub tank
zpool status tankఆరోగ్యకరమైన pool చివరలో scan: scrub repaired 0B in 00:04:11 with 0 errors వంటి లైన్ కనిపిస్తుంది. దీనిని ఒక షెడ్యూల్ ప్రకారం అమలు చేయండి; చిన్న pool లకైతే నెలకు ఒకసారి సరిపోతుంది.
systemctl list-unit-files 'zfs-scrub*'
sudo systemctl enable --now zfs-scrub-monthly@tank.timerDatasets పాలసీకి ప్రాథమిక యూనిట్లు
Dataset అనేది pool లోపల ఉండే ఒక filesystem. దీన్ని సృష్టించడం చాలా సులభం, కాబట్టి ప్రతి job కు ఒక dataset ను సృష్టించండి. Properties అన్నీ pool నుండి వారసత్వంగా (inherit) వస్తాయి, అంటే మీరు ఒకసారి default విలువను సెట్ చేసి, అవసరమైన చోట మాత్రమే దాన్ని మార్చుకోవచ్చు.
sudo zfs create tank/data
sudo zfs create tank/pg
sudo zfs set compression=lz4 tank
sudo zfs set atime=off tank
sudo zfs set quota=20G tank/data
sudo zfs set recordsize=16K tank/pg
zfs get -r compression,compressratio,quota tankCompression అనేది చాలామంది జాగ్రత్తగా ఉండాలని వదిలేసే property, కానీ అది తప్పుడు పద్ధతి. lz4 కొంత CPUని వినియోగిస్తుంది, కానీ డిస్క్కు చేరాల్సిన bytes పరిమాణాన్ని తగ్గిస్తుంది. కాబట్టి, compress చేయగల డేటాపై ఇది సాధారణంగా reads మరియు writes వేగాన్ని పెంచుతుంది. zstd ఎక్కువ CPUని ఉపయోగించి మరింత సమర్థవంతంగా compress చేస్తుంది, ఇది అరుదుగా చదివే logs మరియు archives కు బాగా సరిపోతుంది. zfs get compressratio tank తో మీకు ఎంత compression లభిస్తుందో తనిఖీ చేయండి. ఈ నిష్పత్తి (ratio) కేవలం property సెట్ చేసిన తర్వాత రాసిన డేటాకు మాత్రమే వర్తిస్తుందని గుర్తుంచుకోండి.
recordsize అనేది ఒక dataset రాసే అతిపెద్ద block, దీని default విలువ 128K. ఒక database 8 KiB పేజీలను 128 KiB రికార్డులలోకి రాసినప్పుడు, ఒక చిన్న write ఆపరేషన్ మొత్తం రికార్డును చదవడం, మార్చడం మరియు తిరిగి రాయడం వంటి ప్రక్రియలకు దారితీస్తుంది. డేటాను లోడ్ చేసే ముందే database dataset పై recordsize=16K ని సెట్ చేయండి, ఎందుకంటే ఈ property కొత్తగా రాసే blocks కు మాత్రమే వర్తిస్తుంది.
quota అనేది ఒక dataset మొత్తం pool ను నింపకుండా ఆపడానికి ఉపయోగపడుతుంది. ZFS pool 100% నిండినప్పుడు అది నెమ్మదిస్తుంది మరియు దాన్ని శుభ్రం చేయడం కష్టమవుతుంది, కాబట్టి pool లో కొంత ఖాళీ స్థలాన్ని ఉద్దేశపూర్వకంగా వదిలివేయండి.
డేటా మారే వరకు Snapshots కు ఎటువంటి ఖర్చు ఉండదు
ZFS ఎప్పుడూ లైవ్ బ్లాక్ను ఓవర్రైట్ చేయదు. ఇది కొత్త బ్లాక్ను రాసి పాయింటర్లను అప్డేట్ చేస్తుంది, దీనినే copy-on-write అని అంటారు. Snapshot అనేది "ప్రస్తుతం ఈ డేటాసెట్ సూచిస్తున్న బ్లాక్లను అలాగే ఉంచు" అని చెప్పే ఒక సూచన, కాబట్టి దీనిని తీసుకోవడం తక్షణమే మరియు ఉచితంగా జరుగుతుంది.
sudo zfs snapshot tank/data@2026-08-11
zfs list -t snapshot -o name,used,refer -r tank/dataఒక snapshot కోసం USED కాలమ్ అనేది ఆ snapshot ద్వారా మాత్రమే పట్టుకోబడిన స్థలాన్ని సూచిస్తుంది. మీరు డేటాను మార్చినప్పుడు లేదా తొలగించినప్పుడు పాత బ్లాక్లను విడుదల చేయలేము కాబట్టి, ఇది సున్నా దగ్గర మొదలై క్రమంగా పెరుగుతుంది.
ఒక ఫైల్ను తిరిగి పొందడానికి ఎటువంటి restore ప్రక్రియ అవసరం లేదు.
ls /tank/data/.zfs/snapshot/
cp /tank/data/.zfs/snapshot/2026-08-11/notes.txt /tank/data/notes.txt.zfs డైరెక్టరీని మీరు sudo zfs set snapdir=visible tank/data రన్ చేసే వరకు ls -a నుండి కూడా దాచి ఉంచుతుంది. మీకు అవసరమయ్యే ముందే snapshot తీసుకోండి, ఎందుకంటే అది లేకపోతే ఒక పొరపాటున జరిగే rm -rf మిమ్మల్ని ext4 రికవరీ మార్గం లోకి నెట్టేస్తుంది, ఇది డిస్క్ను unmount చేయడంతో మొదలై మరింత క్లిష్టంగా మారుతుంది.
Rollback అనేది snapshot తర్వాత రాసిన ప్రతిదాన్ని తొలగిస్తుంది.
sudo zfs rollback tank/data@2026-08-11కొత్త snapshots ఉన్నప్పుడు ఇది తిరస్కరిస్తుంది, మరియు -r ముందుకు వెళ్లడానికి ఆ కొత్త snapshots ను తొలగిస్తుంది. మీరు ఎంటర్ నొక్కే ముందు డేటాసెట్ పేరును రెండుసార్లు సరిచూసుకోండి.
Snapshot అనేది బ్యాకప్ కాదు. ఇది అదే పూల్, అదే వాల్యూమ్, అదే సర్వర్లో ఉంటుంది. ఒక వాల్యూమ్ విఫలమైనా లేదా zpool destroy జరిగినా డేటాతో పాటు snapshots కూడా పోతాయి. Snapshots మిమ్మల్ని మీ స్వంత rm నుండి మరియు తప్పుగా జరిగిన అప్గ్రేడ్ నుండి రక్షిస్తాయి, ఇవి చాలా నిజమైన సమస్యలను కవర్ చేస్తాయి, కానీ పూల్కు జరిగే నష్టం నుండి ఇవి ఏమీ రక్షించలేవు. దీనికి సంబంధించిన పూర్తి వివరణ ఇక్కడ ఉంది: VPS snapshot ఎందుకు బ్యాకప్ కాదు.
పంపడం మరియు స్వీకరించడం: ఒకే కమాండ్తో రెప్లికేషన్
zfs send ఒక స్నాప్షాట్ను స్టాండర్డ్ అవుట్పుట్పై బైట్ స్ట్రీమ్గా మారుస్తుంది, మరియు zfs receive ఆ స్ట్రీమ్ను తిరిగి డేటాసెట్గా మారుస్తుంది. మొదటి కాపీ ఒక పూర్తి స్థాయి సెండ్ (full send).
sudo zfs snapshot tank/data@daily-2026-08-11
sudo zfs send tank/data@daily-2026-08-11 | ssh backup.example.com "sudo zfs recv -F backup/data"ఆ తర్వాత, రెండు స్నాప్షాట్ల మధ్య మారిన డేటాను మాత్రమే పంపండి.
sudo zfs snapshot tank/data@daily-2026-08-12
sudo zfs send -i tank/data@daily-2026-08-11 tank/data@daily-2026-08-12 | ssh backup.example.com "sudo zfs recv backup/data"మీరు పంపుతున్న స్నాప్షాట్ అవతలి వైపు (receiving side) తప్పనిసరిగా ఉండాలి. అది లేనప్పుడు, cannot receive incremental stream: most recent snapshot of backup/data does not match incremental source తో స్వీకరణ ప్రక్రియ ఆగిపోతుంది, ఎందుకంటే మార్పులను వర్తింపజేయడానికి ZFS వద్ద బేస్ ఉండదు. రెండు వైపులా ఉన్న స్నాప్షాట్ నుండి పంపండి, లేదా పూర్తి స్థాయి సెండ్తో మళ్ళీ ప్రారంభించండి.
రిమోట్ root ను ఉపయోగించే బదులు టార్గెట్ వద్ద హక్కులను మంజూరు చేయండి: sudo zfs allow -u backupuser create,mount,receive backup/data.
ఇది ఒక షరతుతో కూడిన నిజమైన ఆఫ్-సైట్ బ్యాకప్. అవతలి చివర తప్పనిసరిగా ZFS పూల్ ఉండాలి, ఎందుకంటే ఆబ్జెక్ట్ స్టోరేజ్ స్ట్రీమ్ను స్వీకరించలేదు. మీ టార్గెట్ S3-compatible స్టోరేజ్ లేదా సాధారణ Linux హోస్ట్ అయినప్పుడు, దానికి అనుగుణంగా ఉండే సాధనాన్ని ఉపయోగించండి, మరియు restic backups from a VPS ఆ మార్గాన్ని వివరిస్తుంది.
ZFS ఎందుకు అంత ఎక్కువ RAMని ఉపయోగిస్తుంది? ARC గురించి
ARC (adaptive replacement cache) అనేది ZFS యొక్క రీడ్ క్యాచీ. ఇది సాధారణ Linux పేజీ క్యాచీలో కాకుండా కెర్నల్ మెమరీలో ఉంటుంది, కాబట్టి free -h దీనిని buff/cache కింద చూపదు. ఇది వినియోగంలో ఉన్న మెమరీగా కనిపిస్తుంది. ZFS సర్వర్ దాదాపు నిండిపోయినట్లు కనిపిస్తుందంటే, సాధారణంగా క్యాచీ వేడెక్కి (warm cache) ఉందని అర్థం. "ZFS నా RAMని తినేసింది" అనే ఫిర్యాదులకు ఇదే ప్రధాన కారణం.
డిఫాల్ట్ పరిమితిని ఉద్దేశపూర్వకంగానే ఎక్కువగా ఉంచారు. OpenZFS 2.3 గరిష్ట ARC పరిమాణాన్ని RAM మైనస్ 1 GiB లేదా RAMలో 5/8 వంతు - వీటిలో ఏది ఎక్కువైతే దానిని పరిమితిగా నిర్ణయిస్తుంది. OpenZFS 2.2 మరియు అంతకంటే పాత వెర్షన్లు Linuxలో RAMలో సగం వాడుకునేవి, అయితే FreeBSD అప్పటికే కొత్త నియమాన్ని అమలు చేస్తోంది. మీకు ఏది వర్తిస్తుందో తెలుసుకోవడానికి zfs version కమాండ్ను రన్ చేయండి.
The data behind this chart
[
{
"label": "2 GB VPS",
"openzfs_2_2_linux_gib": 1,
"openzfs_2_3_gib": 1.25
},
{
"label": "4 GB VPS",
"openzfs_2_2_linux_gib": 2,
"openzfs_2_3_gib": 3
},
{
"label": "8 GB VPS",
"openzfs_2_2_linux_gib": 4,
"openzfs_2_3_gib": 7
},
{
"label": "16 GB VPS",
"openzfs_2_2_linux_gib": 8,
"openzfs_2_3_gib": 15
}
]ఈ గణాంకాలు సాధారణ ఇన్స్టాన్స్ పరిమాణాలకు వర్తించే డాక్యుమెంట్ చేయబడిన డిఫాల్ట్ నియమాలు, ఇవి రన్ అవుతున్న సర్వర్ నుండి సేకరించిన కొలతలు కావు. 4 GB ఇన్స్టాన్స్పై 2.3 నియమం 3 GiB ARCని అనుమతిస్తుంది. అదే ఇన్స్టాన్స్ 2.2 వెర్షన్లో 2 GiB వద్ద ఆగిపోతుంది. 2.3 నియమం ప్రకారం 2 GB ఇన్స్టాన్స్ కూడా 1.25 GiBని అనుమతిస్తుంది. మిగిలిన మెమరీ మీ అప్లికేషన్కు అందుతుంది.
పట్టికను నమ్మే బదులు, మీ సర్వర్ నుండి అసలైన సంఖ్యలను ఇలా చూడండి:
grep -E '^(size|c_max) ' /proc/spl/kstat/zfs/arcstats
arc_summary | head -n 20మూడవ కాలమ్ బైట్లలో ఉంటుంది. c_max అనేది ప్రస్తుతం అమల్లో ఉన్న గరిష్ట పరిమితి, మరియు size అనేది ప్రస్తుతం ARC కలిగి ఉన్న మెమరీ.
ARC మెమరీని తిరిగి ఇస్తుంది. కెర్నల్ మెమరీ ఒత్తిడిని (pressure) సూచించినప్పుడు ARC పరిమాణం తగ్గుతుంది. అయితే, ఈ తగ్గింపు ఆ ఒత్తిడిపై ఆధారపడి ఉంటుంది కాబట్టి టైమింగ్ సమస్యలు రావచ్చు. ఒక ప్రాసెస్ ఒకేసారి వందల MiB మెమరీని అడిగినప్పుడు, ARC మెమరీని విడుదల చేసేలోపే OOM (out of memory) కిల్లర్ ఆ ప్రాసెస్ను నిలిపివేయవచ్చు. డేటాబేస్ మరియు వెబ్ సర్వర్ నడుస్తున్న 2 GB సర్వర్లో ఇది అరుదైన విషయం కాదు. మాన్యువల్ మార్పుల గురించి OpenZFS మాన్యువల్ కూడా ఇదే చెబుతోంది: పరిమితిని తగ్గించడం వల్ల "మెమరీ ఒత్తిడి లేనిదే ARC పరిమాణం తగ్గదు".
చిన్న VPSలో ARCని పరిమితం చేయడం ఎలా
ముందుగా మీ వర్క్లోడ్ కోసం ఎంత మెమరీ అవసరమో నిర్ణయించుకోండి. డేటాబేస్ మరియు అప్లికేషన్కు అవసరమైన మెమరీని లెక్కించి, ఆపరేటింగ్ సిస్టమ్ కోసం కొంత మార్జిన్ ఉంచి, మిగిలిన దానిని ARCకి కేటాయించండి. Postgres మరియు ఒక వెబ్ అప్లికేషన్ నడుస్తున్న 4 GB ఇన్స్టాన్స్లో, 512 MiB నుండి 1 GiB వరకు ARCని కేటాయించడం సరైన ప్రారంభం.
దీనిని bytesలో సెట్ చేయండి. ఇక్కడ 1 GiB విలువను సెట్ చేస్తున్నాము.
echo 1073741824 | sudo tee /sys/module/zfs/parameters/zfs_arc_maxఇది రీబూట్ తర్వాత కూడా అమల్లో ఉండేలా చేయండి.
echo 'options zfs zfs_arc_max=1073741824' | sudo tee /etc/modprobe.d/zfs.conf
sudo update-initramfs -uinitramfs దశ చాలా ముఖ్యం, ఎందుకంటే రూట్ ఫైల్సిస్టమ్ మౌంట్ అవ్వకముందే మాడ్యూల్ initramfs నుండి లోడ్ అవ్వవచ్చు. అప్పుడు మీరు రాసిన ఫైల్ను అది చదవదు. రీబూట్ తర్వాత, arcstats నుండి c_max లైన్తో దీనిని నిర్ధారించుకోండి.
మాన్యువల్ ప్రకారం రెండు ముఖ్యమైన విషయాలు ఉన్నాయి. సిస్టమ్ నడుస్తున్నప్పుడు మీరు విలువను తిరిగి 0కి మార్చలేరు, కాబట్టి దీనిని రద్దు చేయాలంటే ఫైల్ను ఎడిట్ చేసి రీబూట్ చేయాలి. అలాగే, విలువను తగ్గించినంత మాత్రాన ఇప్పటికే ఉన్న పెద్ద ARC వెంటనే తగ్గదు.
FreeBSDలో ఇదే పరిమితిని vfs.zfs.arc కింద sysctl ద్వారా సెట్ చేయవచ్చు. ప్రస్తుత విలువలను మరియు మీ వెర్షన్లో ఉన్న ఖచ్చితమైన పేరును చూడటానికి sysctl vfs.zfs.arc రన్ చేయండి, ఆపై గరిష్ట విలువను /boot/loader.conf లోకి రాయండి.
చిన్న సర్వర్ల కోసం మరో రెండు మెమరీ నియమాలు ఉన్నాయి. Deduplicationని ఆఫ్ చేయండి, ఎందుకంటే dedup టేబుల్ మెమరీలో ఉంటుంది. సాధారణంగా 1 TB ప్రత్యేక డేటాకు 1 నుండి 3 GB RAM అవసరమని ఒక అంచనా. అలాగే, swapని zvol (పూల్ నుండి తీసిన బ్లాక్ డివైజ్)పై ఉంచవద్దు, ఎందుకంటే మెమరీని ఖాళీ చేయడానికి ప్రయత్నిస్తున్న ఫైల్సిస్టమ్ ద్వారా swap చేయడం వల్ల మెషిన్ deadlock అవ్వవచ్చు. Swapని సాధారణ partitionపై లేదా పూల్ వెలుపల ఉన్న swap fileలో ఉంచండి.
ext4 లేదా XFS మరియు restic ఎప్పుడు మెరుగైన ఎంపిక అవుతాయి
సర్వర్లో అదనపు మెమరీ మరియు రెండవ వాల్యూమ్ ఉన్నప్పుడు ZFS ఉపయోగకరంగా ఉంటుంది. అది లేని పక్షంలో, సాధారణ filesystem మరియు సరైన backup tool వాడటమే ఉత్తమం. కింది సందర్భాలలో ext4 లేదా XFS ను ఎంచుకోండి:
- instance లో 2 GB లేదా 4 GB RAM మాత్రమే ఉండి, workload కు ఆ మొత్తం అవసరమైనప్పుడు.
- ఒకే virtual disk ఉండి, రెండవ కాపీ లేనప్పుడు (ZFS కేవలం లోపాలను గుర్తిస్తుంది కానీ సరిచేయలేదు).
- మీ backup target ఒక object storage లేదా సాధారణ Linux host అయినప్పుడు, అక్కడ
zfs sendstream ను స్వీకరించే అవకాశం ఉండదు. - మీరు DKMS తో Debian వాడుతూ, kernel upgrade తర్వాత module build కాకపోవడం వంటి సమస్యలను భరించలేనప్పుడు.
- మీకు root filesystem పై ZFS అవసరమై, కానీ provider అందించే images లో కేవలం ext4 మాత్రమే ఉన్నప్పుడు.
మీ దగ్గర ప్రత్యేకమైన data volume, అదనపు RAM (8 GB లేదా అంతకంటే ఎక్కువ సౌకర్యవంతంగా ఉంటుంది), మరియు snapshots తో పాటు zfs send ను కేవలం enable చేయడమే కాకుండా, వాటిని సమర్థవంతంగా వాడే ప్రణాళిక ఉన్నప్పుడు మాత్రమే ZFS ను కొనసాగించండి. మిగిలిన అన్ని సందర్భాల్లో, సర్వర్ నియంత్రణలో లేని storage కు restic ద్వారా encrypted, deduplicated backups పంపడం వల్ల, మెమరీపై భారం పడకుండానే దాదాపు అదే రక్షణ లభిస్తుంది.
వైఫల్య రీతులు మరియు మీరు చూసే సందేశాలు
రీబూట్ తర్వాత పూల్ కనిపించడం లేదు. zpool status కమాండ్ no pools available అని చూపిస్తుంది. ఇంపోర్ట్ సర్వీస్ /etc/zfs/zpool.cache ఫైల్ను చదువుతుంది, కాబట్టి ఆ ఫైల్లో లేని పూల్ బూట్ సమయంలో ఇంపోర్ట్ అవ్వదు. sudo zpool import కమాండ్ ఇంపోర్ట్ చేయడానికి వీలైన వాటిని జాబితా చేస్తుంది, sudo zpool import tank వాటిని తిరిగి తెస్తుంది, మరియు sudo zpool set cachefile=/etc/zfs/zpool.cache tank వాటిని శాశ్వతంగా సేవ్ చేస్తుంది. మరొక సిస్టమ్ నుండి సరిగ్గా ఎక్స్పోర్ట్ చేయని పూల్ cannot import 'tank': pool may be in use from other system అని చూపిస్తుంది, ఇతర హోస్ట్ ఏదీ ఆ పూల్ను వాడటం లేదని నిర్ధారించుకున్నాక sudo zpool import -f tank ద్వారా దానిని ఓవర్రైడ్ చేయవచ్చు.
modprobe: FATAL: Module zfs not found in directory /lib/modules/6.12.0-... అనేది డెబియన్ (Debian) లో కెర్నల్ అప్గ్రేడ్ తర్వాత వస్తుంది. కొత్త కెర్నల్ కోసం DKMS బిల్డ్ కాలేదు, సాధారణంగా దానికి సరిపోయే హెడర్లు ఇన్స్టాల్ కాకపోవడమే దీనికి కారణం. dkms status కమాండ్ ఏ కెర్నల్ కోసం ఏది బిల్డ్ అయిందో చూపిస్తుంది. sudo apt install -y linux-headers-$(uname -r) ఆపై sudo dkms autoinstall కమాండ్లను వాడి దానిని రీబిల్డ్ చేయాలి, ఆ తర్వాత sudo zpool import tank పూల్ను తిరిగి తెస్తుంది.
పూల్ నిండిపోయింది కానీ మీరు ఫైళ్లను డిలీట్ చేశారు. స్నాప్షాట్ ఆ డేటాను రిఫర్ చేస్తున్నంత కాలం డిలీట్ చేసిన డేటా డిస్క్లోనే ఉంటుంది, కాబట్టి du మరియు df ఫలితాలు భిన్నంగా ఉంటాయి. zfs list -o space -r tank కమాండ్ వినియోగాన్ని USEDDS మరియు USEDSNAP గా విభజిస్తుంది, ఒకవేళ USEDSNAP ఎక్కువగా ఉంటే అదే కారణం. పాత స్నాప్షాట్లను sudo zfs destroy tank/data@2026-06-01 తో డిలీట్ చేస్తే స్థలం ఖాళీ అవుతుంది.
zpool status లో CKSUM కౌంట్ పెరుగుతోంది. ZFS కింద ఉన్న ఏదో ఒక భాగం తప్పుడు డేటాను ఇస్తోంది. మిర్రర్ (mirror) సెటప్లో ఈ కౌంట్ ఒక హెచ్చరిక మాత్రమే, ఆ బ్లాక్ ఇప్పటికే రిపేర్ చేయబడింది. సింగిల్-డిస్క్ పూల్లో అయితే ఆ ఫైల్ పోయినట్లే, zpool status -v ఆ ఫైల్ పేరును చూపిస్తుంది, మీరు ఈ పూల్లో లేని బ్యాకప్ నుండి ఆ ఒక్క ఫైల్ను పునరుద్ధరించాలి.
సర్వర్ నెమ్మదిగా ఉంది మరియు స్వాపింగ్ (swapping) జరుగుతోంది. పైన చెప్పినట్లుగా ARC పరిమితిని సెట్ చేయండి, ఆపై arc_summary రన్ చేసి హిట్ రేషియోను చూడండి. వర్కింగ్ సెట్ను ఉంచడానికి ARC సరిపోకపోతే, ప్రతి రీడ్ ఆపరేషన్ డిస్క్కు వెళ్తుంది; అటువంటి సందర్భంలో పేజ్ క్యాచీని ఉపయోగించే సాధారణ ఫైల్సిస్టమ్ మెరుగ్గా పనిచేస్తుంది.
FAQ
VPS పై ZFS కు ఎంత RAM అవసరం?
ZFS 2 GB instance పై నడుస్తుంది. అసలు ప్రశ్న మీ అప్లికేషన్ కోసం ఎంత మిగిలింది అనేది. ఎటువంటి tuning చేయకపోతే, OpenZFS 2.3 లో ARC పరిమాణం RAM లోంచి 1 GiB తీసివేసి మిగిలిన దానిలో లేదా మొత్తం RAM లో 5/8 వంతులో ఏది ఎక్కువైతే అంతకు పెరుగుతుంది. కాబట్టి 4 GB బాక్స్ 3 GiB ను cache కు కేటాయించగలదు. zfs_arc_max ను మీ workload కు సరిపోయే సంఖ్యకు సెట్ చేయండి, ఆపై /proc/spl/kstat/zfs/arcstats లోని c_max లైన్ చదవడం ద్వారా దానిని నిర్ధారించుకోండి.
ZFS snapshot ఒక backup అవుతుందా?
కాదు. Snapshot డేటా ఉన్న అదే pool లో ఉంటుంది. ఇది ఒక చెడ్డ rm మరియు విఫలమైన upgrade నుండి రక్షిస్తుంది, కానీ pool లేదా instance పోతే ఇది కూడా పోతుంది. దీనిని backup గా మార్చాలంటే zfs send ఉపయోగించి మరొక machine కు పంపండి, లేదా ఈ సర్వర్ నియంత్రణలో లేని storage కు వ్రాసే backup tool ను ఉపయోగించండి.
FreeBSD మరియు Linux లలో ZFS ఒకేలా పనిచేస్తుందా?
డిసెంబర్ 2020 లో వచ్చిన OpenZFS 2.0 నుండి codebase, commands, on-disk format అన్నీ ఒకటే, మరియు pools ను ఒకదాని నుండి మరొకదానికి మార్చుకోవచ్చు. తేడా కేవలం packaging లోనే ఉంటుంది. FreeBSD లో ZFS base system లోనే వస్తుంది. Linux లో ప్రతి distribution ఒక నిర్ణయం తీసుకుంటుంది: Ubuntu తన kernel packages లోనే module ను నిర్మిస్తుంది, కానీ Debian లో ఇది మీ machine పై DKMS ద్వారా నిర్మించబడుతుంది, కాబట్టి kernel upgrade తర్వాత rebuild పూర్తయ్యే వరకు module అందుబాటులో ఉండకపోవచ్చు.
ఒకే disk ఉన్న VPS లో ZFS corruption ను సరిచేయగలదా?
ఇది corruption ను గుర్తిస్తుంది మరియు ఫైల్ పేరును చెబుతుంది, కానీ సరిచేయలేదు, ఎందుకంటే మరమ్మత్తుకు block యొక్క రెండవ కాపీ అవసరం. Dataset పై zfs set copies=2 సెట్ చేయడం ద్వారా మీకు ఆ రెండవ కాపీ లభిస్తుంది, ఇది రెట్టింపు స్థలాన్ని తీసుకుంటుంది. ఇది bad block ను పరిష్కరిస్తుంది కానీ పోయిన volume ను కాదు. రెండు volumes మధ్య mirror ఏర్పాటు చేయడమే నిజమైన పరిష్కారం.
Compression వల్ల సర్వర్ వేగం తగ్గుతుందా?
lz4 సాధారణంగా సర్వర్ను వేగవంతం చేస్తుంది. Compressed blocks అంటే తక్కువ bytes వ్రాయడం మరియు తక్కువ bytes చదవడం అని అర్థం, మరియు ఇది ఆదా చేసే disk స్థలంతో పోలిస్తే CPU పై పడే భారం చాలా తక్కువ. pool root వద్ద compression=lz4 సెట్ చేయండి, తద్వారా ప్రతి dataset దీనిని పొందుతుంది, ఆపై అసలైన డేటా వ్రాసిన తర్వాత zfs get compressratio tank ను తనిఖీ చేయండి.