MAROON ACADEMY

آموزش ساخت و افزایش Swap در Ubuntu VPS

راهنمای امن ساخت swap file در Ubuntu VPS؛ شامل انتخاب اندازه، بررسی فایل‌سیستم، فعال‌سازی دائمی، تنظیم swappiness، مانیتورینگ و حذف صحیح.

امنیت سرور

برای ساخت Swap در Ubuntu VPS ابتدا RAM، swap فعلی، فضای دیسک و نوع فایل‌سیستم را بررسی کنید؛ سپس یک فایل بدون hole بسازید، permission آن را به 600 محدود کنید، با mkswap آماده و با swapon فعال کنید. در پایان ورودی /etc/fstab را آزمایش کنید تا پس از reboot نیز فعال بماند.

Swap بخشی از دیسک است که کرنل هنگام فشار حافظه برای نگهداری موقت pageها استفاده می‌کند. از RAM کندتر است، اما می‌تواند جلوی crash ناگهانی سرویس یا دخالت زودهنگام OOM Killer را بگیرد. Swap جای RAM کافی یا رفع memory leak نیست؛ اگر سرور دائماً swap می‌کند، باید مصرف برنامه، ظرفیت PHP-FPM، دیتابیس و اندازه VPS را بررسی کنید.

قبل از ساخت Swap وضعیت سرور را بسنجید

free -h
swapon --show
df -h /
findmnt -no FSTYPE /
grep -E 'MemTotal|MemAvailable|SwapTotal|SwapFree' /proc/meminfo

اگر swapon --show خروجی دارد، ممکن است swap از قبل فعال باشد. بدون شناخت وضعیت، فایل دوم نسازید. حداقل به اندازه فایل انتخابی فضای آزاد نگه دارید و برای log، backup و update نیز حاشیه باقی بگذارید. در VPSهای دارای NVMe، swap سریع‌تر از دیسک قدیمی است، اما همچنان چندین برابر کندتر از RAM خواهد بود.

چه اندازه‌ای برای Swap مناسب است؟

قاعده ثابت «دو برابر RAM» برای همه workloadها درست نیست. برای VPS کوچک با ۱ تا ۲ گیگابایت RAM، یک تا دو گیگابایت swap معمولاً حاشیه اضطراری مناسبی است. سرور دارای RAM بیشتر یا workload پایگاه‌داده باید بر اساس peak مصرف، سرعت دیسک و SLA اندازه‌گیری شود. برای hibernation به ملاحظات جداگانه نیاز است که در VPS سروری معمولاً موضوعیت ندارد.

فرایند انتقال کنترل‌شده pageهای کم‌استفاده از RAM به swap file روی دیسک VPSSwap حاشیه اضطراری حافظه است؛ مصرف مداوم آن نشانه نیاز به بررسی ظرفیت یا برنامه است.

مرحله اول: فایل Swap را به روش قابل‌حمل بسازید

manpage رسمی swapon هشدار می‌دهد فایل دارای hole با swap سازگار نیست و truncate انتخاب مناسبی نیست. روش dd قابل‌حمل‌تر است. مثال زیر فایل ۲ گیگابایتی می‌سازد:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

مسیر را دقیق بنویسید؛ dd روی مقصد اشتباه می‌تواند داده را نابود کند. chmod 600 مانع خواندن swap توسط کاربران عادی می‌شود. پس از mkswap باید پیام اندازه و UUID را ببینید و پس از swapon فرمان‌های زیر فعال‌شدن را تأیید کنند:

swapon --show
free -h
cat /proc/swaps

اگر فایل‌سیستم Btrfs است چه کنیم؟

روی Btrfs نباید مراحل فایل معمولی را بدون بررسی اجرا کنید. swap file باید شرایط NoCoW و محدودیت‌های snapshot را رعایت کند. در نسخه‌های جدید ابزار Btrfs می‌توان از btrfs filesystem mkswapfile استفاده کرد. نسخه Ubuntu و manpage همان سرور را بررسی کنید؛ فعال‌بودن swap file می‌تواند snapshot همان subvolume را محدود کند.

مرحله دوم: فعال‌سازی دائمی را امن انجام دهید

پیش از ویرایش، از fstab بکاپ بگیرید و فقط اگر ورودی تکراری وجود ندارد خط جدید را اضافه کنید:

