آموزش سرور

افزایش Swap در لینوکس؛ ساخت Swap File برای سرور مجازی کم‌رم

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

RAMCPUSwapFileآموزش سرورافزایش Swap در لینوکس؛ساخت Swap File برای سرورمجازی کم‌رممجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

Swap فضایی روی دیسک است که وقتی رم پر می‌شود، صفحه‌های کم‌استفادهٔ حافظه به آن منتقل می‌شوند تا برنامه‌ها به‌جای kill شدن ادامه دهند. روی سرور مجازی با fallocate یک فایل بسازید، مجوزش را ۶۰۰ کنید، با mkswap و swapon فعالش کنید و خطش را به /etc/fstab اضافه کنید تا پس از ری‌استارت بماند. Swap جایگزین رم نیست و فقط حاشیهٔ امن است؛ اگر سرور دائماً از Swap استفاده می‌کند، رم را ارتقا دهید.

Swap چیست و چرا روی سرور کم‌رم مهم است؟

رم سرور محدود است. وقتی برنامه‌ها بیش از رم موجود حافظه بخواهند، هستهٔ لینوکس دو راه دارد: یا صفحه‌هایی از حافظه را که کمتر استفاده می‌شوند به دیسک منتقل کند (همان Swap)، یا برنامه‌ای را به‌اجبار ببندد. دومی کار سازوکاری به نام OOM Killer است و معمولاً بزرگ‌ترین برنامه، یعنی اغلب دیتابیس یا برنامهٔ اصلی شما، قربانی می‌شود.

روی سرورهای مجازی با یک یا دو گیگابایت رم، یک دیتابیس، یک وب‌سرور و یک برنامهٔ Node.js یا پایتون به‌راحتی کل رم را پر می‌کنند؛ به‌خصوص هنگام نصب بسته‌ها، اجرای composer یا npm install و ساخت ایمیج داکر. Swap در این لحظه‌های اوج کوتاه‌مدت، حاشیهٔ امنی است که مانع از کار افتادن سرویس‌ها می‌شود.

وقتی رم پر می‌شود
حافظهانتقال صفحه‌هابرنامه‌هادرخواست حافظهٔ بیشتررمپر شدهSwap Fileصفحه‌های کم‌استفادهحافظهانتقال صفحه‌هابرنامه‌هادرخواست حافظهٔ بیشتررمپر شدهSwap Fileصفحه‌های کم‌استفاده
شکل ۱ با وجود Swap، هسته صفحه‌های کم‌استفاده را به دیسک می‌برد تا برنامه‌ها به‌جای kill شدن ادامه دهند.

اما یک نکته را از ابتدا در نظر داشته باشید: دیسک، حتی NVMe، بسیار کندتر از رم است. Swap برای جذب فشارهای گاه‌به‌گاه است، نه برای اجرای دائمی برنامه‌هایی که رم کافی ندارند. اگر نشانه‌های کمبود رم را می‌بینید، ابتدا مقالهٔ کمبود رم سرور و خطای Out of Memory را بخوانید.

گام ۱: بررسی وضعیت فعلی

ابتدا ببینید سرور Swap دارد یا نه و چقدر رم و دیسک آزاد دارید:

free -h
swapon --show
df -h /

اگر swapon --show چیزی نشان نداد و در خروجی free ردیف Swap صفر بود، سرور Swap ندارد. بسیاری از ایمیج‌های ابری سرور مجازی به‌طور پیش‌فرض Swap ندارند.

گام ۲: ساخت Swap File

روی سرورهای مجازی، ساخت فایل Swap ساده‌تر و انعطاف‌پذیرتر از پارتیشن Swap است؛ بعداً به‌راحتی بزرگ یا کوچکش می‌کنید. مثلاً برای ساخت فایل دو گیگابایتی:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show

مجوز 600 ضروری است؛ Swap ممکن است بخش‌هایی از حافظهٔ برنامه‌ها، از جمله رمزها، را نگه دارد و نباید برای کاربران دیگر قابل‌خواندن باشد.

اگر fallocate خطا داد (روی برخی سیستم‌فایل‌ها پشتیبانی نمی‌شود)، از dd استفاده کنید که کندتر اما همه‌جا کار می‌کند:

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

