ZFS-এর RAM খরচ: FreeBSD ও Linux VPS-এ কী জানবেন
ZFS-এর checksummed data, snapshot ও replication-এর সুবিধার সঙ্গে ARC RAM-এর বড় অংশ নেয়। 2 GB বা 4 GB VPS-এ এই খরচ কীভাবে বিচার করবেন, জানুন।
ZFS আপনাকে কী দেয় এবং এর জন্য কী প্রয়োজন
FreeBSD ও Linux-এ ZFS এখন একই codebase, OpenZFS ব্যবহার করে। তাই দুই সিস্টেমেই feature একই। ZFS-চালিত সার্ভারে checksummed data, data পরিবর্তন না হওয়া পর্যন্ত কোনো অতিরিক্ত storage cost ছাড়াই snapshot, zfs send দিয়ে replication এবং একটি property পরিবর্তন করেই compression পাওয়া যায়। এর জন্য প্রধানত memory প্রয়োজন। ARC (adaptive replacement cache) ডিফল্টভাবে RAM-এর একটি বড় অংশ ব্যবহার করে। 2 GB বা 4 GB VPS (virtual private server)-এ এই memory-ই আপনার application-এর প্রয়োজন হতে পারে।
এই guide-এ ZFS-কে একটি rented VPS-এ বিচার করা হয়েছে, যেখানে একটি বা দুটি virtual disk আছে। চল্লিশটি drive bay-সহ storage box বিবেচনা করা হয়নি। VPS পরিবেশেও যেসব feature কার্যকর থাকে, সেগুলোই আপনার সময় দেওয়ার মতো। যেসব feature এই পরিবেশে কার্যকর থাকে না, pool তৈরি করার আগে সেগুলো জানা দরকার।
FreeBSD ও Linux-এ OpenZFS: একটি codebase, দুটি packaging পদ্ধতি
FreeBSD 2008 সালে FreeBSD 7.0 থেকে base system-এর অংশ হিসেবে ZFS সরবরাহ করছে। শুরুতে এটি experimental feature ছিল। December 2020-এ OpenZFS 2.0 প্রকাশের পর FreeBSD এবং Linux একই source tree থেকে build হয়। তাই zfs এবং zpool উভয় প্ল্যাটফর্মেই একইভাবে কাজ করে, এবং একটিতে তৈরি pool অন্যটিতে import করা যায়।
Linux-এ ZFS একটি package, কিন্তু FreeBSD-তে এটি base system-এর অংশ—এর কারণ licensing। OpenZFS CDDL (common development and distribution license)-এর অধীনে রয়েছে। Linux kernel GPL (general public license) version 2-এর অধীনে রয়েছে। Kernel project এই দুটি license-কে অসামঞ্জস্যপূর্ণ হিসেবে বিবেচনা করে। তাই ZFS code mainline Linux-এ merge করা হয়নি, এবং প্রতিটি distribution এটি কীভাবে সরবরাহ করবে তা নিজেই নির্ধারণ করে। FreeBSD-তে এমন কোনো conflict নেই, তাই ZFS সরাসরি system-এ থাকে। ব্যবহারিক দিক থেকে এটাই পুরো বিষয়: packaging-এর একটি পার্থক্য, এবং এ নিয়ে আপনাকে কোনো পক্ষ নিতে হবে না।
SSD Nodes FreeBSD image সরবরাহ করে না। তাই এখানে ভাড়া নেওয়া server-এ এই guide-এর Linux অংশ প্রযোজ্য। অন্য কোথাও FreeBSD চালালে, একটি FreeBSD server-এ কোনো module build না করেই এবং kernel upgrade-এর সঙ্গে সামঞ্জস্য বজায় রাখার অতিরিক্ত ব্যবস্থা ছাড়াই ZFS পাওয়া যায়।
ZFS ইনস্টল করে একটি pool তৈরি করুন
Ubuntu-তে module-টি kernel package-এর মধ্যেই থাকে, তাই শুধু command-গুলো ইনস্টল করতে হবে।
sudo apt update
sudo apt install -y zfsutils-linux
zfs versionzfs version দুটি line দেখায়: userland version এবং kernel module version। শুধু একটি line দেখা গেলে module load হয়নি। Package-টি universe component-এ থাকে। Ubuntu server image-এ এটি defaultভাবে enabled থাকে। apt এটি খুঁজে না পেলে আগে sudo add-apt-repository universe চালান।
Debian-এ package-গুলো contrib component-এ থাকে। DKMS (dynamic kernel module support) আপনার machine-এ module build করে। /etc/apt/sources.list.d/debian.sources-এর Components: line-এ 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 upgrade-এর পর module আবার build হবে। Build ব্যর্থ হলে সমস্যা ঠিক না করা পর্যন্ত আপনার pool import হবে না।
FreeBSD-তে কিছুই ইনস্টল করা থাকে না। Service-টি enable করে start করুন।
sysrc zfs_enable=YES
service zfs startএবার pool তৈরি করুন। প্রথমে স্থিতিশীল device path দেখুন। কারণ /dev/vdb detection order অনুযায়ী device path নির্ধারণ করে। আপনি আরেকটি volume সংযুক্ত করলে এই path পরিবর্তিত হতে পারে।
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-এর অধীনে আপনার device তালিকাভুক্ত থাকবে। ashift=12 pool-এর সর্বনিম্ন block size 4 KiB নির্ধারণ করে। এটি বর্তমান SSD-এর সঙ্গে সামঞ্জস্যপূর্ণ এবং pool তৈরির পরে পরিবর্তন করা যায় না।
বেশিরভাগ rented image ext4 root থেকে boot করে। তাই এখানে ZFS root filesystem নয়, দ্বিতীয় volume-এ একটি data pool হিসেবে ব্যবহৃত হবে। Pool তৈরি করার আগে device-টি প্রত্যাশিত device কি না যাচাই করুন। কারণ আপনাকে দেওয়া NVMe disk নিশ্চিত করতে এক মিনিট লাগে, কিন্তু rebuild করতে একটি বিকেল লেগে যেতে পারে।
পুলে redundancy থাকলেই checksum মেরামত করতে পারে
ZFS যে প্রতিটি block লেখে, তার সঙ্গে একটি checksum থাকে। প্রতিটি read-এর সময় সেটি যাচাই করা হয়। ত্রুটি শনাক্তকরণ সব সময় কাজ করে। মেরামতের জন্য দ্বিতীয় copy দরকার।
একটি single-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ত্রুটিপূর্ণ file-এর নাম দেখানো হয়। ext4 কোনো মন্তব্য ছাড়াই ওই bytes ফেরত দিত। তাই এটিও গুরুত্বপূর্ণ সুবিধা। তবে ZFS এটি ঠিক করতে পারে না, কারণ pool-এ মেরামতের জন্য দ্বিতীয় কোনো copy নেই।
একটি mirror থাকলে একই read সঠিক পাশের copy থেকে সরবরাহ করা হয়, ত্রুটিপূর্ণ block-টি আবার লেখা হয়, এবং ঘটনাটি zpool status-এর CKSUM column-এ দেখা যায়। এটিই self-healing। এর জন্য দুটি device দরকার।
sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2VPS-এ host storage সাধারণত আগেই redundant থাকে। অনেক ক্ষেত্রে hypervisor-এর নিচে RAID 10 থাকে। এটি drive নষ্ট হওয়া থেকে সুরক্ষা দেয়। তবে কোনো block ভুলভাবে ফেরত এলে এটি আপনাকে জানায় না, কারণ কোন copy সঠিক তা জানার উপায় array-এর নেই। ZFS তা জানে, কারণ এটি নিজে লেখা checksum-এর সঙ্গে data তুলনা করে।
আপনার যদি একটি virtual disk থাকে এবং কিছুটা repair capability চান, sudo zfs set copies=2 tank/important ওই dataset-এর প্রতিটি block-এর দুটি copy একই disk-এ সংরক্ষণ করে। এতে dataset-টি যে space ব্যবহার করে তা দ্বিগুণ হয়, bad block হলে এটি টিকে থাকতে পারে, এবং পুরো volume অদৃশ্য হয়ে গেলে এটি কোনো কাজে আসে না।
একটি scrub pool-এর সব data read করে এবং তা যাচাই করে।
sudo zpool scrub tank
zpool status tankসুস্থ pool-এর শেষে scan: scrub repaired 0B in 00:04:11 with 0 errors-এর মতো একটি line দেখা যায়। এটি schedule অনুযায়ী চালান। ছোট pool-এর জন্য মাসে একবার যথেষ্ট।
systemctl list-unit-files 'zfs-scrub*'
sudo systemctl enable --now zfs-scrub-monthly@tank.timerDataset হলো নীতির একক
Dataset হলো pool-এর ভেতরের একটি filesystem, এবং এটি তৈরি করা সহজ। তাই প্রতিটি কাজের জন্য একটি করে dataset তৈরি করুন। Property-গুলো pool থেকে নিচের স্তরে inherit হয়। এর ফলে একবার default সেট করে, যেখানে প্রয়োজন সেখানে তা override করতে পারেন। FreeBSD-তে jail সাধারণত এভাবেই চালানো হয়: প্রতিটি jail-এর জন্য একটি dataset থাকে। ফলে একটি jail-কে আলাদাভাবে snapshot করা এবং rollback করা যায়। এটিই 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 এমন একটি property, যা সতর্কতার কারণে অনেকে চালু করেন না। এটি সঠিক পদ্ধতি নয়। lz4 অল্প CPU ব্যবহার করে এবং disk-এ লেখার জন্য প্রয়োজনীয় byte কমায়। তাই compressible data-এর ক্ষেত্রে এটি সাধারণত read ও write দ্রুত করে। zstd বেশি CPU ব্যবহার করে আরও শক্তভাবে compress করে। যেসব log এবং archive খুব কম পড়া হয়, সেগুলোর জন্য এটি উপযোগী। zfs get compressratio tank ব্যবহার করে বাস্তবে কী ফল পাচ্ছেন তা পরীক্ষা করুন। মনে রাখবেন, ratio কেবল property সেট করার পরে লেখা data-এর হিসাব করে।
recordsize হলো একটি dataset যে সর্বোচ্চ block size-এ লেখে; default হিসেবে এটি 128K। একটি database যখন 128K record-এর মধ্যে 8 KiB page লেখে, তখন একটি ছোট write পুরো record read করে, পরিবর্তন করে এবং আবার write করে। Data load করার আগে database dataset-এ recordsize=16K সেট করুন। কারণ এই property কেবল পরে লেখা নতুন block-এ প্রযোজ্য হয়।
quota ব্যবহার করে একটি dataset-কে pool পূর্ণ করে ফেলা থেকে আটকানো যায়। 100% পূর্ণের কাছাকাছি ZFS pool ধীর হয়ে যায় এবং cleanup করা কঠিন হয়। তাই ইচ্ছাকৃতভাবে কিছু অতিরিক্ত capacity খালি রাখুন।
Snapshot: data পরিবর্তন না হওয়া পর্যন্ত কোনো খরচ নেই
ZFS কখনো সক্রিয় block overwrite করে না। এটি নতুন block লেখে এবং pointer আপডেট করে। Copy-on-write বলতে এটিই বোঝায়। Snapshot হলো এমন একটি নির্দেশনা যে, “এই মুহূর্তে এই dataset যে block-গুলোর দিকে নির্দেশ করছে, সেগুলো সংরক্ষণ করো।” তাই snapshot নেওয়া তাৎক্ষণিক এবং বিনামূল্যে।
sudo zfs snapshot tank/data@2026-08-11
zfs list -t snapshot -o name,used,refer -r tank/dataSnapshot-এর USED column-এ শুধু ওই snapshot ধরে রাখা space দেখানো হয়। শুরুতে এর মান প্রায় শূন্য থাকে। আপনি data পরিবর্তন বা মুছে ফেললে এটি বাড়ে, কারণ পুরোনো block আর release করা যায় না।
কোনো file ফিরিয়ে আনতে restore ধাপের প্রয়োজন হয় না।
ls /tank/data/.zfs/snapshot/
cp /tank/data/.zfs/snapshot/2026-08-11/notes.txt /tank/data/notes.txt.zfs directory-টি ls -a-এর কাছেও hidden থাকে, যতক্ষণ না আপনি sudo zfs set snapdir=visible tank/data চালান। প্রয়োজনের আগে snapshot নিন। তা না হলে একটি অসতর্ক rm -rf আপনাকে ext4 recovery path-এ পাঠাতে পারে। এই প্রক্রিয়া disk unmount করা দিয়ে শুরু হয় এবং এরপর পরিস্থিতি আরও জটিল হয়।
Rollback করলে snapshot নেওয়ার পর থেকে লেখা সবকিছু বাতিল হয়ে যায়।
sudo zfs rollback tank/data@2026-08-11নতুন snapshot থাকলে এটি কাজ করতে অস্বীকার করে। এগিয়ে যেতে -r ওই নতুন snapshot-গুলো ধ্বংস করে। Enter চাপার আগে dataset-এর নাম দুবার পড়ে নিন।
Snapshot backup নয়। এটি একই pool, একই volume এবং একই server-এ থাকে। কোনো volume নষ্ট হলে বা zpool destroy ঘটলে data-এর সঙ্গে snapshot-ও নষ্ট হয়। Snapshot আপনার নিজের rm এবং ভুল upgrade থেকে সুরক্ষা দেয়। বাস্তবের অনেক incident এই পরিসরের মধ্যে পড়ে। তবে pool-এর নিজস্ব কোনো সমস্যার বিরুদ্ধে snapshot কোনো সুরক্ষা দেয় না। সম্পূর্ণ ব্যাখ্যা এখানে: কেন VPS snapshot backup নয়।
এক কমান্ডে পাঠানো ও গ্রহণ: replication
zfs send snapshot-কে standard output-এ একটি byte stream-এ রূপান্তর করে, আর zfs receive সেই stream-কে আবার একটি dataset-এ রূপান্তর করে। প্রথম copy সম্পূর্ণ 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 থেকে পাঠাচ্ছেন, receiving side-এ সেটি থাকতেই হবে। snapshot না থাকলে receive cannot receive incremental stream: most recent snapshot of backup/data does not match incremental source বার্তা দিয়ে থেমে যায়, কারণ পার্থক্য প্রয়োগ করার জন্য ZFS-এর কোনো base থাকে না। উভয় পাশে থাকা snapshot থেকে send করুন, অথবা full send দিয়ে আবার শুরু করুন।
Remote root ব্যবহার না করে target-এ প্রয়োজনীয় অধিকার দিন: sudo zfs allow -u backupuser create,mount,receive backup/data।
এটি একটি প্রকৃত off-site backup, তবে একটি শর্ত আছে। দূরের প্রান্তটি ZFS pool হতে হবে, কারণ object storage stream গ্রহণ করতে পারে না। target যদি S3-compatible storage বা সাধারণ Linux host হয়, তাহলে সেটির সঙ্গে কাজ করতে পারে এমন tool ব্যবহার করুন। সেই ব্যবহারের পদ্ধতি VPS থেকে restic backup-এ বর্ণিত হয়েছে।
ZFS এত RAM ব্যবহার করে কেন? ARC
ARC (adaptive replacement cache) হলো ZFS-এর read cache। এটি সাধারণ Linux page cache-এ নয়, kernel memory-তে থাকে। তাই free -h এটিকে buff/cache-এর অধীনে দেখায় না। এটি ব্যবহৃত memory হিসেবে দেখা যায়। প্রায় পূর্ণ দেখানো ZFS server সাধারণত warm cache-সহ server। “ZFS আমার RAM শেষ করে দিয়েছে” ধরনের অধিকাংশ রিপোর্টের মূল কারণ এটি।
Default limit ইচ্ছাকৃতভাবেই বড় রাখা হয়। OpenZFS 2.3-এ সর্বোচ্চ ARC size হলো 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 size-এ প্রয়োগ করা documented default rule-এর ফল। এগুলো কোনো চলমান server থেকে নেওয়া measurement নয়। 4 GB instance-এ 2.3-এর নিয়ম 3 GiB ARC অনুমোদন করে। একই server 2.2-এ 2 GiB-এ থামে। 2.3-এর নিয়মে 2 GB instance-এও 1.25 GiB ARC অনুমোদিত থাকে। বাকি memory আপনার application পায়।
Table-এর ওপর নির্ভর না করে আপনার নিজের server থেকে প্রকৃত সংখ্যা দেখুন:
grep -E '^(size|c_max) ' /proc/spl/kstat/zfs/arcstats
arc_summary | head -n 20তৃতীয় column-এ bytes দেখানো হয়। c_max হলো বর্তমানে কার্যকর ceiling। size হলো ARC বর্তমানে যত memory ধরে রেখেছে।
ARC memory ফিরিয়ে দেয়। Kernel memory pressure signal করলে ARC ছোট হয়। সমস্যা হলো timing। এই shrink memory pressure-এর মাধ্যমে শুরু হয়। তাই একই সময়ে কয়েকশ MiB memory চাইছে এমন কোনো process ARC memory ছাড়ার সময় OOM (out of memory) killer-এর মুখোমুখি হতে পারে। Database এবং web server চালানো 2 GB server-এ এটি বিরল ঘটনা নয়। OpenZFS manual-এ manual change সম্পর্কেও একই কথা বলা হয়েছে: limit কমালেই “shrink শুরু করার জন্য memory pressure না থাকলে ARC ছোট হবে না”।
ছোট VPS-এ ARC-এর সর্বোচ্চ সীমা কীভাবে নির্ধারণ করবেন
প্রথমে workload-এর memory প্রয়োজন নির্ধারণ করুন। Database এবং application-এর প্রয়োজনীয় memory যোগ করুন, operating system-এর জন্য কিছু অতিরিক্ত margin রাখুন, এবং বাকি memory ARC-কে দিন। Postgres এবং একটি web application চালানো 4 GB instance-এ 512 MiB থেকে 1 GiB ARC দিয়ে শুরু করা যুক্তিসংগত।
সীমাটি live অবস্থায় 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 হতে পারে। সে ক্ষেত্রে আপনি সদ্য যে file লিখেছেন, module সেটি পড়বে না। Reboot-এর পর arcstats-এর c_max line দেখে মানটি নিশ্চিত করুন।
Manual থেকেই দুটি সতর্কতা জানা যায়। System চলার সময় এই মানটি আবার 0 করা যায় না। তাই সেটিং বাতিল করতে file সম্পাদনা করে reboot দিতে হবে। আর সংখ্যা কমালেই বড় ARC সঙ্গে সঙ্গে ছোট হয় না।
FreeBSD-তে একই সীমা vfs.zfs.arc-এর অধীনে একটি sysctl হিসেবে থাকে। বর্তমান মান এবং আপনার version-এ ব্যবহৃত সঠিক নাম দেখতে sysctl vfs.zfs.arc চালান। এরপর সর্বোচ্চ মানটি /boot/loader.conf-এ লিখুন।
ছোট server-এর জন্য memory-সংক্রান্ত আরও দুটি নিয়ম মনে রাখুন। Deduplication বন্ধ রাখুন, কারণ dedup table memory-তে থাকে এবং প্রচলিত rule of thumb অনুযায়ী প্রতি TB unique data-এর জন্য 1 থেকে 3 GB RAM প্রয়োজন হয়। এছাড়া zvol-এ swap রাখবেন না। zvol হলো pool থেকে তৈরি করা একটি block device। Memory মুক্ত করার চেষ্টা করা filesystem-এর মাধ্যমেই swap চালালে machine deadlock করতে পারে। Swap একটি সাধারণ partition-এ অথবা pool-এর বাইরে থাকা swap file-এ রাখুন।
যখন ext4 বা XFS এবং restic বেশি উপযুক্ত
অতিরিক্ত memory এবং দ্বিতীয় volume থাকা সার্ভারে ZFS তার সুবিধা দেখায়। এর বাইরে সাধারণ filesystem-এর সঙ্গে একটি নির্ভরযোগ্য backup tool ব্যবহার করাই ভালো। নিচের ক্ষেত্রে ext4 বা XFS বেছে নিন:
- Instance-এ 2 GB বা 4 GB RAM আছে এবং workload-এর জন্য সম্পূর্ণ RAM দরকার।
- একটি virtual disk আছে, কিন্তু দ্বিতীয় copy নেই। তাই ZFS কোনো সমস্যা শনাক্ত করলেও তা মেরামত করতে পারে না।
- আপনার backup target object storage বা সাধারণ Linux host। তাই সেখানে কোনো কিছুই
zfs sendstream গ্রহণ করতে পারে না। - আপনি DKMS-সহ Debian চালান এবং এমন kernel upgrade করার ঝুঁকি নিতে পারেন না, যার পরে module build হয় না।
- Root filesystem হিসেবে ZFS দরকার, কিন্তু provider-এর image-গুলোতে শুধু ext4 দেওয়া হয়।
আলাদা data volume, পর্যাপ্ত RAM (8 GB বা তার বেশি হলে স্বাচ্ছন্দ্য থাকে), এবং snapshot ও zfs send ব্যবহার করার বাস্তব পরিকল্পনা থাকলে ZFS রাখুন; শুধু এগুলো enable করে রাখলে হবে না। অন্য সব ক্ষেত্রে restic-সহ ext4 ব্যবহার করুন। restic encrypted ও deduplicated backup এমন storage-এ লিখবে, যা সার্ভার নিয়ন্ত্রণ করে না। এতে অনেকটা একই সুরক্ষা পাওয়া যায়, কিন্তু অতিরিক্ত memory লাগে না।
ব্যর্থতার ধরন এবং যে স্ট্রিংগুলো আপনি দেখবেন
Reboot-এর পরে pool নেই। zpool status চালালে no pools available দেখা যায়। import service /etc/zfs/zpool.cache পড়ে, তাই ওই ফাইলে না থাকা pool boot-এর সময় কখনো import হয় না। sudo zpool import কোন pool import করা যাবে তা দেখায়, sudo zpool import tank pool-টি ফিরিয়ে আনে, আর sudo zpool set cachefile=/etc/zfs/zpool.cache tank সেটিকে স্থায়ী করে। অন্য কোনো system থেকে cleanly export না করা pool cannot import 'tank': pool may be in use from other system দেখায়। অন্য কোনো host-এ pool-টি নেই নিশ্চিত হলে 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 হয়নি। সাধারণত matching headers install না থাকলে এটি ঘটে। dkms status কোন kernel-এর জন্য কী build হয়েছে তা দেখায়। এরপর sudo apt install -y linux-headers-$(uname -r) চালিয়ে sudo dkms autoinstall সেটি rebuild করে, আর sudo zpool import tank pool-টি ফিরিয়ে আনে।
আপনি file delete করলেও pool full। কোনো snapshot deleted data-কে reference করলে সেই data disk-এ থেকেই যায়। তাই du এবং df-এর ফল এক হয় না। zfs list -o space -r tank usage-কে USEDDS এবং USEDSNAP-এ ভাগ করে দেখায়। বড় USEDSNAP-ই সমস্যার কারণ। sudo zfs destroy tank/data@2026-06-01 ব্যবহার করে পুরোনো snapshot destroy করুন। এরপর space ফিরে আসবে।
zpool status-এ CKSUM-এর সংখ্যা বাড়ছে। ZFS-এর নিচের কোনো স্তর ভুল data ফেরত দিয়েছে। mirror-এ এটি একটি warning, এবং block-টি repair করা হয়েছে। single-disk pool-এ file-টি নষ্ট হয়ে যায়। zpool status -v file-টির নাম দেখায়। এই pool-এ না থাকা backup থেকে শুধু ওই file-টি restore করুন।
Server ধীর এবং swapping করছে। উপরের পদ্ধতিতে ARC-এর সীমা নির্ধারণ করুন। এরপর arc_summary চালিয়ে hit ratio দেখুন। working set ধরে রাখার জন্য ARC খুব ছোট হলে প্রতিটি read disk-এ যায়। এই অবস্থায় page cache ব্যবহার করা সাধারণ filesystem আপনার জন্য বেশি কার্যকর হবে।
FAQ
ZFS-এর জন্য VPS-এ কত RAM প্রয়োজন?
ZFS 2 GB-এর instance-এ চলে। আসল প্রশ্ন হলো, আপনার application-এর জন্য কত RAM অবশিষ্ট থাকে। কোনো tuning না করলে OpenZFS 2.3 ARC-কে RAM থেকে 1 GiB বাদ দেওয়া মান এবং RAM-এর 5/8 অংশের মধ্যে যেটি বড়, সেই সীমা পর্যন্ত বাড়তে দেয়। তাই 4 GB-এর একটি server cache-এর জন্য 3 GiB দিতে পারে। আপনার workload যে পরিমাণ RAM ছাড়তে পারে, সেই মানে zfs_arc_max সেট করুন। এরপর /proc/spl/kstat/zfs/arcstats থেকে c_max লাইন পড়ে তা নিশ্চিত করুন।
ZFS snapshot কি backup?
না। Snapshot data-র একই pool-এ থাকে। এটি খারাপ rm এবং ব্যর্থ upgrade-এর পরেও থাকে। তবে pool বা instance নষ্ট হলে snapshot-ও নষ্ট হয়। zfs send ব্যবহার করে snapshot অন্য machine-এ পাঠান। অথবা এমন backup tool চালান, যা এই server নিয়ন্ত্রণ করে না এমন storage-এ data লেখে।
FreeBSD এবং Linux-এ ZFS কি একইভাবে কাজ করে?
December 2020-এ OpenZFS 2.0 প্রকাশের পর থেকে codebase একই। Command-ও একই, on-disk format-ও একই, এবং pool এক system থেকে অন্য system-এ নেওয়া যায়। পার্থক্যটি packaging-এ। FreeBSD base system-এর মধ্যে ZFS সরবরাহ করে। Linux-এ প্রতিটি distribution আলাদা সিদ্ধান্ত নেয়। Ubuntu তার kernel package-এর মধ্যে module build করে। Debian আপনার machine-এ DKMS দিয়ে এটি build করে। তাই kernel upgrade-এর পর rebuild সফল না হওয়া পর্যন্ত module অনুপস্থিত থাকতে পারে।
একটি disk থাকা VPS-এ ZFS কি corruption মেরামত করতে পারে?
ZFS corruption শনাক্ত করে এবং file-এর নাম দেখায়। কিন্তু এটি corruption মেরামত করতে পারে না, কারণ মেরামতের জন্য block-এর দ্বিতীয় copy প্রয়োজন। একটি dataset-এ zfs set copies=2 ব্যবহার করলে দ্বিগুণ storage খরচে সেই দ্বিতীয় copy পাওয়া যায়। এতে bad block সামলানো যায়, কিন্তু হারিয়ে যাওয়া volume পুনরুদ্ধার করা যায় না। দুইটি volume জুড়ে mirror ব্যবহার করাই কার্যকরভাবে corruption মেরামতের উপায়।
Compression কি server ধীর করে?
lz4 সাধারণত server দ্রুত করে। Compressed block-এর কারণে কম byte লিখতে এবং পড়তে হয়। প্রতি block-এ CPU cost-ও সাশ্রয় হওয়া disk I/O-এর তুলনায় কম। Pool root-এ compression=lz4 সেট করুন, যাতে প্রতিটি dataset এটি inherit করে। এরপর বাস্তব data লেখা হয়ে গেলে zfs get compressratio tank পরীক্ষা করুন।