FreeBSD மற்றும் Linux-ல் ZFS: RAM பயன்பாட்டை நிர்வகிப்பது
ZFS-ல் ARC அதிக RAM-ஐ எடுத்துக்கொள்வதால் VPS-ல் ஏற்படும் சிக்கல்களைத் தவிர்க்கவும். குறைந்த மெமரி கொண்ட சர்வர்களில் 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-ஐ உருவாக்கும் முன்பே தெரிந்துகொள்வது அவசியம்.
OpenZFS: FreeBSD மற்றும் Linux-ல் ஒரே codebase, இருவேறு packaging முறைகள்
FreeBSD-ல் 2008-ல் வெளியான FreeBSD 7.0 பதிப்பிலிருந்தே ZFS அடிப்படை அமைப்பின் (base system) ஒரு பகுதியாக உள்ளது; தொடக்கத்தில் இது ஒரு சோதனை முயற்சியாகவே இருந்தது. டிசம்பர் 2020-ல் வெளியான OpenZFS 2.0 பதிப்பிற்குப் பிறகு, FreeBSD மற்றும் Linux ஆகிய இரண்டுமே ஒரே source tree-லிருந்து உருவாக்கப்படுகின்றன. எனவே, zfs மற்றும் zpool ஆகிய இரண்டும் இரண்டு தளங்களிலும் ஒரே மாதிரியாகவே செயல்படுகின்றன. ஒரு தளத்தில் உருவாக்கப்பட்ட pool-ஐ மற்றொரு தளத்தில் எளிதாக import செய்ய முடியும்.
Linux-ல் ZFS ஒரு package-ஆகவும், FreeBSD-ல் அடிப்படை அமைப்பின் ஒரு பகுதியாகவும் இருப்பதற்கு உரிமமே (licensing) காரணம். OpenZFS என்பது CDDL (common development and distribution license) உரிமத்தின் கீழ் உள்ளது. Linux kernel என்பது GPL (general public license) பதிப்பு 2-ன் கீழ் உள்ளது. Linux kernel திட்டம் இந்த இரண்டையும் ஒன்றுக்கொன்று பொருந்தாதவையாகக் கருதுவதால், ZFS குறியீடு mainline Linux-ல் இணைக்கப்படவில்லை. எனவே, ஒவ்வொரு 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 மேம்படுத்தலின் போதும் இது மீண்டும் உருவாக்கப்படும் (rebuild). உருவாக்கம் தோல்வியடைந்தால், நீங்கள் அதைச் சரிசெய்யும் வரை உங்கள் 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 கட்டளை state: ONLINE-ஐ அச்சிட வேண்டும், அதில் உங்கள் சாதனம் tank-ன் கீழ் பட்டியலிடப்பட்டிருக்க வேண்டும். ashift=12 என்பது pool-ன் மிகச்சிறிய block-ஐ 4 KiB-ஆக நிலைநிறுத்துகிறது; இது தற்போதைய SSD-களுக்குப் பொருந்தும், மேலும் உருவாக்கிய பிறகு இதை மாற்ற முடியாது.
வாடகைக்கு எடுக்கப்படும் பெரும்பாலான images ext4 root-லிருந்து boot ஆவதால், இங்கு ZFS என்பது root filesystem அல்ல, மாறாக இரண்டாவது volume-ல் உள்ள ஒரு data pool ஆகும். நீங்கள் ஒரு சாதனத்தில் pool-ஐ உருவாக்கும் முன், அது நீங்கள் நினைக்கும் சாதனம் தானா என்பதைச் சரிபார்க்கவும். ஏனெனில் உங்களுக்கு வழங்கப்பட்ட NVMe disk-ஐ உறுதிப்படுத்துவது ஒரு நிமிடம் எடுக்கும், ஆனால் தவறுதலாக அழித்துவிட்டு மீண்டும் உருவாக்குவது ஒரு மதியப் பொழுதை வீணாக்கும்.
Checksums-கள் pool-ல் redundancy இருக்கும்போது மட்டுமே சரிசெய்யும்
ZFS எழுதும் ஒவ்வொரு block-க்கும் ஒரு checksum இருக்கும், வாசிக்கும்போது அது சரிபார்க்கப்படும். பிழையைக் கண்டறிவது எப்போதும் நடக்கும். அதைச் சரிசெய்ய இரண்டாவது நகல் தேவை.
ஒரே 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 என்றால் எந்த எச்சரிக்கையும் இன்றி அந்தப் பிழையான bytes-ஐயே திருப்பித் தரும், எனவே இது ஒரு முன்னேற்றம். ZFS-ஆல் அதைச் சரிசெய்ய முடியாது, ஏனெனில் pool-ல் அதைச் சரிசெய்ய இரண்டாவது நகல் இல்லை.
Mirror அமைப்பில், அதே வாசிப்புச் செயல்பாடு நல்ல நிலையில் உள்ள disk-லிருந்து மேற்கொள்ளப்படும், பிழையான block மீண்டும் எழுதப்படும், மேலும் அந்த நிகழ்வு zpool status-ன் CKSUM column-ல் தோன்றும். இதுவே self-healing, இதற்கு இரண்டு சாதனங்கள் தேவை.
sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2ஒரு VPS-ல், 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) தனித்தனி dataset-ஐ உருவாக்கவும். பண்புகள் (properties) pool-லிருந்து கீழ்நோக்கிப் பெறப்படும் (inherit). எனவே, ஒருமுறை இயல்புநிலை அமைப்பைச் செய்துவிட்டு, தேவையான இடங்களில் மட்டும் அதை மாற்றியமைக்கலாம். FreeBSD-ல் jails பொதுவாக இவ்வாறுதான் இயக்கப்படுகின்றன; ஒவ்வொரு jail-க்கும் ஒரு dataset ஒதுக்கப்படுவதால், ஒரு குறிப்பிட்ட jail-ஐ மட்டும் தனியாக snapshot எடுத்து, தேவைப்பட்டால் பழைய நிலைக்கு மாற்ற முடியும். இதுவே jail-ஐ Docker container-லிருந்து வேறுபடுத்திக் காட்டும் அம்சங்களில் ஒன்றாகும்.
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 என்பது எச்சரிக்கை காரணமாகப் பலர் தவிர்க்கும் ஒரு பண்பு, ஆனால் இது தவறான அணுகுமுறை. lz4 குறைந்த அளவு CPU-வை மட்டுமே பயன்படுத்துகிறது, மேலும் வட்டில் (disk) எழுதப்பட வேண்டிய தரவுகளின் அளவைக் குறைக்கிறது. எனவே, சுருக்கக்கூடிய (compressible) தரவுகளில் இது பொதுவாக வாசிப்பு மற்றும் எழுதும் வேகத்தை அதிகரிக்கிறது. zstd அதிக CPU-வைப் பயன்படுத்தி தரவுகளைத் தீவிரமாகச் சுருக்கும்; இது அடிக்கடி வாசிக்கப்படாத logs மற்றும் archives-க்கு ஏற்றது. zfs get compressratio tank மூலம் உங்களுக்குக் கிடைக்கும் உண்மையான பலனைச் சரிபார்க்கவும். இந்த விகிதம் (ratio), பண்பு அமைக்கப்பட்ட பிறகு எழுதப்பட்ட தரவுகளுக்கு மட்டுமே பொருந்தும் என்பதை நினைவில் கொள்க.
recordsize என்பது ஒரு dataset எழுதும் மிகப்பெரிய block அளவு ஆகும்; இது இயல்பாக 128K என இருக்கும். ஒரு database 8 KiB பக்கங்களை 128 KiB பதிவுகளாக எழுதும்போது, ஒரு சிறிய எழுதும் செயல்பாடு, முழுப் பதிவையும் வாசித்து, மாற்றங்களைச் செய்து, மீண்டும் எழுதுவது என மாறுகிறது. தரவுகளை ஏற்றுவதற்கு முன்பே database dataset-ல் recordsize=16K-ஐ அமைக்கவும், ஏனெனில் இந்தப் பண்பு புதிதாக எழுதப்படும் தொகுதிகளுக்கு (blocks) மட்டுமே பொருந்தும்.
quota என்பது ஒரு dataset முழு pool-ஐயும் நிரப்புவதைத் தடுக்கும் வழியாகும். ZFS pool 100% நிரம்பும் நிலையில் இருந்தால், அதன் வேகம் குறைவதோடு, சுத்தம் செய்வதும் கடினமாகிவிடும். எனவே, திட்டமிட்டு இடவசதியை (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"அதன்பிறகு, இரண்டு snapshots-க்கு இடையே மாறியுள்ள தரவுகளை மட்டும் அனுப்பவும்.
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, பெறும் பக்கத்திலும் (receiving side) இருக்க வேண்டும். அது இல்லையென்றால், cannot receive incremental stream: most recent snapshot of backup/data does not match incremental source பிழையுடன் receive செயல்முறை நின்றுவிடும், ஏனெனில் மாற்றங்களைப் பயன்படுத்துவதற்கு ZFS-க்கு அடிப்படை (base) ஏதும் இருக்காது. இரு பக்கங்களிலும் உள்ள ஒரு snapshot-லிருந்து அனுப்பவும், அல்லது மீண்டும் ஒரு முழுமையான send-ஐத் தொடங்கவும்.
Remote root-ஐப் பயன்படுத்துவதற்குப் பதிலாக, இலக்கு கணினியில் (target) உரிமைகளை வழங்கவும்: sudo zfs allow -u backupuser create,mount,receive backup/data.
இது ஒரு நிபந்தனையுடன் கூடிய உண்மையான off-site backup ஆகும். இலக்கு கணினி ஒரு ZFS pool-ஆக இருக்க வேண்டும், ஏனெனில் object storage-ஆல் stream-ஐப் பெற முடியாது. உங்கள் இலக்கு S3-compatible storage அல்லது ஒரு சாதாரண Linux host ஆக இருந்தால், அதனுடன் தொடர்பு கொள்ளக்கூடிய ஒரு கருவியைப் பயன்படுத்தவும், restic backups from a VPS அந்த வழிமுறையை விளக்குகிறது.
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-ஐ அனுமதிக்கிறது. அதே box 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மூன்றாவது நெடுவரிசை (column) bytes-ஐக் குறிக்கிறது. c_max என்பது தற்போது நடைமுறையில் உள்ள உச்ச வரம்பு, size என்பது ARC தற்போது வைத்திருக்கும் அளவு.
ARC memory-ஐத் திரும்பக் கொடுக்கும். Kernel அழுத்தம் (pressure) ஏற்படும்போது ARC சுருங்கும். இதில் உள்ள சிக்கல் நேர மேலாண்மை (timing) ஆகும்; ஏனெனில் இந்தச் சுருக்கம் அழுத்தத்தால் மட்டுமே தூண்டப்படுகிறது. எனவே, ஒரு process ஒரே நேரத்தில் பல நூறு MiB-ஐக் கேட்கும்போது, ARC memory-ஐ விடுவிக்கும் முன்பே OOM (out of memory) killer அந்த process-ஐ முடித்துவிடலாம். Database மற்றும் web server இயங்கும் 2 GB box-ல் இது அரிதான நிகழ்வு அல்ல. கைமுறையாக மாற்றங்களைச் செய்வது குறித்து OpenZFS கையேடு இதையே கூறுகிறது: "memory அழுத்தம் இல்லாமல், வரம்பைக் குறைப்பது மட்டும் 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 ஆக இருக்கும். தற்போதைய மதிப்புகள் மற்றும் உங்கள் பதிப்பில் பயன்படுத்தப்படும் சரியான பெயரைப் பார்க்க sysctl vfs.zfs.arc-ஐ இயக்கவும், பிறகு அதிகபட்ச மதிப்பை /boot/loader.conf-ல் எழுதவும்.
சிறிய server-களுக்கு நினைவகம் தொடர்பான மேலும் இரண்டு விதிகள். Deduplication-ஐ off-ல் வைக்கவும், ஏனெனில் dedup table நினைவகத்தில் இருக்கும்; பொதுவாக ஒரு 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 மட்டுமே இருந்து, workload-க்கு அந்த முழு RAM-ம் தேவைப்படும்போது.
- ஒரே ஒரு virtual disk மட்டுமே இருந்து, இரண்டாவது நகல் (copy) இல்லாதபோது; ஏனெனில் ZFS-ல் பிழையைக் கண்டறிய முடியுமே தவிர, அதைச் சரிசெய்ய முடியாது.
- உங்களின் backup இலக்கு object storage அல்லது சாதாரண Linux host-ஆக இருக்கும்போது; அங்கு
zfs sendstream-ஐப் பெறக்கூடிய வசதி இருக்காது. - நீங்கள் DKMS உடன் Debian-ஐப் பயன்படுத்தும் சூழலில், kernel upgrade-க்குப் பிறகு module build ஆகாமல் போவதை உங்களால் தவிர்க்க முடியாதபோது.
- root filesystem-ல் ZFS தேவைப்படும்போது, ஆனால் service provider-ன் images-ல் ext4 மட்டுமே கிடைக்கும்போது.
உங்களிடம் தனி data volume, போதுமான RAM (8 GB அல்லது அதற்கு மேல் இருப்பது சிறந்தது), மற்றும் snapshots மற்றும் zfs send-ஐ வெறும் வசதியாக மட்டும் பயன்படுத்தாமல், ஒரு திட்டத்துடன் பயன்படுத்தும் சூழல் இருந்தால் மட்டுமே ZFS-ஐத் தொடரவும். மற்ற அனைத்து சூழல்களிலும், server-ன் கட்டுப்பாட்டில் இல்லாத storage-க்கு restic மூலம் encrypted மற்றும் deduplicated backups எடுப்பது, RAM பயன்பாடு இல்லாமலேயே அதே பலன்களை வழங்கும்.
தோல்வி முறைகள் மற்றும் நீங்கள் காணும் செய்திகள்
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-க்குத் தேவையான headers நிறுவப்படாததால், DKMS அதை build செய்யவில்லை. dkms status எந்த kernel-க்கு எது build செய்யப்பட்டுள்ளது என்பதைக் காட்டும். sudo apt install -y linux-headers-$(uname -r) மற்றும் அதைத் தொடர்ந்து sudo dkms autoinstall கட்டளைகளை இயக்கினால் அது மீண்டும் build ஆகும், பிறகு sudo zpool import tank pool-ஐ மீண்டும் கொண்டு வரும்.
Pool நிரம்பிவிட்டது, ஆனால் நீங்கள் கோப்புகளை நீக்கிவிட்டீர்கள். ஒரு snapshot அந்தத் தரவை இன்னும் வைத்திருந்தால், நீக்கப்பட்ட தரவு வட்டில் அப்படியே இருக்கும், எனவே 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 அளவுள்ள ஒரு server-ல் 3 GiB-ஐ cache-க்கு ஒதுக்க முடியும். உங்கள் பணிச்சுமைக்கு ஏற்ப 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-ல் ZFS base system-உடன் வருகிறது. Linux-ல் ஒவ்வொரு distribution-ம் ஒரு முடிவை எடுக்கிறது: Ubuntu அதன் kernel packages-ல் module-ஐ இணைத்து வழங்குகிறது, ஆனால் Debian உங்கள் machine-லேயே DKMS மூலம் அதை உருவாக்குகிறது. எனவே, kernel upgrade செய்யும்போது rebuild முடியும் வரை module கிடைக்காமல் போக வாய்ப்புள்ளது.
ஒரே disk கொண்ட VPS-ல் ZFS-ஆல் பாதிப்புகளைச் சரிசெய்ய முடியுமா?
ZFS பாதிப்பைக் கண்டறிந்து அந்த file-ன் பெயரைத் தெரிவிக்கும், ஆனால் அதைச் சரிசெய்ய முடியாது. ஏனெனில், சரிசெய்ய அந்த block-ன் இரண்டாவது நகல் தேவை. ஒரு dataset-ல் zfs set copies=2-ஐ அமைப்பதன் மூலம் அந்த இரண்டாவது நகலைப் பெறலாம், இது இருமடங்கு இடத்தை எடுத்துக்கொள்ளும். இது ஒரு மோசமான block-ஐச் சரிசெய்ய உதவும், ஆனால் முழு volume-ம் தொலைந்து போனால் உதவாது. இரண்டு volumes-க்கு இடையே mirror அமைப்பதே உண்மையான தீர்வாகும்.
Compression server-ன் வேகத்தைக் குறைக்குமா?
lz4 பொதுவாக வேகத்தை அதிகரிக்கும். தரவுகள் சுருக்கப்படுவதால், disk-ல் எழுதப்படும் மற்றும் படிக்கப்படும் bytes-ன் எண்ணிக்கை குறையும். disk-ல் சேமிக்கப்படும் இடத்தோடு ஒப்பிடும்போது, ஒரு block-க்குத் தேவைப்படும் CPU பயன்பாடு மிகக் குறைவு. pool-ன் root-ல் compression=lz4-ஐ அமைக்கவும், அப்போதுதான் அனைத்து dataset-களும் அதைத் தானாகவே பெற்றுக்கொள்ளும். உண்மையான தரவுகள் எழுதப்பட்ட பிறகு zfs get compressratio tank-ஐச் சரிபார்க்கவும்.