روی سیستم‌فایل Btrfs ساخت Swap File روش خاص خود را دارد؛ اما روی ext4 که پیش‌فرض اغلب سرورهاست، همین دستورها کافی است.

گام ۳: دائمی کردن Swap

Swapی که با swapon فعال کرده‌اید پس از ری‌استارت از بین می‌رود. برای دائمی کردن، خط آن را به /etc/fstab اضافه کنید:

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

پیش از ری‌استارت، از سالم بودن fstab مطمئن شوید؛ خطا در این فایل می‌تواند بوت سرور را مختل کند:

sudo findmnt --verify
root@server: ~
$ fallocate -l 2G /swapfile && chmod 600 /swapfile$ mkswap /swapfileSetting up swapspace version 1, size = 2 GiB ...$ swapon /swapfile$ echo '/swapfile none swap sw 0 0' >> /etc/fstab$ free -h | grep SwapSwap:  2.0Gi   0B   2.0Gi$ 
شکل ۲ پنج دستور برای ساخت، فعال‌سازی و دائمی کردن یک Swap File دو گیگابایتی.

چقدر Swap لازم است؟

قاعدهٔ قدیمی «دو برابر رم» برای سرورهای امروزی منسوخ است. پیشنهادهای عملی:

رم سرور Swap پیشنهادی
۱ گیگابایت ۱ تا ۲ گیگابایت
۲ گیگابایت ۲ گیگابایت
۴ تا ۸ گیگابایت ۲ تا ۴ گیگابایت
بیش از ۸ گیگابایت ۲ تا ۴ گیگابایت، فقط به‌عنوان حاشیهٔ امن

روی سرورهای با دیسک کم (مثلاً ده گیگابایت) مراقب باشید Swap بخش زیادی از فضای دیسک را نگیرد؛ پر شدن دیسک خودش مشکل بزرگ‌تری است.

گام ۴: تنظیم swappiness

پارامتر vm.swappiness (عددی بین صفر و صد) تعیین می‌کند هسته چقدر تمایل دارد صفحه‌های حافظه را به Swap ببرد. مقدار پیش‌فرض معمولاً ۶۰ است که برای دسکتاپ مناسب است. برای سرورها مقدار کمتر، مثلاً ۱۰، باعث می‌شود Swap فقط وقتی رم واقعاً کم آمده استفاده شود:

cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

پارامتر دیگری به نام vm.vfs_cache_pressure هم وجود دارد که تمایل هسته به آزادسازی کش اطلاعات فایل‌ها را تنظیم می‌کند؛ برای بیشتر سرورها نیازی به تغییر آن نیست.

بزرگ کردن یا حذف Swap

برای تغییر اندازه، Swap را غیرفعال کنید، فایل را دوباره بسازید و فعال کنید:

sudo swapoff /swapfile
sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

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

zram: Swap فشرده در خود رم

zram بخشی از رم را به یک دستگاه Swap فشرده تبدیل می‌کند. چون داده‌ها فشرده می‌شوند، عملاً حافظهٔ بیشتری در اختیار دارید و سرعتش بسیار بیشتر از Swap روی دیسک است. روی سرورهای خیلی کم‌رم، ترکیب zram با یک Swap File کوچک انتخاب خوبی است. در اوبونتو با بستهٔ zram-tools یا systemd-zram-generator فعال می‌شود. هزینهٔ آن کمی مصرف CPU برای فشرده‌سازی است.

Swap روی دیسک یا zram؟
Swap File
  • روی دیسک ساخته می‌شود
  • ظرفیت زیاد با هزینهٔ کم
  • کندتر از رم
  • مناسب حاشیهٔ امن
در برابر
zram
  • بخشی از رم به‌صورت فشرده
  • بسیار سریع‌تر از دیسک
  • کمی CPU مصرف می‌کند
  • مناسب سرورهای خیلی کم‌رم
شکل ۳ روی سرورهای کم‌رم، ترکیب zram و یک Swap File کوچک تعادل خوبی میان سرعت و ظرفیت است.

پایش استفاده از Swap

بعد از فعال‌سازی، رفتار سرور را زیر نظر بگیرید:

free -h
vmstat 2 5

