TürkiyeVPS

افزودن swap در اوبونتو ۲۴.۰۴: راهنمای VPS با رم کم

اگر برنامه‌ها روی VPS با رم ۵۱۲ مگابایت یا ۱ گیگابایت مدام بسته می‌شوند، swap اولین کمک است. افزودن swap در اوبونتو ۲۴.۰۴، انتخاب اندازهٔ درست و محدودیت‌های آن.

7 دقیقه مطالعه

یک VPS کوچک گرفته‌اید، چند سرویس نصب کرده‌اید و یک روز می‌بینید MySQL یا برنامهٔ Node.js شما بی‌دلیل بسته شده است. در بیشتر موارد دلیلش ساده است: رم تمام شده و کرنل لینوکس برای آزاد کردن حافظه یک پروسه را کشته است. در این مقاله افزودن swap در اوبونتو ۲۴.۰۴، انتخاب اندازهٔ مناسب، دائمی کردن آن، گزینهٔ zram و اینکه چه زمانی swap دیگر کافی نیست را توضیح می‌دهیم. این راهنما مخصوصاً برای سرورهایی با رم ۵۱۲ مگابایت و ۱ گیگابایت نوشته شده و به حل مشکل کمبود رم سرور مجازی کمک می‌کند.

swap چیست و چه نیست؟

swap فضایی روی دیسک است که وقتی رم پر می‌شود، کرنل صفحه‌های کم‌استفادهٔ حافظه را موقتاً به آن منتقل می‌کند. می‌تواند یک فایل (swap file) یا یک پارتیشن جدا باشد. روی VPS عملی‌ترین روش، فایل swap است.

مزایای swap:

  • در جهش‌های ناگهانی مصرف حافظه، سیستم به‌جای کشتن پروسه‌ها فقط کندتر می‌شود.
  • حافظه‌ای که هنگام راه‌اندازی بارگذاری شده و کمتر استفاده می‌شود به دیسک می‌رود و رم برای کار اصلی آزاد می‌ماند.
  • کارهای کوتاه اما پرمصرف مثل apt upgrade، npm install یا composer install دیگر وسط کار متوقف نمی‌شوند.

اما swap جایگزین رم نیست. حتی سریع‌ترین SSD هم بسیار کندتر از رم است و سروری که دائم swap می‌کند در همه‌چیز کند می‌شود. swap کمربند ایمنی است، نه موتور اضافه.

۱. بررسی وضعیت فعلی

اول وضعیت رم و swap را ببینید:

free -h
swapon --show

اگر swapon --show چیزی چاپ نکند، swap ندارید. اگر خروجی دارد، swap از قبل تعریف شده است؛ قبل از افزودن swap دوم اندازه‌اش را بررسی کنید.

بعد فضای دیسک را چک کنید:

df -h /

در پلن‌های کوچک این مرحله مهم است. مثلاً دیسک یک VPS پایه ممکن است فقط ۵ گیگابایت باشد و یک فایل swap دو گیگابایتی بخش بزرگی از آن را می‌گیرد. برای چنین سرورهایی، swap بین ۵۱۲ مگابایت تا ۱ گیگابایت معمولاً تعادل خوبی است.

۲. انتخاب اندازهٔ swap

فرمول قطعی وجود ندارد، اما این جدول برای سرورهای کوچک شروع خوبی است:

رم swap پیشنهادی توضیح
512 MB 512 MB – 1 GB اگر دیسک کم است، 512 MB
1 GB 1 GB متعادل برای بیشتر پروژه‌های کوچک
2 GB 1 – 2 GB ذخیره برای اوج مصرف
4 GB و بیشتر 1 – 2 GB بیشتر برای احتیاط

سرورها به حالت hibernate نمی‌روند، پس قانون قدیمی «swap دو برابر رم» اینجا صدق نمی‌کند.

۳. ساخت فایل swap

مثال زیر یک swap یک‌گیگابایتی می‌سازد. برای ۵۱۲ مگابایت به‌جای 1G بنویسید 512M.

sudo fallocate -l 1G /swapfile

روی بعضی فایل‌سیستم‌ها fallocate خطا می‌دهد. در این صورت همان فایل را با dd بسازید (کمی کندتر است):

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress

