
به اشتراک بگذارید

به اشتراک بگذارید
قاعدهای که در انجمنها زیاد تکرار میشود میگوید Swap باید دو برابر رم باشد. پیش از ساخت Swap در لینوکس روی یک VPS با یک یا دو گیگابایت رم، این قاعده و سه باور رایج دیگر را با متن کرنل و مستندات Red Hat و util-linux سنجیدیم. برای چنین سروری یک فایل دو تا چهار گیگابایتی کافی است، به شرط اینکه حفره نداشته باشد و در fstab ثبت شود.
| باور | حکم مستند |
|---|---|
| اندازه Swap همیشه دو برابر رم | جدول Red Hat دو برابر را فقط برای رم کمتر از 2 GiB میآورد |
| با fallocate هر جایی فایل Swap ساخته میشود | فایل حفرهدار رد میشود و Btrfs فایل nocow میخواهد |
| مقدار swappiness صفر یعنی Swap خاموش | کرنل در صفر هم زیر فشار حافظه سراغ Swap میرود |
| حافظه Swap روی NVMe دیسک را از کار میاندازد | فرسایش به حجم نوشتن بستگی دارد |
💡 دو تا چهار گیگابایت برای سرور یک یا دو گیگی
فایل Swap فضایی روی دیسک است که کرنل صفحههای کماستفاده حافظه را به آن میبرد.
✅ جدول Red Hat برای رم یک گیگابایت دو گیگابایت Swap میدهد و برای رم دو گیگابایت، بسته به عدد free -h، دو تا چهار گیگابایت.
✅ اگر systemd-detect-virt کلمه lxc یا openvz برگرداند، Swap را معمولاً میزبان تعیین میکند.
هیچ باوری بدون سطری از متن کرنل یا man page حکم نگرفته است. روی سروری که برای نصب وردپرس روی سرور مجازی آماده میکنید، این فایل را پیش از راهاندازی پایگاه داده بسازید.
📌 دو برابر رم، fallocate، swappiness صفر، NVMe
◀️ اندازه درست Swap
◀️ چهار فرمان و خط fstab
◀️ معنای swappiness صفر
◀️ استهلاک NVMe و حذف Swap