در خروجی vmstat، ستون‌های si و so نشان می‌دهند در هر لحظه چقدر داده از Swap خوانده یا در آن نوشته می‌شود. اگر Swap کمی پر است ولی si و so اغلب صفرند، همه‌چیز طبیعی است؛ هسته صفحه‌های بی‌استفاده را آنجا گذاشته است. اما اگر این دو ستون مدام عدد دارند، سرور در حال «Thrashing» است: دائماً بین رم و دیسک جابه‌جا می‌کند و همه‌چیز کند می‌شود. این نشانهٔ قطعی کمبود رم است.

Swap و برنامه‌های خاص: دیتابیس، داکر و جاوا

همهٔ برنامه‌ها رفتار یکسانی با Swap ندارند و دانستن چند نکته از غافلگیری جلوگیری می‌کند:

  • دیتابیس‌ها: MySQL، MariaDB و PostgreSQL برای کارایی به کش حافظهٔ خودشان (مثل innodb_buffer_pool_size یا shared_buffers) وابسته‌اند. اگر این کش‌ها را بزرگ‌تر از رم واقعی تنظیم کنید، بخشی از آن‌ها به Swap می‌رود و کوئری‌ها به‌شدت کند می‌شوند. اندازهٔ کش دیتابیس را با رم واقعی سرور تنظیم کنید، نه با مجموع رم و Swap.
  • کانتینرهای داکر: اگر برای کانتینری سقف حافظه تعیین کنید، داکر به‌طور پیش‌فرض اجازه می‌دهد آن کانتینر به همان اندازه از Swap هم استفاده کند. با گزینهٔ memory-swap می‌توانید این رفتار را کنترل کنید.
  • برنامه‌های جاوا و Node.js: این برنامه‌ها حافظه را با سازوکار جمع‌آوری زباله (Garbage Collection) مدیریت می‌کنند. وقتی بخشی از حافظهٔ آن‌ها در Swap باشد، هر بار جمع‌آوری زباله باید آن را از دیسک بخواند و مکث‌های طولانی ایجاد می‌شود. سقف حافظهٔ این برنامه‌ها را کمتر از رم آزاد تنظیم کنید.

به‌طور خلاصه، Swap باید جای صفحه‌هایی باشد که واقعاً کم‌استفاده‌اند؛ هر برنامه‌ای که داده‌های داغ و پرتکرارش در Swap بیفتد، کند خواهد شد.

Swap یا ارتقای رم؟

Swap برای اوج‌های کوتاه است. اگر برنامه‌های شما در حالت عادی بیش از رم موجود حافظه لازم دارند، تنها راه‌حل واقعی رم بیشتر یا کاهش مصرف برنامه‌هاست. برای تخمین منابع لازم بر اساس نوع کار، راهنمای انتخاب رم و CPU سرور را ببینید. چون سرورهای کلودیفای ساعتی حساب می‌شوند، می‌توانید پلن بزرگ‌تر را چند ساعت امتحان کنید و اگر بهبود محسوس بود روی آن بمانید؛ پلن‌ها را در صفحهٔ سرور مجازی ایران ببینید. برای دستورهای پایهٔ مانیتورینگ هم دستورات پرکاربرد لینوکس مفید است.

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

آیا Swap سرعت سرور را کم می‌کند؟

وجود Swap به‌تنهایی سرور را کند نمی‌کند. کندی وقتی رخ می‌دهد که رم واقعاً کم باشد و سرور دائماً بین رم و Swap داده جابه‌جا کند. در این حالت مشکل کمبود رم است، نه Swap.

Swap File بهتر است یا پارتیشن Swap؟

روی سرور مجازی Swap File ساده‌تر است و بدون تغییر پارتیشن‌ها قابل بزرگ و کوچک کردن است. تفاوت کارایی این دو روی سیستم‌فایل ext4 در عمل ناچیز است.

چرا بعد از ری‌استارت Swap ناپدید شد؟

احتمالاً خط آن را در /etc/fstab اضافه نکرده‌اید. swapon فقط تا ری‌استارت بعدی اثر دارد. خط /swapfile none swap sw 0 0 را به fstab اضافه کنید و با findmnt --verify بررسی کنید.

آیا روی سرور با دیسک SSD استفاده از Swap ضرر دارد؟

SSDهای امروزی برای حجم نوشتن معمول Swap ساخته شده‌اند. با swappiness پایین، Swap فقط هنگام نیاز واقعی استفاده می‌شود و فرسایش قابل‌توجهی ایجاد نمی‌کند.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.