برای ساخت Swap در لینوکس سادهترین راه یک فایل swap است: فایلی به اندازه دلخواه میسازید، دسترسی آن را فقط برای root میگذارید، با mkswap قالببندی میکنید، با swapon فعالش میکنید و برای ماندن بعد از ریاستارت در فایل /etc/fstab ثبتش میکنید. این کار چند دقیقه طول میکشد و نیاز به ریاستارت ندارد.
Swap جای حافظه کافی را نمیگیرد. دیسک خیلی کندتر از RAM است، پس سروری که مدام swap میکند کند میشود. Swap بیشتر برای جلوگیری از کشته شدن پروسهها هنگام اوجهای کوتاه مصرف و برای نگهداری صفحههای کماستفاده خارج از RAM مفید است. اگر همیشه حافظه کم میآورید، راه درست کم کردن مصرف یا افزایش RAM است. دستورهای بررسی در دستورات مانیتورینگ سرور لینوکس آمده است.
مرحله اول: ببینید Swap دارید یا نه
swapon --show
free -hاگر swapon خروجی ندارد و در free مقدار Swap صفر است، سرور swap ندارد. بعضی سرورهای مجازی بدون swap تحویل میشوند. اندازه حافظه و دیسک را هم ببینید، چون فایل swap از فضای دیسک میگیرد: df -h.
چقدر Swap لازم است؟
عدد ثابتی وجود ندارد. قاعدههای رایج به حافظه بستگی دارند. برای حافظه کم، مثل ۱ تا ۲ گیگابایت، معمولاً swap برابر یا دو برابر RAM میگذارند. برای حافظه متوسط، مثل ۴ تا ۸ گیگابایت، اندازهای برابر نصف تا برابر RAM. و برای سرورهای پرحافظه، مقدار کمتر، مثلاً ۲ تا ۴ گیگابایت، کافی است مگر اینکه هیبرنیت لازم باشد. اینها راهنمای تقریبیاند. اگر برنامهای مثل دیتابیس روی سرور دارید، اول مصرف حافظه را کم کنید و swap را فقط بهعنوان حاشیه امن بگذارید.
ساخت Swap در لینوکس: مرحله دوم، فایل swap
مثال برای ۲ گیگابایت:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileچهار دستور بهترتیب: ساخت فایل، محدود کردن دسترسی به root (مهم است، چون محتوای swap شامل داده حافظه است)، قالببندی و فعالسازی. اگر fallocate روی فایلسیستم شما خطا داد، مثلاً روی بعضی فایلسیستمها، بهجای آن از dd استفاده کنید:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressبعد همان سه دستور chmod، mkswap و swapon را بزنید. با swapon --show و free -h مطمئن شوید فعال شده است.
مرحله سوم: ماندن بعد از ریاستارت
اگر در fstab ثبت نکنید، بعد از ریاستارت سرور swap فعال نمیشود. یک خط به فایل اضافه کنید:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabپیش از ریاستارت، درستی fstab را بررسی کنید. خطا در این فایل میتواند بوت سرور را مختل کند:
sudo swapoff /swapfile
sudo swapon -a
swapon --showاگر swapon -a بدون خطا swap را فعال کرد، خط fstab درست است.
تنظیم swappiness
پارامتر vm.swappiness تعیین میکند هسته چقدر مایل است صفحههای حافظه را به swap ببرد. مقدار پیشفرض معمولاً ۶۰ است. روی سرورهای دیتابیس و وب، مقدار کمتر، مثلاً ۱۰، باعث میشود تا وقتی حافظه واقعاً کم نیامده، از swap کمتر استفاده شود. مقدار فعلی را ببینید و موقت عوض کنید:
cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10برای ماندن بعد از ریاستارت، در فایل /etc/sysctl.d/99-swappiness.conf بنویسید:
vm.swappiness=10این عدد فقط نقطه شروع است و مقدار مناسب به بار کاری سرور بستگی دارد. تغییرات را با پایش مصرف swap بسنجید.
بزرگ کردن یا حذف swap
برای بزرگ کردن فایل swap، اول آن را غیرفعال کنید، فایل جدید با اندازه تازه بسازید و دوباره فعال کنید:
sudo swapoff /swapfile
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfileبرای حذف کامل: swapoff را بزنید، خط مربوطه را از /etc/fstab پاک کنید و فایل را حذف کنید (sudo rm /swapfile). اگر حافظه آزاد کافی نیست، swapoff ممکن است طولانی شود یا ناموفق باشد، چون باید محتوای swap به RAM برگردد.
Swap روی پارتیشن یا LVM
بهجای فایل میتوانید پارتیشن یا Logical Volume مخصوص swap داشته باشید. عملکرد فایل swap روی فایلسیستمهای معمول، مثل ext4 و XFS، با پارتیشن تفاوت محسوسی ندارد، ولی بعضی فایلسیستمها، مثل Btrfs و ZFS، برای فایل swap محدودیت یا نیاز به تنظیم ویژه دارند. روش افزایش فضای LVM در افزایش حجم دیسک لینوکس با LVM آمده است. روی سرورهای مجازی کانتینری (مثل LXC) معمولاً swap از طرف میزبان مدیریت میشود و در خود کانتینر نمیتوان فایل swap ساخت.
ZRAM: فشردهسازی در حافظه
یک روش دیگر zram است: بخشی از RAM بهصورت دستگاه swap فشرده در حافظه تعریف میشود. اگر دیسک کند است یا حافظه کم است، zram میتواند کمک کند، چون فشردهسازی از نوشتن روی دیسک سریعتر است. در Ubuntu بسته zram-config و در بعضی توزیعها systemd-zram-generator موجود است. این کار جای RAM کافی را نمیگیرد و فقط حاشیه امن بیشتری میدهد.
بررسی مصرف swap
free -h
vmstat 1 5
swapon --showستونهای si و so در خروجی vmstat مقدار دادهای است که در ثانیه از swap خوانده یا به آن نوشته میشود. اگر این اعداد مدام صفر نیستند، سرور فعالانه swap میکند و کند است. برای دیدن اینکه کدام پروسه بیشتر swap استفاده میکند:
for f in /proc/[0-9]*/status; do awk '/^Name|^VmSwap/{printf $2" "$3} END{print ""}' $f; done | sort -k3 -n -r | headخطاهای رایج
| نشانه | علت و راه حل |
|---|---|
swapon: /swapfile: insecure permissions | دسترسی فایل باید 600 باشد؛ chmod 600 بزنید |
fallocate failed: Operation not supported | فایلسیستم پشتیبانی نمیکند؛ با dd بسازید |
| بعد از ریاستارت swap نیست | خط fstab ثبت نشده یا اشتباه است |
swapon: ... skipping - it appears to have holes | فایل با روش نادرست ساخته شده؛ با dd دوباره بسازید |
| سرور با وجود swap کند است | مصرف حافظه بالاست؛ علت پر شدن RAM را پیدا کنید |
| OOM Killer پروسهها را میکشد | حافظه و swap هر دو پر شده؛ مصرف را کم یا منابع را بیشتر کنید |
اگر پروسهها هنگام کمبود حافظه کشته میشوند، این موضوع میتواند علت خطاهایی مثل 502 باشد؛ عیبیابی آن در خطای 502 Bad Gateway آمده است.
سوالات متداول
ساخت Swap در لینوکس روی سرور مجازی لازم است؟
مفید است، مخصوصاً با حافظه کم. بدون swap، هنگام کمبود حافظه OOM Killer پروسهها را مستقیم میکشد. با swap مقداری حاشیه دارید. ولی نباید جای حافظه کافی را بگیرد.
فایل swap روی SSD آسیب میزند؟
استفاده معمول و گاهبهگاه مشکلی نمیسازد. SSD امروزی دوام کافی دارد و swap در سروری که حافظه کافی دارد، کم استفاده میشود.
فرق swap فایل و پارتیشن چیست؟
در فایلسیستمهای رایج عملکرد تقریباً یکی است. فایل swap انعطاف بیشتری دارد، چون اندازهاش را بدون تغییر پارتیشنبندی عوض میکنید.
با ۸ گیگابایت RAM هم Swap لازم است؟
الزامی نیست، ولی یک swap کوچک، مثلاً ۲ گیگابایت، حاشیه امن میدهد. اگر برنامهای مثل دیتابیس دارید، اول مصرف حافظهاش را تنظیم کنید.