قاعده دو برابر رم امروز فقط برای سرورهای زیر 2 GiB با جدول Red Hat جور درمیآید. در ساخت Swap در لینوکس روی VPS، اندازه را از جدول توزیع و رفتار بار کاری بگیرید؛ یک ضریب ثابت برای همه سرورها جواب نمیدهد.
باور: هر سروری Swap دو برابر رم میخواهد.
مستند: راهنمای مدیریت Swap در Red Hat Enterprise Linux 9 ضریب دو را فقط برای رم کمتر از 2 GiB میآورد.
| مقدار رم | مقدار Swap پیشنهادی | اگر Hibernation لازم باشد |
|---|---|---|
| کمتر از 2 GiB | دو برابر رم | سه برابر رم |
| بین 2 تا 8 GB | برابر رم | دو برابر رم |
| بین 8 تا 64 GB | دستکم 4 GB | ۱٫۵ برابر رم |
| بیش از 64 GiB | وابسته به بار کاری، دستکم 4 GiB | توصیه نمیشود |
ستون سوم برای Hibernation است و روی VPS کسی سرور را به خواب زمستانی نمیبرد؛ ستون دوم ملاک شماست. سرور دو گیگابایتی اگر در free -h کمی کمتر از 2Gi نشان دهد، در ردیف اول میافتد و چهار گیگابایت Swap هم با جدول جور است.
حکم: نیمهدرست؛ دو برابر فقط زیر 2 GiB (Red Hat)
🔸 کرنل بین کش و Swap چطور سبکسنگین میکند
حافظه Swap انباری زیرزمین ساختمان است: وسایل کممصرف پایین میروند تا خانه جا داشته باشد، ولی آوردنشان وقت میگیرد. swappiness میزان رغبت کرنل به پایین بردن وسایل است. مستندات کرنل لینوکس دقیقترش را میگوید: عددی بین 0 تا 200 برای هزینه نسبی IO در Swap و در صفحههای فایل. در 100 هر دو همهزینهاند و پیشفرض 60 است.
برای ساخت Swap در لینوکس روی ext4 یا XFS چهار فرمان کافی است: dd فایل را میسازد، chmod آن را خصوصی میکند، mkswap امضای Swap را مینویسد و swapon روشنش میکند. ترتیب ما chmod را پیش از mkswap میگذارد تا هشدار مجوز نیاید؛ Red Hat همین کارها را با mkswap پیش از chmod انجام میدهد.
پیش از نوشتن فایل، Swap فعلی، جای خالی دیسک و نوع فایلسیستم ریشه را ببینید:
swapon --show
free -h
df -h /
findmnt -no FSTYPE /
اگر Swap فعالی هست، روی آن ننویسید؛ بزرگش کنید یا اسم دیگری بگذارید. دیسک باید از اندازه فایل جای خالی بیشتری داشته باشد و اگر findmnt کلمه btrfs داد، اول کادر هشدار Btrfs را بخوانید:
sudo dd if=/dev/zero of=/swapfile bs=1MiB count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
فرمان dd صفر واقعی مینویسد، پس فایل حفره ندارد. در محیط آزمایشی ما (Ubuntu 24.04 با ext4 و util-linux 2.39.3) فایلی بدون chmod، هشدار insecure permissions 0644 را از mkswap گرفت. فایلی که همه بخوانند، تکههایی از حافظه پروسهها را لو میدهد.
باور: فرمان fallocate همه جا همان نتیجه dd را سریعتر میدهد.
مستند: بخش NOTES در man page فرمان swapon میگوید swapon فایل حفرهدار را رد میکند. فایل fallocate بسته به فایلسیستم ممکن است حفرهدار تلقی شود و قابلحملترین راه dd است. Red Hat روی ext4 و XFS همان fallocate را ترجیح میدهد.
در همان محیط، فایل fallocate بیخطا فعال شد. فایلی را که با truncate ساختیم، swapon با پیام skipping - it appears to have holes کنار گذاشت.
حکم: نادرست؛ جای مطمئنش ext4 و XFS است (swapon(8))
⚠️ فایلسیستم Btrfs و فایلهای حفرهدار
بر اساس مستندات Btrfs، فایل Swap روی Btrfs از کرنل 5.0 کار میکند. فایل باید NODATACOW و بدون فشردهسازی، و فایلسیستم تکدیسکی با یک data profile باشد؛ از subvolume حاوی Swap فعال هم snapshot نمیشود گرفت. همین مستندات فایل Swap را بهویژه روی فایلسیستم ریشه توصیه نمیکند. از btrfs-progs 6.1، sudo btrfs filesystem mkswapfile --size 2G /swapfile فایل را میسازد و فعال کردنش هنوز با swapon و خط fstab است. فرمان mkswap با گزینه --file هم از util-linux 2.41 ویژگی nocow را میگذارد.
برای ماندگاری بعد از ریبوت، از fstab نسخه پشتیبان بگیرید و خط Swap را به انتهایش اضافه کنید:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab
sudo systemctl daemon-reload
✅ آزمودن خط fstab بدون ریبوت
شکل این خط و daemon-reload از مستندات Red Hat است. فایلی که الان فعال است چیزی درباره fstab ثابت نمیکند؛ با sudo swapoff /swapfile && sudo swapon -a بگذارید swapon آن را از روی fstab روشن کند. اگر swapon --show دوباره فایل را نشان داد، خط درست است.

خیر. متن کرنل میگوید در swappiness صفر، هسته تا وقتی صفحههای آزاد و فایلدار از واترمارک بالای یک zone پایینتر نروند Swap را شروع نمیکند. پس زیر فشار حافظه هنوز Swap میکند. خاموشی واقعی کار swapoff است.
باور: با swappiness برابر صفر، کرنل دیگر به Swap دست نمیزند.
مستند: فایل vm در مستندات کرنل صفر را فقط آستانه شروع Swap میداند. مقدار بهینه هم به گفته همان متن به بار کاری بستگی دارد و با آزمایش پیدا میشود.
حکم: نادرست (Documentation for /proc/sys/vm)
تنظیم swappiness قدم آخر ساخت Swap در لینوکس است. اگر مقدار فعلی جز 60 بود، یک فایل sysctl یا ابزار توزیع آن را عوض کرده است. عدد 10 در فرمان زیر از هیچ منبعی نیامده و فقط نقطه شروع آزمایش ماست:
cat /proc/sys/vm/swappiness
sudo sysctl -w vm.swappiness=10
اگر سرور چند روز با این عدد خوب کار کرد، ماندگارش کنید:
grep -rn swappiness /etc/sysctl.conf /etc/sysctl.d/
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/90-swappiness.conf
sudo sysctl --system
فرمان grep از اسم فایل مهمتر است. به گفته man page فایل sysctl.d، وقتی چند فایل یک گزینه را تعیین کنند، نام الفبایی آخر برنده است. در Ubuntu 24.04 پیوند 99-sysctl.conf به /etc/sysctl.conf بعد از فایل شما میآید و sysctl --system هم sysctl.conf را آخر میخواند. پس هر خط vm.swappiness قدیمی را از آنجا پاک کنید.