sudo cp /etc/fstab "/etc/fstab.backup-$(date +%F-%H%M)"
grep -n '/swapfile' /etc/fstab
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab

اگر grep قبلاً ورودی نشان داد، دوباره اضافه نکنید. سپس بدون reboot چرخه fstab را آزمایش کنید:

sudo swapoff /swapfile
sudo swapon --all
swapon --show

این آزمایش را وقتی حافظه کافی دارید انجام دهید. swapoff باید pageهای swap را به RAM برگرداند و در سرور تحت فشار ممکن است با کمبود حافظه شکست بخورد. در این وضعیت ابتدا بار را کم یا RAM را افزایش دهید.

Swappiness چیست و چه عددی بگذاریم؟

طبق مستندات کرنل، vm.swappiness هزینه نسبی swap و page cache را با عددی بین ۰ تا ۲۰۰ بیان می‌کند و مقدار پیش‌فرض ۶۰ است. عدد کمتر swap را «گران‌تر» فرض می‌کند، اما صفر به معنی غیرفعال‌شدن کامل swap نیست. مقدار مناسب workload-dependent است؛ عدد ۱۰ برای همه سرورها قانون عمومی نیست.

sysctl vm.swappiness
cat /proc/sys/vm/swappiness

ابتدا رفتار فعلی را مانیتور کنید. اگر با شواهد تصمیم به تغییر گرفتید، فایل مجزایی بسازید و همان لحظه اعمال کنید:

echo 'vm.swappiness=20' | sudo tee /etc/sysctl.d/90-swap.conf
sudo sysctl --system
sysctl vm.swappiness

عدد ۲۰ فقط مثال محافظه‌کارانه برای دیسک معمولی است. روی zram، zswap یا storage سریع ممکن است مقدار بالاتر مناسب باشد. latency، swap-in/out و فشار حافظه را قبل و بعد مقایسه کنید.

چطور Swap را مانیتور کنیم؟

free -h
vmstat 1 10
swapon --show --bytes
journalctl -k --since '24 hours ago' | grep -Ei 'oom|out of memory|killed process'

در vmstat ستون‌های si و so ورود و خروج swap را نشان می‌دهند. مقدار استفاده‌شده به‌تنهایی مشکل نیست؛ pageهای کم‌استفاده ممکن است مدت‌ها در swap بمانند. swap-in/out مداوم همراه با latency بالا، کمبود RAM یا فشار workload را نشان می‌دهد.

افزایش یا حذف امن Swap

برای تغییر اندازه، فایل فعال را مستقیم overwrite نکنید. ابتدا مطمئن شوید RAM آزاد کافی است، swap را خاموش، ورودی fstab را موقتاً مدیریت و فایل را دوباره بسازید. برای حذف:

sudo swapoff /swapfile
sudo cp /etc/fstab "/etc/fstab.backup-$(date +%F-%H%M)"
sudoedit /etc/fstab
sudo rm -f /swapfile
swapon --show

در sudoedit فقط خط دقیق /swapfile را حذف کنید. اگر swapoff شکست خورد، فایل و fstab را دست‌کاری نکنید؛ اول حافظه آزاد کنید. حذف فایل فعال یا اشتباه در fstab می‌تواند boot و پایداری سرور را مختل کند.

جمع‌بندی

Swap یک شبکه ایمنی برای فشار کوتاه حافظه است، نه جایگزین ارتقای RAM. وضعیت فعلی و فایل‌سیستم را بسنجید، فایل بدون hole با permission محدود بسازید، فعال‌سازی را از fstab آزمایش کنید و swappiness را با مانیتورینگ تنظیم کنید. اگر swap دائماً در حال I/O است، علت اصلی را در workload و ظرفیت سرور پیدا کنید.

برای آماده‌سازی کامل سرور، چک‌لیست امن‌سازی VPS اوبونتو را ببینید. اگر فشار حافظه به PHP-FPM و خطای gateway منجر شده، راهنمای رفع خطای 502 در Nginx و مقاله آپدیت امن PHP مکمل این آموزش هستند.

منابع رسمی: manpage دستور swapon در Ubuntu، manpage دستور mkswap، ساختار fstab در Ubuntu، مستندات vm.swappiness در کرنل لینوکس و ملاحظات swap file روی Btrfs.