دسترسی فایل را فقط به root محدود کنید، آن را به‌عنوان swap فرمت و فعال کنید:

sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

بررسی:

swapon --show
free -h

اگر در خط Swap: فضای جدید را می‌بینید، swap فعال است.

خطای «Operation not permitted» یا «Invalid argument»

اگر swapon یکی از این خطاها را داد، ممکن است لایهٔ مجازی‌سازی زیر سرور شما اجازهٔ فایل swap ندهد. فایل را پاک کنید (sudo rm /swapfile) و از طریق چت آنلاین سایت یا ثبت تیکت در پنل کاربری موضوع را از ما بپرسید. تا آن موقع، توصیه‌های صرفه‌جویی در رم در ادامهٔ مقاله به کارتان می‌آید.

۴. دائمی کردن swap

swapی که با swapon فعال می‌شود بعد از ری‌استارت از بین می‌رود. برای ماندگاری، آن را به /etc/fstab اضافه کنید؛ اول نسخهٔ پشتیبان بگیرید:

sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

نتیجه را ببینید:

tail -n 3 /etc/fstab

یک اشتباه در fstab می‌تواند بوت سرور را مختل کند و دلیل گرفتن نسخهٔ پشتیبان همین است. اگر مشکلی پیش آمد، از ترمینال وب پنل کاربری با sudo cp /etc/fstab.bak /etc/fstab فایل را برگردانید.

۵. تنظیم swappiness و کش

پارامتر vm.swappiness تعیین می‌کند کرنل با چه تمایلی از swap استفاده کند (بین ۰ تا ۲۰۰؛ پیش‌فرض اوبونتو ۶۰ است). روی سرور، مقدار کمتر باعث می‌شود برنامه‌ها در رم بمانند و swap فقط هنگام نیاز واقعی وارد عمل شود.

cat /proc/sys/vm/swappiness

تنظیم دائمی:

sudo tee /etc/sysctl.d/99-swap.conf > /dev/null <<'EOF'
vm.swappiness=10
vm.vfs_cache_pressure=50
EOF
sudo sysctl --system

vm.vfs_cache_pressure=50 باعث می‌شود کش اطلاعات فایل‌سیستم (پوشه‌ها و inodeها) کمی بیشتر در رم بماند. این مقادیر برای سرورهای کوچک نقطهٔ شروع معقولی هستند؛ آن‌ها را با توجه به بار کاری خودتان تنظیم کنید.

گزینهٔ دیگر: swap فشرده با zram

zram بخشی از رم را به یک دستگاه swap فشرده تبدیل می‌کند. چون داخل رم است، بسیار سریع‌تر از فایل swap است و فضای دیسک نمی‌گیرد؛ در عوض کمی از پردازنده استفاده می‌کند. برای VPSهای کوچک با دیسک محدود گزینهٔ بسیار خوبی است.

sudo apt install -y zram-tools
sudo nano /etc/default/zramswap

این مقادیر را تنظیم کنید (الگوریتم پیش‌فرض lz4 است؛ zstd کمی پردازندهٔ بیشتری مصرف می‌کند اما فشرده‌سازی بهتری دارد):

ALGO=zstd
PERCENT=50
PRIORITY=100

PERCENT=50 اندازهٔ zram را نصف رم (بر حسب دادهٔ فشرده‌نشده) تعیین می‌کند و PRIORITY=100 باعث می‌شود کرنل پیش از swap دیسکی از zram استفاده کند. سپس سرویس را ری‌استارت کنید:

sudo systemctl restart zramswap
swapon --show

اگر /dev/zram0 در فهرست دیده شود، zram فعال است. می‌توانید zram و فایل swap را با هم استفاده کنید؛ به لطف اولویت، اول zram پر می‌شود. اگر ماژول zram روی سرورتان بارگذاری نشد، با پشتیبانی در میان بگذارید.

حذف swap

sudo swapoff /swapfile
sudo sed -i '\|^/swapfile none swap sw 0 0$|d' /etc/fstab
sudo rm /swapfile

swapoff داده‌های swap را به رم برمی‌گرداند؛ اگر رم کم باشد ممکن است کمی طول بکشد.

