اگر روی سرور مجازی ناگهان MySQL، PHP-FPM یا یک کانتینر بدون هشدار بسته میشود و در لاگها عبارت Out of memory: Killed process را میبینید، RAM سرور تمام شده و هسته لینوکس با OOM Killer یک پردازه را قربانی کرده است. Swap فضایی روی دیسک است که وقتی RAM پر شود، دادههای کماستفاده به آن منتقل میشوند. در این آموزش ساخت Swap در لینوکس را روی Ubuntu و Debian انجام میدهیم، اندازه مناسب را مشخص میکنیم و swappiness را تنظیم میکنیم. اما پیش از آن باید بدانید Swap چه کاری میکند و چه کاری نه.
فهرست مطالب
Swap چیست و چه زمانی لازم است؟
Swap حافظه مجازی روی دیسک است. هسته لینوکس صفحههای حافظهای که مدتی استفاده نشدهاند (مثلاً بخشی از یک سرویس که شبها بیکار است) را به Swap منتقل میکند تا RAM برای کارهای فعال آزاد شود. حتی روی دیسک NVMe، دسترسی به Swap صدها برابر کندتر از RAM است. بنابراین:
- Swap مفید است بهعنوان «ضربهگیر» برای جهشهای موقت مصرف (مثل بهروزرسانی، بکاپ، کامپایل یا اوج لحظهای ترافیک) تا سرویسها کشته نشوند.
- Swap جایگزین RAM نیست. اگر سرور دائماً از Swap استفاده میکند و خواندن و نوشتن روی آن مداوم است (Thrashing)، سرور کند میشود و راهحل، افزایش RAM یا کاهش مصرف است.
برای تخمین RAM لازم سرویسهایتان، راهنمای خرید سرور مجازی را ببینید.
بررسی وضعیت فعلی RAM و Swap
free -h
swapon --show
cat /proc/sys/vm/swappiness
در خروجی free -h، ستون available مهمتر از free است؛ لینوکس RAM آزاد را برای کش دیسک استفاده میکند و این طبیعی است. اگر swapon --show چیزی نشان نداد، Swap ندارید. برای دیدن رخدادهای OOM قبلی:
sudo journalctl -k | grep -i -E "out of memory|oom-kill"
اندازه مناسب Swap
| RAM سرور | Swap پیشنهادی |
|---|---|
| ۱ تا ۲ گیگابایت | برابر RAM (۱ تا ۲ گیگابایت) |
| ۴ تا ۸ گیگابایت | ۲ تا ۴ گیگابایت |
| ۱۶ گیگابایت و بیشتر | ۴ گیگابایت معمولاً کافی است |
قاعده قدیمی «دو برابر RAM» برای سرورهای امروزی منطقی نیست و فقط فضای دیسک را هدر میدهد. Swap بزرگ میتواند باعث شود سرور بهجای کشته شدن یک پردازه، مدت طولانی در حالت بسیار کند بماند. روی سرورهای دیتابیس پرکار هم بهتر است Swap کوچک و swappiness پایین باشد.
ساخت Swap File
این مراحل روی Ubuntu ۲۰.۰۴ تا ۲۴.۰۴ و Debian ۱۱ تا ۱۳ با سیستمفایل ext4 کار میکند. ابتدا فضای خالی را بررسی کنید (df -h /)، سپس یک فایل ۲ گیگابایتی بسازید:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show
اجازه 600 ضروری است تا کاربران دیگر نتوانند محتوای حافظه را بخوانند. اگر fallocate خطا داد یا سیستمفایل XFS یا Btrfs است، از روش جایگزین استفاده کنید:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
برای فعال ماندن پس از ریاستارت، آن را به /etc/fstab اضافه کنید:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
یک اشتباه در /etc/fstab میتواند سرور را در بوت متوقف کند؛ نسخه پشتیبان را نگه دارید و پس از ویرایش با sudo findmnt --verify بررسی کنید. اگر با محیط خط فرمان راحت نیستید، دستورات پایه لینوکس را ببینید.
تنظیم swappiness
پارامتر vm.swappiness (از ۰ تا ۱۰۰ و پیشفرض ۶۰) مشخص میکند هسته چقدر تمایل به انتقال حافظه به Swap داشته باشد. برای سرور، مقدار پایینتر بهتر است تا سرویسهای فعال در RAM بمانند:
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swap.conf
sudo sysctl --system
پارامتر مرتبط دیگر vm.vfs_cache_pressure است؛ مقدار پیشفرض ۱۰۰ برای بیشتر سرورها مناسب است و بهتر است بدون دلیل اندازهگیریشده تغییرش ندهید.
تغییر اندازه یا حذف Swap
sudo swapoff /swapfile
sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
اجرای swapoff محتوای Swap را به RAM برمیگرداند؛ اگر RAM آزاد کافی نباشد ممکن است ناموفق باشد یا OOM رخ دهد. این کار را در ساعات کمبار انجام دهید. برای حذف کامل، بعد از swapoff خط مربوط را از /etc/fstab پاک کنید و سپس فایل را حذف کنید.
zram؛ جایگزین فشرده در RAM
zram یک دستگاه Swap فشرده داخل خود RAM میسازد. چون داده فشرده میشود (معمولاً ۲ تا ۳ برابر)، حافظه مؤثر بیشتر میشود و سرعت آن بسیار بیشتر از Swap روی دیسک است. برای VPSهای کوچک با RAM کم گزینه خوبی است:
sudo apt install -y systemd-zram-generator
# در صورت نیاز فایل /etc/systemd/zram-generator.conf را ویرایش کنید
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0
swapon --show
نام پکیج در توزیعهای مختلف ممکن است متفاوت باشد (مثلاً zram-tools در Debian). zram و Swap File را میتوان همزمان داشت؛ با اولویت بالاتر برای zram.
پیدا کردن عامل مصرف حافظه
Swap فقط علامت را کنترل میکند. برای یافتن علت:
ps aux --sort=-%mem | head -n 10
sudo apt install -y htop && htop
- MySQL/MariaDB:
innodb_buffer_pool_sizeرا متناسب با RAM تنظیم کنید؛ راهنمای بهینهسازی MySQL. - PHP-FPM: مقدار
pm.max_childrenرا بر اساس مصرف هر پردازه محاسبه کنید. - Docker: برای کانتینرها محدودیت حافظه (
--memory) بگذارید. - مانیتورینگ: روند مصرف RAM را با ابزارهایی مثل Zabbix ثبت کنید تا قبل از OOM هشدار بگیرید.
سوالات متداول
Swap عمر SSD را کم میکند؟
با swappiness پایین و استفاده گاهبهگاه، نوشتن روی دیسک ناچیز است. اگر Swap دائماً پر و خالی میشود، مشکل اصلی کمبود RAM است، نه عمر دیسک.
Swap Partition بهتر است یا Swap File؟
در هستههای امروزی کارایی تقریباً یکسان است و Swap File انعطاف بیشتری دارد؛ بدون پارتیشنبندی مجدد میتوان اندازهاش را تغییر داد.
روی سرور Kubernetes هم Swap بسازم؟
Kubernetes بهطور سنتی نیاز داشت Swap خاموش باشد. نسخههای جدید پشتیبانی محدود از Swap دارند، اما فقط با تنظیم صریح kubelet. پیش از فعالسازی، مستندات نسخه خود را بخوانید.
با وجود Swap باز هم OOM میگیرم، چرا؟
یا Swap پر شده، یا سرویس با محدودیت حافظه cgroup (مثلاً در Docker یا systemd) اجرا میشود که مستقل از Swap سیستم است. محدودیت سرویس را بررسی کنید.
RAM بیشتر، بدون مهاجرت
اگر سرور دائماً به Swap تکیه میکند، وقت ارتقاست. سرور مجازی تراست هاست با دیسک NVMe و پلنهای متنوع RAM ارائه میشود و برای منابع تضمینشده، سرور اختصاصی مجازی را ببینید.