ZFS على FreeBSD وLinux: هل يستهلك RAM أكثر مما تتوقع؟
تعرّف إلى مفاضلة ZFS على VPS بسعة 2 أو 4 GB: مزايا التحقق واللقطات والنسخ المتماثل، ولماذا قد تحجز ARC الذاكرة التي يحتاج إليها تطبيقك.
ما الذي يوفّره ZFS، وما الذي يتطلّبه
يستخدم ZFS على FreeBSD وLinux قاعدة شيفرة واحدة الآن، هي OpenZFS، لذلك تتطابق الميزات في النظامين. يحصل الخادم الذي يشغّل ZFS على بيانات مزوّدة بقيم تحقق، ولقطات لا تستهلك مساحة إضافية إلى أن تتغير البيانات، ونسخ متماثل باستخدام zfs send، وضغط لا يتطلب سوى تفعيل خاصية. لكنه يتطلب الذاكرة: تستحوذ ARC (ذاكرة التخزين المؤقت للاستبدال التكيفي) على حصة كبيرة من RAM افتراضياً، وفي VPS (خادم خاص افتراضي) بسعة 2 GB أو 4 GB، تكون هذه الذاكرة تحديداً هي التي يحتاج إليها تطبيقك.
يقيّم هذا الدليل ZFS على VPS مستأجر يضم قرصاً افتراضياً أو قرصين، وليس على صندوق تخزين يحتوي على أربعين حجرة لمحركات الأقراص. الميزات التي تبقى مفيدة بعد هذا الانتقال هي التي تستحق وقتك. أما الأجزاء التي لا تبقى مفيدة، فمن المهم معرفتها قبل إنشاء pool.
OpenZFS على FreeBSD وLinux: قاعدة شيفرة واحدة، وطريقتان لتغليف الحزمة
يأتي ZFS ضمن النظام الأساسي في FreeBSD منذ FreeBSD 7.0 في عام 2008، وكان في البداية ميزة تجريبية. منذ OpenZFS 2.0 في ديسمبر 2020، يبني FreeBSD وLinux من شجرة المصدر نفسها، لذلك يتصرف zfs وzpool بالطريقة نفسها على النظامين، ويمكن استيراد pool أُنشئ على أحدهما في النظام الآخر.
سبب كون ZFS حزمة في Linux وجزءاً من النظام الأساسي في FreeBSD هو الترخيص. يخضع OpenZFS لترخيص CDDL (ترخيص التطوير والتوزيع المشترك). وتخضع نواة Linux لترخيص GPL (الترخيص العام) الإصدار 2. ويعتبر مشروع النواة أن الترخيصين غير متوافقين، لذلك لا تُدمج شيفرة ZFS في Linux الرئيسي، وتقرر كل توزيعة كيفية توفيرها. لا يوجد هذا التعارض في FreeBSD، لذلك يكون ZFS متاحاً فيه مباشرة. هذه هي الصورة العملية كاملة: اختلاف واحد في تغليف الحزمة، ولا تحتاج إلى اتخاذ موقف بشأنه.
لا توفر SSD Nodes صور FreeBSD، لذلك ينطبق جزء Linux من هذا الدليل على الخادم المستأجر من هنا. إذا كنت تشغّل FreeBSD في مكان آخر، فإن خادم FreeBSD يحصل على ZFS من دون بناء module ومن دون الحاجة إلى تجاوز ترقية للنواة.
ثبّت ZFS وأنشئ pool
في Ubuntu، تأتي الوحدة ضمن حزم kernel، لذلك لا تحتاج إلى تثبيت سوى الأوامر.
sudo apt update
sudo apt install -y zfsutils-linux
zfs versionيعرض zfs version سطرين: إصدار userland وإصدار وحدة kernel. إذا ظهر سطر واحد فقط، فهذا يعني أن الوحدة لم تُحمّل. توجد الحزمة ضمن مكوّن universe، الذي تفعّله صور Ubuntu server افتراضياً. إذا لم يتمكن apt من العثور عليها، فشغّل sudo add-apt-repository universe أولاً.
في Debian، توجد الحزم ضمن مكوّن contrib، وتبني DKMS (دعم وحدات kernel الديناميكية) الوحدة على جهازك. أضف contrib إلى السطر Components: في /etc/apt/sources.list.d/debian.sources، ثم شغّل 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. افحص مسارات الأجهزة الثابتة أولاً، لأن /dev/vdb يخصّص أسماء الأجهزة وفق ترتيب اكتشافها، وقد تتغير عند إرفاق volume آخر.
ls -l /dev/disk/by-id/
sudo zpool create -o ashift=12 tank /dev/disk/by-id/virtio-abc123def456
zpool status tankيفترض أن يعرض zpool status القيمة state: ONLINE، مع ظهور جهازك ضمن tank. يثبّت ashift=12 أصغر block في pool عند 4 KiB، وهو ما يطابق أقراص SSD الحالية ولا يمكن تغييره بعد الإنشاء.
تُقلع معظم الصور المستأجرة من نظام root بصيغة ext4، لذلك يكون ZFS هنا pool للبيانات على volume ثانٍ، وليس نظام الملفات الجذر. تحقّق من أن الجهاز هو الجهاز المقصود قبل استخدامه، لأن تأكيد قرص NVMe الذي بيع لك يستغرق دقيقة واحدة، بينما تستغرق إعادة البناء بعد الاضطرار إليها فترة بعد الظهر.
لا تُصلح اختبارات المجموعات التالفة إلا عندما تتوفر للمجموعة نُسخ زائدة
يحمل كل block يكتبه ZFS قيمة checksum، ويتحقق منها عند كل قراءة. يعمل الاكتشاف دائماً. أما الإصلاح فيحتاج إلى نسخة ثانية.
في المجموعة التي تحتوي على قرص واحد، يخبرك 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 إصلاح الملف، لعدم وجود نسخة ثانية في المجموعة يمكنه استخدامها للإصلاح.
مع mirror، تُنفّذ القراءة نفسها من النسخة السليمة، وتُعاد كتابة block التالف، ويظهر الحدث في عمود CKSUM ضمن zpool status. هذا هو الإصلاح الذاتي، ويتطلب جهازين.
sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2في VPS، تكون وحدة التخزين لدى المضيف زائدة التكرار عادةً، وغالباً ما تستخدم RAID 10 ضمن hypervisor. يحميك ذلك من تعطل قرص. لكنه لا يخبرك بأن block أُعيد بشكل خاطئ، لأن المصفوفة لا تملك وسيلة لمعرفة أي نسخة صحيحة. يعرف ZFS ذلك لأنه يقارن البيانات بقيمة checksum كتبها بنفسه.
إذا كان لديك قرص افتراضي واحد وتريد بعض القدرة على الإصلاح، يخزّن sudo zfs set copies=2 tank/important نسختين من كل block ضمن dataset نفسه وعلى القرص نفسه. يضاعف ذلك المساحة التي يستخدمها dataset، ويسمح بتجاوز block تالف، لكنه لا يفيد عند اختفاء وحدة التخزين بأكملها.
يقرأ scrub كل شيء في المجموعة ويتحقق منه.
sudo zpool scrub tank
zpool status tankتنتهي المجموعة السليمة بسطر مثل scan: scrub repaired 0B in 00:04:11 with 0 errors. شغّلها وفق جدول زمني؛ مرة شهرياً مناسبة لمجموعة صغيرة.
systemctl list-unit-files 'zfs-scrub*'
sudo systemctl enable --now zfs-scrub-monthly@tank.timerمجموعات البيانات هي وحدة تطبيق السياسات
مجموعة البيانات هي نظام ملفات داخل pool، وإنشاء واحدة منها غير مكلف، لذلك أنشئ مجموعة لكل مهمة. تُورَّث الخصائص من pool إلى الأسفل، ما يعني أنك تضبط الإعداد الافتراضي مرة واحدة، ثم تتجاوزه حيث يلزم. في FreeBSD، هذه هي الطريقة المعتادة لتشغيل jails: مجموعة بيانات واحدة لكل jail، بحيث يمكنك أخذ snapshot لـjail واحد واستعادته إلى حالة سابقة بشكل مستقل. وهذا جزء مما يوضح ما يميّز jail عن حاوية Docker.
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 tankالضغط هو الخاصية التي يتجنب الناس تفعيلها بدافع الحذر، لكن هذا عكس ما ينبغي. تستهلك lz4 قدراً صغيراً من CPU وتقلل عدد البايتات التي يجب أن تصل إلى القرص، لذلك تجعل القراءة والكتابة أسرع عادةً مع البيانات القابلة للضغط. يضغط zstd بدرجة أكبر مقابل استهلاك CPU أعلى، ولذلك يناسب السجلات والأرشيفات التي نادراً ما تقرأها مجدداً. تحقّق مما تحصل عليه فعلياً باستخدام zfs get compressratio tank، وتذكّر أن النسبة لا تشمل إلا البيانات التي كُتبت بعد ضبط الخاصية.
recordsize هو أكبر block تكتبه مجموعة البيانات، وقيمته الافتراضية 128K. عندما تكتب قاعدة بيانات صفحات بحجم 8 KiB داخل سجلات بحجم 128 KiB، تتحول الكتابة الصغيرة إلى قراءة للسجل بأكمله، ثم تعديله، ثم كتابته مجدداً. اضبط recordsize=16K على مجموعة بيانات قاعدة البيانات قبل تحميل البيانات، لأن الخاصية تنطبق على الكتل المكتوبة حديثاً فقط.
quota هو ما يمنع مجموعة بيانات واحدة من ملء pool. يصبح تنظيف ZFS بطيئاً ومعقداً عندما تمتلئ pool تقريباً بنسبة 100%، لذلك اترك مساحة احتياطية عمداً.
تكلفة اللقطات تساوي صفراً إلى أن تتغير البيانات
لا يستبدل ZFS كتلة مستخدمة مباشرةً. بل يكتب كتلة جديدة ويحدّث المؤشرات، وهذا هو معنى النسخ عند الكتابة. اللقطة هي تعليمات تقول: «احتفظ بالكتل التي كان هذا الـdataset يشير إليها الآن»، ولذلك يكون إنشاؤها فورياً ومجانياً.
sudo zfs snapshot tank/data@2026-08-11
zfs list -t snapshot -o name,used,refer -r tank/dataيمثل العمود USED في اللقطة المساحة التي تحتفظ بها تلك اللقطة وحدها. يبدأ هذا الحجم قريباً من الصفر، ثم يزداد عند تغيير البيانات أو حذفها، لأن الكتل القديمة لا تعود قابلة للتحرير.
لاستعادة ملف، لا تحتاج إلى تنفيذ خطوة استعادة.
ls /tank/data/.zfs/snapshot/
cp /tank/data/.zfs/snapshot/2026-08-11/notes.txt /tank/data/notes.txtيكون الدليل .zfs مخفياً حتى عن ls -a إلى أن تنفّذ sudo zfs set snapdir=visible tank/data. أنشئ اللقطة قبل أن تحتاج إليها، لأن عدم وجود لقطة يجعل rm -rf عابراً يضعك في مسار استعادة ext4، الذي يبدأ بإلغاء تحميل القرص ثم تزداد مشكلاته.
يؤدي التراجع إلى التخلص من كل ما كُتب منذ إنشاء اللقطة.
sudo zfs rollback tank/data@2026-08-11يرفض العملية عند وجود لقطات أحدث، بينما يحذف -r تلك اللقطات الأحدث للمتابعة. اقرأ اسم الـdataset مرتين قبل الضغط على Enter.
اللّقطة ليست نسخة احتياطية. فهي موجودة في الـpool نفسه، وعلى وحدة التخزين نفسها، وعلى الخادم نفسه. يؤدي تعطل وحدة التخزين أو zpool destroy واحد إلى فقدان اللقطات مع البيانات. تحميك اللقطات من rm الذي تسببه بنفسك ومن ترقية سيئة، وهذا يغطي كثيراً من الحوادث الفعلية، لكنها لا تحميك من أي مشكلة تصيب الـpool نفسه. يوضَّح الأمر بالكامل هنا: لماذا لا تُعد لقطة VPS نسخة احتياطية.
الإرسال والاستقبال: النسخ المتماثل بأمر واحد
يحوّل zfs send لقطة إلى تدفق بايتات على المخرجات القياسية، ويحوّل zfs receive ذلك التدفق مرة أخرى إلى مجموعة بيانات. تكون النسخة الأولى عملية إرسال كاملة.
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"يجب أن يحتفظ الطرف المستقبِل باللقطة التي ترسل منها. إذا لم يفعل، يتوقف الاستقبال مع 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 أو مضيف Linux عادي، استخدم أداة تتحدث معه، ويغطي النسخ الاحتياطي باستخدام restic من VPS هذا المسار.
لماذا يستخدم ZFS هذا القدر الكبير من RAM؟ ذاكرة ARC
تُعد ARC (ذاكرة التخزين المؤقت للاستبدال التكيفي) ذاكرة القراءة المؤقتة في ZFS. وهي توجد في ذاكرة kernel بدلاً من وجودها في ذاكرة صفحات Linux المؤقتة المعتادة، لذلك لا يعرضها free -h ضمن buff/cache. وتظهر بوصفها ذاكرة مستخدمة. عادةً ما يكون خادم ZFS الذي يبدو ممتلئاً تقريباً خادماً ذا ذاكرة تخزين مؤقتة دافئة، وهذا يفسّر معظم التقارير عن أن «ZFS التهم RAM».
الحد الافتراضي كبير عمداً. يعيّن OpenZFS 2.3 الحد الأقصى لحجم ARC إلى القيمة الأكبر بين RAM ناقص 1 GiB و5/8 من RAM. أما OpenZFS 2.2 والإصدارات الأقدم فكانت تستخدم نصف RAM على Linux، بينما كان 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
}
]هذه الأرقام ناتجة عن تطبيق القاعدة الافتراضية الموثقة على أحجام شائعة من instances، وليست قياسات من خادم قيد التشغيل. في instance بسعة 4 GB، تسمح قاعدة 2.3 بذاكرة ARC سعتها 3 GiB. ويتوقف الخادم نفسه عند 2 GiB عند استخدام الإصدار 2.2. أما instance بسعة 2 GB، فتسمح قاعدة 2.3 بذاكرة ARC سعتها 1.25 GiB. ويحصل تطبيقك على المتبقي.
اقرأ الأرقام الفعلية من خادمك بدلاً من الاعتماد على الجدول:
grep -E '^(size|c_max) ' /proc/spl/kstat/zfs/arcstats
arc_summary | head -n 20العمود الثالث بوحدة bytes. يمثّل c_max السقف المطبّق حالياً، ويمثّل size المقدار الذي تشغله ARC حالياً.
تعيد ARC الذاكرة فعلاً. إذ ترسل kernel إشارة بوجود ضغط على الذاكرة، ثم تتقلص ARC. تكمن المشكلة في التوقيت، لأن تقليصها يحدث استجابةً لذلك الضغط؛ لذلك قد تواجه عملية تطلب عدة مئات من MiB دفعة واحدة قاتل OOM (نفاد الذاكرة) بينما لا تزال ARC تحرر الذاكرة. ولا يُعد ذلك حدثاً نادراً على خادم بسعة 2 GB يشغّل قاعدة بيانات وخادم ويب. ويذكر دليل OpenZFS الأمر نفسه بشأن التغييرات اليدوية: إن خفض الحد «لن يؤدي إلى تقليص ARC ما لم يحدث ضغط على الذاكرة لتحفيز التقليص».
كيفية وضع حد لـ ARC على VPS صغير
حدّد أولاً مقدار الذاكرة التي يحتاج إليها حمل العمل. اجمع احتياجات قاعدة البيانات والتطبيق، واترك هامشاً لنظام التشغيل، وخصّص الباقي لـ ARC. في instance بسعة 4 GB يشغّل Postgres وتطبيق ويب واحداً، يُعد تخصيص 512 MiB إلى 1 GiB لـ ARC نقطة بداية مناسبة.
طبّق الحد فوراً، بوحدة البايت. القيمة التالية هي 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 -uخطوة initramfs مهمة لأن الوحدة قد تُحمَّل من initramfs قبل تثبيت نظام الملفات الجذر، ما يعني أنها لن تقرأ الملف الذي كتبته للتو. بعد إعادة التشغيل، تحقّق من القيمة باستخدام سطر c_max من arcstats.
هناك ملاحظتان مستمدتان من الدليل نفسه. لا يمكنك إعادة القيمة إلى 0 أثناء تشغيل النظام، لذا يتطلب التراجع عن هذا الإعداد تعديل الملف ثم إعادة التشغيل. كما أن خفض الرقم لا يقلّص ARC كبيراً فوراً.
في FreeBSD، يوجد الحد نفسه ضمن sysctl تحت vfs.zfs.arc. شغّل sysctl vfs.zfs.arc لعرض القيم الحالية والاسم الدقيق الذي يستخدمه إصدارك، ثم اكتب الحد الأقصى في /boot/loader.conf.
هناك قاعدتان إضافيتان لإدارة الذاكرة على خادم صغير. اترك deduplication معطّلاً، لأن جدول deduplication يُخزَّن في الذاكرة، والقاعدة التقريبية الشائعة المنشورة هي 1 إلى 3 GB من RAM لكل TB من البيانات الفريدة. ولا تضع swap على zvol، وهو جهاز كتلي مستخرج من pool، لأن التبديل عبر نظام الملفات الذي يحاول تحرير الذاكرة قد يؤدي إلى deadlock للنظام. أبقِ swap على قسم عادي أو ملف swap خارج pool.
متى يكون ext4 أو XFS مع restic هو الخيار الأفضل
يحقق ZFS فائدته على خادم يتوفر فيه قدر إضافي من الذاكرة ووحدة تخزين ثانية. بخلاف ذلك، يكون نظام ملفات عادي مع أداة نسخ احتياطي حقيقية هو الخيار الأفضل. اختر ext4 أو XFS عندما:
- يحتوي المثيل على 2 GB أو 4 GB من RAM، ويحتاج حمل العمل إلى كامل هذه الذاكرة.
- يوجد قرص افتراضي واحد ولا توجد نسخة ثانية، لذلك يوفّر لك ZFS اكتشاف المشكلات دون إصلاحها.
- يكون هدف النسخ الاحتياطي هو تخزين الكائنات أو مضيف Linux عادي، بحيث لا يستطيع أي منهما استقبال تدفق
zfs send. - تشغّل Debian مع DKMS، ولا يمكنك تحمّل ترقية kernel تترك الوحدة دون بناء.
- تحتاج إلى ZFS على نظام الملفات الجذر، ولا توفر صور المزود سوى ext4.
احتفظ بـ ZFS عندما تكون لديك وحدة تخزين بيانات منفصلة، وذاكرة إضافية كافية (يكون 8 GB أو أكثر مريحاً)، وخطة تستخدم اللقطات وzfs send بدلاً من مجرد تفعيلهما. في الحالات الأخرى، يغطي ext4 مع استخدام restic لكتابة نسخ احتياطية مشفّرة ومزالة التكرار إلى وحدة تخزين لا يتحكم فيها الخادم معظم الاحتياجات نفسها، من دون استهلاك الذاكرة.
أنماط الأعطال، مع السلاسل التي ستظهر لك
اختفى الـpool بعد إعادة التشغيل. يعرض zpool status القيمة no pools available. تقرأ خدمة الاستيراد الملف /etc/zfs/zpool.cache، لذلك لا يتم استيراد أي pool غير موجود في ذلك الملف عند الإقلاع. يعرض sudo zpool import ما يمكن استيراده، ويعيد sudo zpool import tank الـpool، ويجعل sudo zpool set cachefile=/etc/zfs/zpool.cache tank ذلك دائماً. يعرض الـpool الذي لم يتم تصديره بشكل سليم من نظام آخر الرسالة 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 الـpool.
الـpool ممتلئ، لكنك حذفت الملفات. تبقى البيانات المحذوفة على القرص ما دام snapshot لا يزال يشير إليها، لذلك يختلف du عن df. يقسّم zfs list -o space -r tank الاستخدام إلى USEDDS وUSEDSNAP، وتكون قيمة USEDSNAP الكبيرة هي السبب. احذف الـsnapshots القديمة باستخدام sudo zfs destroy tank/data@2026-06-01، وستتحرر المساحة.
تتزايد قيم CKSUM في zpool status. أعاد شيء ما تحت ZFS بيانات تالفة. في mirror، تكون القيمة تحذيراً، وتتم إصلاح الكتلة. في pool على قرص واحد، يكون الملف مفقوداً، ويسمّيه zpool status -v، ثم تستعيد هذا الملف وحده من نسخة احتياطية لا توجد في هذا الـpool.
الخادم بطيء ويستخدم swap. حدّد حجم ARC كما سبق، ثم شغّل arc_summary وراجع نسبة الإصابات. إذا كان ARC أصغر من أن يستوعب مجموعة العمل، فستذهب كل قراءة إلى القرص. عندها يكون نظام ملفات عادي يستخدم page cache أفضل لك.
FAQ
ما مقدار RAM الذي يحتاج إليه ZFS على VPS؟
يعمل ZFS على instance بسعة 2 GB. السؤال الفعلي هو مقدار الذاكرة المتبقي لتطبيقك. من دون ضبط، يتيح OpenZFS 2.3 لـ ARC النمو إلى القيمة الأكبر بين RAM ناقص 1 GiB و5/8 من RAM، لذلك يمكن لخادم بسعة 4 GB تخصيص 3 GiB لذاكرة التخزين المؤقت. اضبط zfs_arc_max على رقم يمكن لحِمل العمل لديك تحمّله، ثم أكّد القيمة بقراءة السطر c_max من /proc/spl/kstat/zfs/arcstats.
هل تُعد لقطة ZFS نسخة احتياطية؟
لا. تعيش اللقطة في pool نفسه الذي توجد فيه البيانات. وهي تبقى بعد تلف rm وبعد فشل الترقية، لكنها تفقدها عند فقدان pool أو instance. حوّلها إلى نسخة احتياطية بإرسالها إلى جهاز آخر باستخدام zfs send، أو بتشغيل أداة نسخ احتياطي تكتب إلى مساحة تخزين لا يتحكم فيها هذا الخادم.
هل يعمل ZFS بالطريقة نفسها على FreeBSD وLinux؟
تستخدم المنصتان قاعدة الشيفرة نفسها منذ OpenZFS 2.0 في December 2020، والأوامر نفسها، وتنسيق القرص نفسه، ويمكن نقل pools بينهما. ويكمن الاختلاف في طريقة حزم البرنامج. توفّر FreeBSD ZFS ضمن النظام الأساسي. أما في Linux، فتحدد كل توزيعة الطريقة: تبني Ubuntu الوحدة ضمن حزم kernel، بينما تبنيها Debian على جهازك باستخدام DKMS، لذلك قد تفتقد الوحدة بعد ترقية kernel إلى أن تنجح عملية إعادة البناء.
هل يستطيع ZFS إصلاح التلف على VPS بقرص واحد؟
يكتشف ZFS التلف ويحدد اسم الملف، لكنه لا يستطيع إصلاحه لأن الإصلاح يحتاج إلى نسخة ثانية من الكتلة. يمنحك zfs set copies=2 في dataset نسخة ثانية بالمساحة المضاعفة، وهذا يعالج تلف كتلة، لكنه لا يعالج فقدان volume. أما mirror عبر volumeين فهو الحل الذي يعالج التلف فعلياً.
هل يؤدي الضغط إلى إبطاء الخادم؟
يجعل lz4 الخادم أسرع عادةً. تعني الكتل المضغوطة كتابة وحدات بايت أقل وقراءة وحدات بايت أقل، كما أن تكلفة CPU لكل كتلة صغيرة مقارنةً بالقرص الذي توفره. اضبط compression=lz4 في جذر pool لكي ترثه كل datasets، ثم تحقّق من zfs get compressratio tank بعد كتابة بيانات فعلية.