از کجا بفهمیم رم کم آمده است؟ (OOM)

وقتی حافظه کاملاً تمام شود، OOM killer کرنل یک پروسه را می‌بندد. ردپای آن را در لاگ کرنل پیدا می‌کنید:

sudo journalctl -k | grep -i -E "out of memory|oom"
sudo dmesg -T | grep -i -E "killed process|out of memory"

برای دیدن اینکه همین حالا چه چیزی رم را مصرف می‌کند، top (سپس Shift+M) یا ps aux --sort=-%mem | head را اجرا کنید. دستورهای مشابه را در مقالهٔ دستورهای مدیریت سرور جمع کرده‌ایم.

راه‌های دیگر صرفه‌جویی در رم

  • نرم‌افزار سبک‌تر: Nginx به‌جای Apache، و SQLite به‌جای MySQL هر جا که کافی باشد.
  • کوچک کردن MySQL/MariaDB: روی سرور کوچک innodb_buffer_pool_size را پایین نگه دارید، مثلاً 64M تا 128M.
  • محدود کردن PHP-FPM: pm = ondemand و مقدار کم برای pm.max_children جلوی اشغال رم توسط پروسه‌های بیکار را می‌گیرد.
  • سقف رم برای کانتینرهای Docker: محدودیتی مثل docker run --memory=256m ... نمی‌گذارد یک کانتینر کل سرور را قفل کند. اگر با Docker تازه‌کار هستید، راهنمای نصب Docker روی اوبونتو ۲۴.۰۴ را ببینید.
  • خاموش کردن سرویس‌های بی‌استفاده: فهرستشان را با systemctl list-units --type=service --state=running ببینید.

چه زمانی به‌جای swap باید رم را ارتقا داد؟

swap برای عبور از اوج مصرف است. اگر در free -h swap همیشه پر است، ستون‌های si و so در خروجی vmstat 5 مدام بیشتر از صفرند یا سرور به‌طور محسوس کند شده، نیاز واقعی شما رم بیشتر است. در این مرحله رفتن به پلن بزرگ‌تر بسیار مؤثرتر از دست‌کاری تنظیمات swap است. دربارهٔ انتظار واقع‌بینانه از سرورهای ارزان در مقالهٔ نکات خرید VPS ارزان صادقانه نوشته‌ایم.

سوالات متداول

آیا swap عمر SSD را کم می‌کند؟

swap روی دیسک می‌نویسد، اما با swappiness پایین و استفادهٔ گاه‌به‌گاه، این فشار بسیار ناچیز است. swap سنگین و دائمی از نظر کارایی هم مطلوب نیست و نشانهٔ نیاز به رم بیشتر است.

روی VPS با ۵۱۲ مگابایت رم و swap چه چیزهایی اجرا می‌شود؟

یک ربات ساده، یک سایت استاتیک کوچک یا یک API سبک با ۵۱۲ مگابایت رم و کمی swap به‌خوبی اجرا می‌شود. برای دیتابیس، وردپرس یا Docker، شروع با ۱ تا ۲ گیگابایت رم راحت‌تر است.

zram بهتر است یا فایل swap؟

اگر دیسک محدود است و پردازنده بیشتر وقت بیکار است، zram معمولاً سریع‌تر و عملی‌تر است. استفادهٔ هم‌زمان از هر دو، با اولویت بالاتر برای zram، هم ترکیب خوبی است.

وقتی رم بیشتری لازم دارید

سرور مجازی ترکیه از TürkiyeVPS روی سرورهای استانبول از ماهی $0.89 شروع می‌شود و گزینه‌های ۱ و ۲ گیگابایت رم هم دارد. اگر هستهٔ پردازندهٔ اختصاصی و رم تضمینی می‌خواهید، پلن‌های VDS از ماهی $1.69 شروع می‌شوند. همهٔ پلن‌ها ترافیک نامحدود و دسترسی کامل root دارند و پرداخت با تتر (USDT روی شبکهٔ TRC20) انجام می‌شود. برای بزرگ‌تر کردن سرور فعلی کافی است تیکت پشتیبانی ثبت کنید؛ سرور شما با حفظ داده‌ها به پلن بالاتر منتقل می‌شود.