FreeBSD மற்றும் Linux-ல் ZFS பயன்படுத்தும் RAM அளவு
ZFS-ன் ARC உங்கள் VPS-ன் RAM-ஐ முழுமையாக ஆக்கிரமிக்கிறதா? குறைந்த அளவு மெமரி கொண்ட சர்வர்களில் ZFS-ஐ எவ்வாறு திறம்பட நிர்வகிப்பது மற்றும் அதன் உண்மையான தேவைகளை இந்த வழிகாட்டி
ZFS உங்களுக்கு வழங்குபவை மற்றும் அதற்காக நீங்கள் கொடுப்பவை
FreeBSD மற்றும் Linux-ல் உள்ள ZFS இப்போது ஒரே codebase-ஆக, அதாவது OpenZFS-ஆக உள்ளது. எனவே, இரண்டு அமைப்புகளிலும் அம்சங்கள் ஒரே மாதிரியானவை. ZFS இயங்கும் ஒரு server, checksum செய்யப்பட்ட தரவு, தரவு மாறும் வரை எந்த செலவும் இல்லாத snapshots, zfs send உடனான replication மற்றும் ஒரே property மாற்றத்தில் அமல்படுத்தக்கூடிய compression ஆகியவற்றை வழங்குகிறது. இதற்கு ஈடாக நீங்கள் கொடுப்பது memory ஆகும்: ARC (adaptive replacement cache) இயல்பாகவே அதிகப்படியான RAM-ஐ எடுத்துக்கொள்ளும். 2 GB அல்லது 4 GB VPS (virtual private server)-ல், உங்கள் application-க்குத் தேவையான அதே memory-ஐ இது எடுத்துக்கொள்ளும்.
இந்த வழிகாட்டி, நாற்பது drive bays கொண்ட storage box-ஐ அடிப்படையாகக் கொள்ளாமல், ஒன்று அல்லது இரண்டு virtual disks கொண்ட வாடகை VPS-ஐ அடிப்படையாகக் கொண்டு ZFS-ஐ மதிப்பிடுகிறது. இந்த சூழலிலும் பயனுள்ளதாக இருக்கும் அம்சங்களே உங்கள் நேரத்திற்கு தகுதியானவை. எவை பயனுள்ளதாக இருக்காது என்பதை, நீங்கள் ஒரு pool-ஐ உருவாக்கும் முன்பே தெரிந்துகொள்வது அவசியம்.
FreeBSD மற்றும் Linux-ல் OpenZFS: ஒரே codebase, இரண்டு விதமான packaging முறைகள்
FreeBSD 7.0 பதிப்பிலிருந்து, அதாவது 2008-ம் ஆண்டிலிருந்து, FreeBSD-ன் base system-ல் ZFS ஒரு experimental அம்சமாக இருந்து வருகிறது. டிசம்பர் 2020-ல் வெளியான OpenZFS 2.0 பதிப்பிற்குப் பிறகு, FreeBSD மற்றும் Linux ஆகிய இரண்டுமே ஒரே source tree-லிருந்து உருவாக்கப்படுகின்றன. எனவே, zfs மற்றும் zpool ஆகிய இரண்டும் இரண்டு தளங்களிலும் ஒரே மாதிரியாகவே செயல்படுகின்றன; ஒரு தளத்தில் உருவாக்கப்பட்ட pool-ஐ மற்றொரு தளத்தில் எளிதாக import செய்ய முடியும்.
Linux-ல் ZFS ஒரு package-ஆகவும், FreeBSD-ல் base system-ன் ஒரு பகுதியாகவும் இருப்பதற்கு உரிமமே (licensing) காரணம். OpenZFS, CDDL (common development and distribution license)-ன் கீழ் உள்ளது. Linux kernel, GPL (general public license) பதிப்பு 2-ன் கீழ் உள்ளது. Linux kernel திட்டம் இந்த இரண்டையும் ஒன்றுக்கொன்று பொருந்தாதவை எனக் கருதுவதால், ZFS code-ஐ mainline Linux-ல் இணைக்க முடியாது. எனவே, ஒவ்வொரு distribution-ம் அதை எவ்வாறு வழங்குவது என்பதைத் தீர்மானிக்கின்றன. FreeBSD-ல் இத்தகைய முரண்பாடு இல்லாததால், ZFS அங்கேயே இயல்பாகக் கிடைக்கிறது. இதுதான் நடைமுறை உண்மை: packaging-ல் மட்டுமே வித்தியாசம் உள்ளது, இதில் நீங்கள் எந்த ஒரு தரப்பையும் ஆதரிக்க வேண்டிய அவசியமில்லை.
SSD Nodes FreeBSD images-ஐ வழங்குவதில்லை, எனவே இங்கு வாடகைக்கு எடுக்கப்படும் server-களில் இந்த வழிகாட்டியின் Linux பகுதி மட்டுமே பொருந்தும். நீங்கள் வேறொரு இடத்தில் FreeBSD-ஐப் பயன்படுத்துகிறீர்கள் என்றால், a FreeBSD server-ல் ZFS எந்த ஒரு module-ஐயும் உருவாக்காமலும், kernel upgrade-ஐப் பற்றிக் கவலைப்படாமலும் நேரடியாகக் கிடைக்கும்.
ZFS-ஐ நிறுவி ஒரு pool-ஐ உருவாக்குதல்
Ubuntu-வில் kernel தொகுப்புகளிலேயே இந்த module இருப்பதால், நீங்கள் கட்டளைகளை (commands) மட்டும் நிறுவினால் போதும்.
sudo apt update
sudo apt install -y zfsutils-linux
zfs versionzfs version இரண்டு வரிகளை அச்சிடும்: ஒன்று userland பதிப்பு, மற்றொன்று kernel module பதிப்பு. ஒரே ஒரு வரி மட்டும் வந்தால், module load ஆகவில்லை என்று அர்த்தம். இந்தத் தொகுப்பு universe component-ல் உள்ளது; Ubuntu server images-ல் இது முன்னிருப்பாகவே (default) இயக்கப்பட்டிருக்கும். ஒருவேளை apt-ஆல் இதைக் கண்டறிய முடியவில்லை என்றால், முதலில் sudo add-apt-repository universe கட்டளையை இயக்கவும்.
Debian-ல் இந்தத் தொகுப்புகள் contrib component-ல் உள்ளன. உங்கள் கணினியில் DKMS (dynamic kernel module support) மூலம் module உருவாக்கப்படும். /etc/apt/sources.list.d/debian.sources கோப்பில் உள்ள Components: வரியில் contrib-ஐச் சேர்த்து, sudo apt update கட்டளையை இயக்கி, பின்வருவனவற்றைச் செய்யவும்:
sudo apt install -y linux-headers-$(dpkg --print-architecture) zfs-dkms zfsutils-linuxஇந்த நிறுவல் module-ஐ compile செய்து Building initial module for 6.12.0-...-ஐ அச்சிடும்; இதற்குச் சில நிமிடங்கள் ஆகும். இதை நினைவில் கொள்ளவும்: ஒவ்வொரு kernel மேம்படுத்தலின் போதும் இது மீண்டும் உருவாக்கப்படும். ஏதேனும் ஒரு build தோல்வியடைந்தால், நீங்கள் அதைச் சரிசெய்யும் வரை உங்கள் pool import செய்யப்படாது.
FreeBSD-ல் எதையும் நிறுவ வேண்டியதில்லை. சேவையை (service) enable செய்து தொடங்கவும்.
sysrc zfs_enable=YES
service zfs startஇப்போது pool-ஐ உருவாக்கலாம். முதலில் நிலையான device paths-ஐப் பார்க்கவும், ஏனெனில் /dev/vdb கண்டறியப்படும் வரிசையின் அடிப்படையில் ஒதுக்கப்படுவதால், மற்றொரு volume-ஐ இணைக்கும்போது அது மாறக்கூடும்.
ls -l /dev/disk/by-id/
sudo zpool create -o ashift=12 tank /dev/disk/by-id/virtio-abc123def456
zpool status tankzpool status கட்டளையானது tank-ன் கீழ் உங்கள் device பட்டியலிடப்பட்ட நிலையில் state: ONLINE-ஐ அச்சிட வேண்டும். ashift=12 என்பது pool-ன் மிகச்சிறிய block அளவை 4 KiB-ஆக நிர்ணயிக்கிறது; இது தற்போதைய SSD-களுக்குப் பொருந்தும் மற்றும் உருவாக்கிய பிறகு இதை மாற்ற முடியாது.
பெரும்பாலான வாடகை images ext4 root-லிருந்து boot ஆவதால், இங்கு ZFS என்பது root filesystem-ஆக இல்லாமல், இரண்டாவது volume-ல் உள்ள ஒரு data pool-ஆக இருக்கும். நீங்கள் pool-ஐ உருவாக்கும் முன், அது சரியான device தானா என்பதை உறுதிப்படுத்தவும். ஏனெனில் உங்களுக்கு வழங்கப்பட்ட NVMe disk-ஐ உறுதிப்படுத்துவது ஒரு நிமிடம் எடுக்கும், ஆனால் தவறுதலாக அழித்துவிட்டு மீண்டும் உருவாக்குவது ஒரு மதியப் பொழுதை வீணாக்கும்.
Checksums, pool-ல் redundancy இருந்தால் மட்டுமே சரிசெய்யப்படும்
ZFS எழுதும் ஒவ்வொரு block-க்கும் ஒரு checksum இருக்கும், வாசிக்கும்போது அது சரிபார்க்கப்படும். பிழையைக் கண்டறிவது எப்போதும் நடக்கும். ஆனால், அதைச் சரிசெய்ய இரண்டாவது நகல் (copy) தேவை.
ஒரே ஒரு disk கொண்ட 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 போன்ற கோப்பு முறைமைகள் பிழையான தரவுகளை எந்த எச்சரிக்கையும் இன்றி வழங்கும், எனவே ZFS-ன் இந்தச் செயல் பயனுள்ளது. இருப்பினும், pool-ல் இரண்டாவது நகல் இல்லாததால் ZFS-ஆல் அதைச் சரிசெய்ய முடியாது.
Mirror அமைப்பில், அதே வாசிப்புச் செயல்பாடு சரியான நகல் உள்ள பக்கத்திலிருந்து மேற்கொள்ளப்படும், பிழையான block மீண்டும் எழுதப்படும், மேலும் அந்த நிகழ்வு zpool status-ன் CKSUM பகுதியில் பதிவாகும். இதுவே self-healing எனப்படும், இதற்கு இரண்டு சாதனங்கள் தேவை.
sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2VPS-ல், host storage பொதுவாகவே redundant ஆக இருக்கும், பெரும்பாலும் hypervisor-க்கு அடியில் RAID 10 பயன்படுத்தப்படும். இது disk செயலிழப்பிலிருந்து உங்களைப் பாதுகாக்கும். ஆனால், ஒரு block தவறாகத் திரும்பும்போது அது உங்களுக்குத் தெரியாது, ஏனெனில் எந்த நகல் சரியானது என்று அந்த array-க்குத் தெரியாது. ZFS-க்கு அது தெரியும், ஏனெனில் அது தான் எழுதிய checksum-உடன் தரவை ஒப்பிட்டுப் பார்க்கும்.
உங்களிடம் ஒரே ஒரு virtual disk இருந்து, உங்களுக்குச் சரிசெய்யும் திறன் தேவைப்பட்டால், sudo zfs set copies=2 tank/important அந்த dataset-ன் ஒவ்வொரு block-க்கும் இரண்டு நகல்களை அதே disk-ல் சேமிக்கும். இது அந்த dataset பயன்படுத்தும் இடத்தைப் பாதியாகக் குறைக்கும் (இரட்டிப்பாக்கும்), ஒரு bad block-ஐத் தாங்கும், ஆனால் முழு volume-ம் செயலிழந்தால் இது உதவாது.
Scrub செயல்பாடு pool-ல் உள்ள அனைத்தையும் வாசித்துச் சரிபார்க்கும்.
sudo zpool scrub tank
zpool status tankஆரோக்கியமான pool, scan: scrub repaired 0B in 00:04:11 with 0 errors போன்ற ஒரு வரியுடன் முடிவடையும். இதை ஒரு கால அட்டவணையில் (schedule) வைக்கவும்; சிறிய pool-களுக்கு மாதமொருமுறை செய்வது போதுமானது.
systemctl list-unit-files 'zfs-scrub*'
sudo systemctl enable --now zfs-scrub-monthly@tank.timerDatasets என்பது கொள்கையின் அடிப்படை அலகு
Dataset என்பது pool-க்குள் இருக்கும் ஒரு filesystem ஆகும். இதை உருவாக்குவது எளிதானது என்பதால், ஒவ்வொரு பணிக்கும் (job) தனித்தனியாக உருவாக்கவும். 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-வை மட்டுமே பயன்படுத்துகிறது, மேலும் வட்டுக்குச் செல்ல வேண்டிய தரவின் அளவைக் குறைக்கிறது. எனவே, சுருக்கக்கூடிய (compressible) தரவுகளில் இது பொதுவாக வாசிப்பு மற்றும் எழுதும் வேகத்தை அதிகரிக்கிறது. zstd அதிக CPU-வைப் பயன்படுத்தித் தரவைச் சிறப்பாகச் சுருக்கும்; இது அடிக்கடி வாசிக்கப்படாத logs மற்றும் archives-க்கு ஏற்றது. zfs get compressratio tank மூலம் உங்களுக்குக் கிடைக்கும் பலனைச் சரிபார்க்கவும். இந்த விகிதம் (ratio), property அமைக்கப்பட்ட பிறகு எழுதப்பட்ட தரவுகளுக்கு மட்டுமே பொருந்தும் என்பதை நினைவில் கொள்ளவும்.
recordsize என்பது ஒரு dataset எழுதும் மிகப்பெரிய block அளவு ஆகும், இது default-ஆக 128K என இருக்கும். ஒரு database 8 KiB பக்கங்களை 128 KiB records-ஆக எழுதும்போது, ஒரு சிறிய எழுதும் செயல்பாடு, முழு record-ஐயும் வாசித்து, மாற்றங்களைச் செய்து, மீண்டும் எழுதுவதாக மாறுகிறது. தரவை ஏற்றுவதற்கு முன்பே database dataset-ல் recordsize=16K-ஐ அமைக்கவும், ஏனெனில் இந்த property புதிதாக எழுதப்படும் blocks-க்கு மட்டுமே பொருந்தும்.
quota என்பது ஒரு dataset முழு pool-ஐயும் நிரப்புவதைத் தடுக்கும் வழியாகும். 100% நிரம்பிய ZFS pool மெதுவாகச் செயல்படும் மற்றும் அதைச் சுத்தம் செய்வது கடினம். எனவே, திட்டமிட்டுச் சிறிது இடவசதியை (headroom) காலியாக விடவும்.
தரவு மாறாதவரை Snapshots-க்கு கட்டணம் ஏதுமில்லை
ZFS ஒருபோதும் நேரலையில் உள்ள block-ஐ மேலெழுதாது (overwrite). இது ஒரு புதிய block-ஐ எழுதிவிட்டு, pointers-ஐப் புதுப்பிக்கும்; இதுவே copy-on-write என்பதன் பொருள். ஒரு snapshot என்பது "இந்த dataset தற்போது சுட்டிக்காட்டும் block-களை அப்படியே வைத்திரு" என்று கூறும் ஒரு குறிப்பு மட்டுமே; எனவே, இதை எடுப்பது உடனடியானது மற்றும் இலவசமானது.
sudo zfs snapshot tank/data@2026-08-11
zfs list -t snapshot -o name,used,refer -r tank/dataஒரு snapshot-க்கான USED நெடுவரிசை, அந்த snapshot-ஆல் மட்டுமே தக்கவைக்கப்பட்டுள்ள இடத்தைக் குறிக்கும். இது பூஜ்ஜியத்திற்கு அருகிலேயே தொடங்கும், நீங்கள் தரவை மாற்றும்போதோ அல்லது நீக்கும்போதோ இது வளரும், ஏனெனில் பழைய block-களை இனி விடுவிக்க முடியாது.
ஒரு கோப்பை மீட்டெடுக்க (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 recovery path-க்குத் தள்ளிவிடும், இது disk-ஐ unmount செய்வதில் தொடங்கி மேலும் சிக்கலாகிவிடும்.
Rollback செய்வது, snapshot எடுக்கப்பட்டதிலிருந்து எழுதப்பட்ட அனைத்தையும் நீக்கிவிடும்.
sudo zfs rollback tank/data@2026-08-11புதிய snapshots இருக்கும்போது இது rollback-ஐ மறுக்கும், மேலும் -r அந்தப் புதிய snapshots-ஐ அழித்துவிட்டுச் செயல்படும். நீங்கள் enter அழுத்துவதற்கு முன் dataset பெயரை இருமுறை சரிபார்க்கவும்.
Snapshot என்பது ஒரு backup அல்ல. இது அதே pool-ல், அதே volume-ல், அதே server-ல் இருக்கும். ஒரு volume செயலிழந்தாலோ அல்லது zpool destroy ஏற்பட்டாலோ, தரவுகளுடன் சேர்த்து snapshots-ம் அழிந்துவிடும். Snapshots உங்களை உங்கள் சொந்த rm மற்றும் தவறான upgrade-லிருந்து பாதுகாக்கும், இது பல நிஜ காலச் சிக்கல்களைத் தீர்க்கும், ஆனால் pool-க்கே ஏற்படும் பாதிப்புகளிலிருந்து இது எதையும் பாதுகாக்காது. இதற்கான முழுமையான விளக்கம் இங்கே உள்ளது: ஏன் ஒரு VPS snapshot என்பது backup அல்ல.
அனுப்புதல் மற்றும் பெறுதல்: ஒரே கட்டளையில் replication
zfs send ஒரு snapshot-ஐ standard output-ல் byte stream-ஆக மாற்றுகிறது, zfs receive அந்த stream-ஐ மீண்டும் ஒரு dataset-ஆக மாற்றுகிறது. முதல் நகல் ஒரு முழுமையான 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"அதன்பிறகு, இரண்டு snapshot-களுக்கு இடையே மாறியுள்ள தரவுகளை மட்டும் அனுப்பவும்.
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"நீங்கள் அனுப்பும் snapshot-ஐ பெறுபவர் தரப்பில் ஏற்கனவே வைத்திருக்க வேண்டும். அது இல்லாதபோது, cannot receive incremental stream: most recent snapshot of backup/data does not match incremental source பிழையுடன் பெறுதல் நின்றுவிடும், ஏனெனில் மாற்றங்களைச் செய்வதற்கு ZFS-க்கு அடிப்படை (base) எதுவும் இருக்காது. இரு தரப்பிலும் உள்ள ஒரு snapshot-லிருந்து அனுப்பவும், அல்லது மீண்டும் ஒரு முழுமையான send-ஐத் தொடங்கவும்.
Remote root-ஐப் பயன்படுத்துவதற்குப் பதிலாக இலக்குத் தரப்பில் உரிமைகளை வழங்கவும்: sudo zfs allow -u backupuser create,mount,receive backup/data.
இது ஒரு உண்மையான off-site backup ஆகும், ஆனால் ஒரு நிபந்தனை உண்டு. இலக்குத் தரப்பு ஒரு ZFS pool-ஆக இருக்க வேண்டும், ஏனெனில் object storage-ஆல் ஒரு stream-ஐப் பெற முடியாது. உங்கள் இலக்கு S3-compatible storage அல்லது ஒரு சாதாரண Linux host ஆக இருந்தால், அதனுடன் தொடர்பு கொள்ளக்கூடிய ஒரு கருவியைப் பயன்படுத்தவும், VPS-லிருந்து restic backups அந்த வழியை விளக்குகிறது.
ZFS ஏன் அதிக RAM-ஐப் பயன்படுத்துகிறது? ARC
ARC (adaptive replacement cache) என்பது ZFS-ன் read cache ஆகும். இது சாதாரண Linux page cache-ல் இல்லாமல் kernel memory-ல் அமைகிறது, எனவே free -h இதை buff/cache-ன் கீழ் காட்டாது. இது பயன்பாட்டில் உள்ள memory-ஆகவே கணக்கிடப்படும். ZFS server-ன் memory முழுமையாக நிரம்பியது போலத் தெரிந்தால், பெரும்பாலும் அதன் cache சூடாக (warm) உள்ளது என்று அர்த்தம்; "ZFS எனது RAM-ஐ விழுங்கிவிட்டது" என்ற புகார்களுக்கு இதுவே முக்கிய காரணம்.
இயல்புநிலை வரம்பு (default limit) வேண்டுமென்றே தாராளமாக அமைக்கப்பட்டுள்ளது. 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
}
]இந்த எண்கள் பொதுவான instance அளவுகளுக்குக் கொடுக்கப்பட்ட இயல்புநிலை விதிகளே தவிர, இயங்கும் server-லிருந்து எடுக்கப்பட்ட அளவீடுகள் அல்ல. 4 GB instance-ல், 2.3 விதி 3 GiB ARC-ஐ அனுமதிக்கிறது. அதே 2.2 பதிப்பில் இது 2 GiB-ஆகக் குறையும். 2 GB instance-ல் 2.3 விதியின்படி 1.25 GiB அனுமதிக்கப்படுகிறது. மீதமுள்ள memory மட்டுமே உங்கள் application-க்குக் கிடைக்கும்.
அட்டவணையை நம்புவதற்குப் பதிலாக, உங்கள் server-லிருந்து உண்மையான எண்களைப் பார்க்கவும்:
grep -E '^(size|c_max) ' /proc/spl/kstat/zfs/arcstats
arc_summary | head -n 20மூன்றாவது நெடுவரிசை bytes-ல் உள்ளது. c_max என்பது தற்போது நடைமுறையில் உள்ள உச்ச வரம்பு, size என்பது ARC தற்போது வைத்துள்ள அளவு.
ARC memory-ஐத் திரும்பக் கொடுக்கும். Kernel அழுத்தம் (pressure) ஏற்படும்போது ARC சுருங்கும். இதில் உள்ள சிக்கல் நேர மேலாண்மைதான்; அழுத்தம் ஏற்படும்போதுதான் சுருங்குதல் நடக்கும் என்பதால், ஒரே நேரத்தில் பல நூறு MiB-ஐக் கோரும் ஒரு process, ARC memory-ஐ விடுவிக்கும் முன்பே OOM (out of memory) killer-ஆல் நிறுத்தப்படலாம். 2 GB அளவுள்ள server-ல் database மற்றும் web server இயங்கும்போது, இது அரிதான நிகழ்வு அல்ல. கையேடு மாற்றங்கள் குறித்து OpenZFS கையேடு இதையே கூறுகிறது: வரம்பைக் குறைப்பது "அழுத்தம் இல்லாமல் ARC-ஐச் சுருங்கச் செய்யாது".
சிறிய VPS-ல் ARC-ஐ எவ்வாறு கட்டுப்படுத்துவது
முதலில் workload-க்குத் தேவையான நினைவகத்தை (memory) முடிவு செய்யுங்கள். Database மற்றும் application-க்குத் தேவையானவற்றைத் கூட்டிக்கொண்டு, operating system-க்காக ஒரு பகுதியை ஒதுக்கிவிட்டு, மீதமுள்ளதை ARC-க்கு வழங்கவும். Postgres மற்றும் ஒரு web application இயங்கும் 4 GB instance-ல், 512 MiB முதல் 1 GiB வரையிலான ARC ஒரு சரியான தொடக்க புள்ளியாக இருக்கும்.
இதை bytes-ல் அமைக்கவும். இது 1 GiB-க்கான அளவு.
echo 1073741824 | sudo tee /sys/module/zfs/parameters/zfs_arc_maxReboot செய்த பிறகும் இது நீடிக்கச் செய்யவும்.
echo 'options zfs zfs_arc_max=1073741824' | sudo tee /etc/modprobe.d/zfs.conf
sudo update-initramfs -uInitramfs படிநிலை முக்கியமானது, ஏனெனில் root filesystem mount செய்யப்படுவதற்கு முன்பே module initramfs-லிருந்து load ஆகலாம்; அப்போது நீங்கள் உருவாக்கிய கோப்பை அது படிக்காது. Reboot செய்த பிறகு, c_max வரியைப் பயன்படுத்தி arcstats மூலம் உறுதிப்படுத்தவும்.
Manual-ல் குறிப்பிடப்பட்டுள்ள இரண்டு எச்சரிக்கைகள்: சிஸ்டம் இயங்கும்போது மதிப்பை மீண்டும் 0-க்கு மாற்ற முடியாது, எனவே இதை நீக்க வேண்டுமெனில் கோப்பைத் திருத்திவிட்டு reboot செய்ய வேண்டும். மேலும், மதிப்பைக்குறைப்பது ஏற்கனவே பெரியதாக உள்ள ARC-ஐ உடனடியாகச் சுருக்காது.
FreeBSD-ல் இதே வரம்பு vfs.zfs.arc-ன் கீழ் ஒரு sysctl ஆகும். தற்போதைய மதிப்புகளையும் உங்கள் version-ல் உள்ள சரியான பெயரையும் காண sysctl vfs.zfs.arc-ஐ இயக்கவும், பின்னர் அதிகபட்ச மதிப்பை /boot/loader.conf-ல் எழுதவும்.
சிறிய server-களுக்கு நினைவகம் தொடர்பான மேலும் இரண்டு விதிகள். Deduplication-ஐ off நிலையில் வைக்கவும், ஏனெனில் dedup table நினைவகத்தில் இருக்கும்; பொதுவாக 1 TB தனித்துவமான தரவிற்கு 1 முதல் 3 GB RAM தேவைப்படும். மேலும், swap-ஐ zvol-ல் (pool-லிருந்து பிரிக்கப்பட்ட block device) வைக்க வேண்டாம், ஏனெனில் நினைவகத்தை விடுவிக்க முயற்சிக்கும் filesystem வழியாக swap செய்வது கணினியை deadlock நிலைக்குத் தள்ளக்கூடும். Swap-ஐ ஒரு சாதாரண partition-ல் அல்லது pool-க்கு வெளியே உள்ள swap file-ல் வைத்திருக்கவும்.
ext4 அல்லது XFS மற்றும் restic சிறந்த தீர்வாக இருக்கும் சூழல்கள்
அதிகப்படியான RAM மற்றும் இரண்டாவது volume கொண்ட server-களில் மட்டுமே ZFS பயனுள்ளதாக இருக்கும். மற்ற சூழல்களில், சாதாரண filesystem மற்றும் முறையான backup கருவியே சிறந்தது. பின்வரும் சூழல்களில் ext4 அல்லது XFS-ஐத் தேர்ந்தெடுக்கவும்:
- instance-ல் 2 GB அல்லது 4 GB RAM மட்டுமே இருந்து, அந்த முழு நினைவகமும் பயன்பாட்டிற்குத் தேவைப்படும்போது.
- ஒரே ஒரு virtual disk மட்டுமே இருந்து, இரண்டாவது நகல் இல்லாதபோது (ZFS-ல் பிழையைக் கண்டறிய முடியுமே தவிர, அதைச் சரிசெய்ய முடியாது).
- உங்கள் backup இலக்கு 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-ஐ முறையாகப் பயன்படுத்தும் திட்டம் உங்களிடம் இருந்தால் மட்டுமே ZFS-ஐத் தொடரவும். மற்ற அனைத்து சூழல்களிலும், server-ன் கட்டுப்பாட்டில் இல்லாத storage-க்கு restic மூலம் குறியாக்கம் செய்யப்பட்ட (encrypted) மற்றும் deduplicated செய்யப்பட்ட backup-களை எடுப்பது, நினைவகத்தை வீணாக்காமல் அதே பாதுகாப்பை வழங்குகிறது.
தோல்வி முறைகள் மற்றும் நீங்கள் காணும் செய்திகள்
Reboot செய்த பிறகு pool காணவில்லை. zpool status கட்டளை no pools available-ஐ அச்சிடும். Import service /etc/zfs/zpool.cache கோப்பை வாசிக்கும், எனவே அந்த கோப்பில் இல்லாத pool boot-ன் போது import செய்யப்படாது. sudo zpool import எவை import செய்யக்கூடியவை என்பதைக் காட்டும், sudo zpool import tank அதை மீண்டும் கொண்டுவரும், மேலும் sudo zpool set cachefile=/etc/zfs/zpool.cache tank அதை நிரந்தரமாக்கும். மற்றொரு system-லிருந்து முறையாக export செய்யப்படாத pool cannot import 'tank': pool may be in use from other system என்ற செய்தியைக் காட்டும், வேறு எந்த host-லும் அது இல்லை என்பதை உறுதிப்படுத்திய பின் sudo zpool import -f tank அதை மீற (override) உதவும்.
Debian-ல் kernel upgrade செய்த பிறகு modprobe: FATAL: Module zfs not found in directory /lib/modules/6.12.0-.... புதிய kernel-க்கு DKMS build ஆகவில்லை; பெரும்பாலும் அதற்கான headers நிறுவப்படாததே இதற்குக் காரணம். dkms status எந்த kernel-க்கு எது build செய்யப்பட்டுள்ளது என்பதைக் காட்டும். sudo apt install -y linux-headers-$(uname -r) மற்றும் அதைத் தொடர்ந்து sudo dkms autoinstall அதை மீண்டும் build செய்யும், பின் sudo zpool import tank pool-ஐ மீண்டும் கொண்டுவரும்.
Pool நிரம்பிவிட்டது, ஆனால் நீங்கள் கோப்புகளை நீக்கிவிட்டீர்கள். Snapshot ஒன்று தரவை வைத்திருக்கும் வரை, நீக்கப்பட்ட தரவு வட்டில் (disk) அப்படியே இருக்கும், எனவே du மற்றும் df ஆகியவற்றுக்கு இடையே முரண்பாடு இருக்கும். zfs list -o space -r tank பயன்பாட்டை USEDDS மற்றும் USEDSNAP எனப் பிரிக்கும்; அதிகப்படியான USEDSNAP இருப்பதே இதற்கான காரணம். sudo zfs destroy tank/data@2026-06-01 மூலம் பழைய snapshot-களை அழித்தால், இடம் மீண்டும் கிடைக்கும்.
zpool status-ல் CKSUM எண்ணிக்கை உயர்கிறது. ZFS-க்கு கீழே ஏதோ ஒன்று தவறான தரவை வழங்குகிறது. Mirror அமைப்பில், இந்த எண்ணிக்கை ஒரு எச்சரிக்கை மட்டுமே, அந்த block சரிசெய்யப்பட்டுவிட்டது. ஒற்றை வட்டு (single-disk) pool-ல் அந்த கோப்பு இழக்கப்பட்டுவிட்டது; zpool status -v அந்த கோப்பின் பெயரைத் தெரிவிக்கும், இந்த pool-ல் இல்லாத ஒரு backup-லிருந்து அந்த ஒரு கோப்பை மட்டும் நீங்கள் restore செய்ய வேண்டும்.
Server மெதுவாக உள்ளது மற்றும் swapping செய்கிறது. மேலே குறிப்பிட்டபடி ARC-ஐக் கட்டுப்படுத்துங்கள், பின் arc_summary-ஐ இயக்கி hit ratio-வைப் பாருங்கள். Working set-ஐ வைத்திருக்க முடியாத அளவுக்கு ARC சிறியதாக இருந்தால், ஒவ்வொரு வாசிப்பும் (read) வட்டுக்குச் செல்லும். அந்த நிலையில், page cache-ஐப் பயன்படுத்தும் சாதாரண filesystem உங்களுக்குச் சிறப்பாகச் செயல்படும்.
FAQ
VPS-ல் ZFS இயங்க எவ்வளவு RAM தேவை?
ZFS 2 GB அளவுள்ள instance-ல் இயங்கும். உங்கள் application-க்கு எவ்வளவு RAM மீதமுள்ளது என்பதே முக்கியமான கேள்வி. எந்த மாற்றமும் செய்யப்படாவிட்டால், OpenZFS 2.3-ன் ARC, RAM-லிருந்து 1 GiB கழித்தது அல்லது மொத்த RAM-ல் 5/8 பங்கு இதில் எது அதிகமோ அந்த அளவிற்கு வளரும். எனவே, 4 GB அளவுள்ள ஒரு box 3 GiB-ஐ cache-க்கு ஒதுக்கலாம். உங்கள் workload-க்குத் தேவையான அளவை zfs_arc_max-ல் அமைக்கவும், பின் /proc/spl/kstat/zfs/arcstats-ல் உள்ள c_max வரியைப் படித்து அதை உறுதிப்படுத்தவும்.
ZFS snapshot என்பது ஒரு backup-ஆ?
இல்லை. Snapshot என்பது தரவு இருக்கும் அதே pool-ல் தான் சேமிக்கப்படும். இது ஒரு மோசமான rm மற்றும் தோல்வியுற்ற upgrade-லிருந்து தப்பிக்கும், ஆனால் pool அல்லது instance அழிந்தால் snapshot-ம் அழிந்துவிடும். இதை ஒரு backup-ஆக மாற்ற, zfs send மூலம் மற்றொரு machine-க்கு அனுப்பவும் அல்லது இந்த server-ன் கட்டுப்பாட்டில் இல்லாத storage-ல் எழுதும் ஒரு backup கருவியைப் பயன்படுத்தவும்.
FreeBSD மற்றும் Linux-ல் ZFS ஒரே மாதிரியாகச் செயல்படுமா?
டிசம்பர் 2020-ல் வெளியான OpenZFS 2.0 முதல் ஒரே codebase, ஒரே commands, ஒரே on-disk format ஆகியவற்றைக் கொண்டுள்ளன, மேலும் pools-ஐ அவற்றுக்கிடையே மாற்றிக்கொள்ளலாம். வித்தியாசம் packaging-ல் மட்டுமே உள்ளது. FreeBSD-ன் base system-ல் ZFS உள்ளடங்கியிருக்கும். Linux-ல் ஒவ்வொரு distribution-ம் ஒரு முடிவை எடுக்கிறது: Ubuntu அதன் kernel packages-ல் module-ஐ இணைத்து வழங்குகிறது, ஆனால் Debian உங்கள் machine-லேயே DKMS மூலம் அதை உருவாக்குகிறது. எனவே, kernel upgrade-ன் போது rebuild வெற்றிபெறும் வரை module கிடைக்காமல் போக வாய்ப்புள்ளது.
ஒரே disk கொண்ட VPS-ல் ZFS-ஆல் சிதைவுகளை (corruption) சரிசெய்ய முடியுமா?
இது சிதைவைக் கண்டறிந்து அந்த file-ன் பெயரைத் தெரிவிக்கும், ஆனால் அதைச் சரிசெய்ய முடியாது. ஏனெனில், சரிசெய்ய அந்த block-ன் இரண்டாவது நகல் தேவை. ஒரு dataset-ல் zfs set copies=2-ஐ அமைத்தால், அது இரண்டாவது நகலை இரட்டிப்பு இடத்தில் சேமிக்கும். இது ஒரு மோசமான block-ஐச் சமாளிக்கும், ஆனால் முழு volume-ம் அழிந்தால் உதவாது. இரண்டு volumes-க்கு இடையே mirror அமைப்பதே உண்மையான தீர்வாகும்.
Compression server-ன் வேகத்தைக் குறைக்குமா?
lz4 பொதுவாக server-ன் வேகத்தை அதிகரிக்கும். Compressed blocks என்றால் குறைவான bytes-களே எழுதப்படும் மற்றும் படிக்கப்படும். disk-ல் சேமிக்கப்படும் இடத்தோடு ஒப்பிடும்போது, ஒரு block-க்கான CPU செலவு மிகக் குறைவு. pool root-ல் compression=lz4-ஐ அமைக்கவும், இதன் மூலம் அனைத்து dataset-களும் அதைத் தொடர்ந்து பயன்படுத்தும். உண்மையான தரவுகள் எழுதப்பட்ட பிறகு zfs get compressratio tank-ஐச் சரிபார்க்கவும்.