حافظه Swap روی NVMe فقط وقتی دیسک را میفرساید که کرنل مدام در آن بنویسد، پس ترس از فرسایش بهتنهایی دلیلی برای کنار گذاشتن ساخت Swap در لینوکس نیست. سازندههایی مثل Kingston دوام SSD سرور را با مشخصه TBW اعلام میکنند.
باور: فایل Swap روی SSD عمر دیسک را میخورد.
مستند: دوام SSD با حجم داده نوشتهشده سنجیده میشود و فایل Swap فقط وقتی سهم دارد که کرنل در آن بنویسد. ستون so در vmstat همین حجم را نشان میدهد.
vmstat 5
ستون swpd مقدار Swap مصرفشده است و si و so حجم خواندهشده و نوشتهشده در هر ثانیه. قاعده سرانگشتی ما: اگر so چند دقیقه پشت سر هم صفر نماند، سرور بیش از ظرفیت رمش کار میکند و وقت حسابوکتاب انتخاب رم سرور مجازی رسیده است.
حکم: نیمهدرست؛ فرسایش به حجم نوشتن بستگی دارد (vmstat(8)، Kingston)
بعد از ارتقای رم یا برای ساختن دوباره فایل، اول با free -h ببینید رم در دسترس از Swap مصرفشده بیشتر باشد. man page فرمان swapon برای کمبود حافظه هنگام swapoff کد خروج جداگانه دارد:
sudo swapoff /swapfile را بزنید و با swapon --show ببینید فهرست خالی است./swapfile را از /etc/fstab پاک کنید.sudo rm /swapfile حذف کنید.ستون used در ردیف Swap خروجی free -h بیشتر این سؤالها را پیش میآورد.
روی VPS فایل عملیتر است، چون تغییر اندازهاش پارتیشنبندی دوباره نمیخواهد.
فرمان swapon --show فضاهای Swap فعال را با اندازه و مصرف نشان میدهد؛ خروجی خالی یعنی Swap ندارید.
با رم آزاد کافی، فایل را با swapoff خاموش کنید، با dd و count بزرگتر از نو بسازید و دوباره mkswap و swapon بزنید. خط fstab دست نمیخورد.
احتمالش کم میشود ولی صفر نمیشود؛ اگر رم و Swap هر دو پر شوند، OOM killer باز سراغ پروسه بزرگ میرود.
فایل بلوک تخصیصنیافته دارد، معمولاً چون با truncate یا cp ساخته شده است. آن را با dd از نو بسازید؛ روی Btrfs از روش nocow استفاده کنید.
در کانتینر، کرنل مال میزبان است و مستندات Proxmox، Swap کانتینر LXC را سهمی از Swap میزبان میداند. مقدارش را از ارائهدهنده بخواهید.
مستندات کرنل عدد واحدی نمیدهد. عددی پایینتر از 60 را امتحان کنید و چند روز ستونهای si و so را در vmstat ببینید.
جمعبندی؛ ساخت Swap در لینوکس با باورهای سنجیده از چهار باور رایج، دو تا نادرست و دو تا نیمهدرست درآمدند. برای سرور یک گیگابایتی جدول Red Hat به دو گیگابایت Swap میرسد و برای سرور دو گیگابایتی به دو تا چهار گیگابایت. پیش از ساخت، Swap فعلی و نوع فایلسیستم را ببینید، فایل را با dd بسازید، مجوزش را 600 کنید و خط fstab را با swapon -a بیازمایید. روی Btrfs شرطهای nocow را رعایت کنید. swappiness صفر Swap را خاموش نمیکند؛ عددتان را بیازمایید و با vmstat نوشتن در Swap را زیر نظر بگیرید.
🚀 ادامه کار روی همان سرور
با Swap ثبتشده در fstab، پایگاه داده وردپرس دیگر بیپشتوانه بالا نمیآید. نوبت Nginx و PHP-FPM است.
سرور شما چند گیگابایت رم و چقدر Swap دارد، و OOM killer آخرین بار کدام پروسه را قربانی کرد؟