ساخت Swap در لینوکس: فایل swap، swappiness و zram

برای ساخت 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 کوچک، مثلاً ۲ گیگابایت، حاشیه امن می‌دهد. اگر برنامه‌ای مثل دیتابیس دارید، اول مصرف حافظه‌اش را تنظیم کنید.

منابع