یکی از راه های محافظت در برابر خطاهای اتمام حافظه در برنامه ها ، اضافه کردن فضای Swap به سرور مجازی شما است. در این راهنما نحوه اضافه کردن فایل swap به یک سرور مجازی Ubuntu 20.04 را پوشش خواهیم داد.
هشدار: اگرچه Swap برای سیستم هایی که از هارد دیسک های معمول چرخشی استفاده میکنند ، توصیه میشود اما قرار دادن Swap در SSD ها می تواند با گذشت زمان مشکلاتی را برای تخریب سخت افزار ایجاد کند. به همین دلیل ، ما امکان فعال کردن Swap در vpsgol یا هر ارائه دهنده دیگری که از حافظه SSD استفاده می کند را توصیه نمی کنیم.
Swap چیست؟
Swap بخشی از حافظه هارد دیسک است که برای سیستم عامل کنار گذاشته شده است تا داده هایی را که دیگر نمی تواند در RAM نگهداری کند ، به طور موقت ذخیره کند. این به شما امکان می دهد مقدار اطلاعاتی را که سرور مجازی شما می تواند در حافظه کاری خود نگه دارد افزایش یابد. فضای Swap در هارد دیسک عمدتاً زمانی استفاده می شود که دیگر فضای کافی در حافظه رم برای نگهداری داده های برنامه وجود نداشته باشد.
اطلاعات ارسال شده روی دیسک به طور قابل توجهی کندتر از اطلاعات موجود در RAM خواهد بود ، اما سیستم عامل ترجیح می دهد داده های برنامه را در حافظه نگه داشته و از داده های قدیمی تر swap استفاده کند. به طور کلی ، داشتن فضای Swap به عنوان fallback برای زمانی که رم رو به اتمام است، می تواند یک شبکه ایمنی مناسب در برابر استثناهای اتمام حافظه در سیستم های با حافظه غیر SSD باشد.
مرحله 1 – بررسی سیستم برای اطلاعات Swap
قبل از شروع ، می توانیم بررسی کنیم که آیا سیستم از قبل فضای Swap در دسترس دارد یا خیر. ممکن است چندین فایل Swap یا پارتیشن swap داشته باشد ، اما به طور کلی یکی از آنها کافی می باشد.
با تایپ کردن این دستور می توانیم ببینیم که آیا این سیستم Swap پیکربندی شده دارد:
$ sudo swapon –show

اگر هیچ خروجی دریافت نکردید ، بدان معنی است که سیستم شما در حال حاضر فضای Swap در دسترس ندارد.
با استفاده از ابزار free می توانید تأیید کنید که هیچ Swap فعالی وجود ندارد:
$ free -h

Output
total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B

همانطور که در ردیف Swap خروجی مشاهده می کنید ، هیچ Swap روی سیستم فعال نیست.
مرحله 2 – بررسی فضای موجود در پارتیشن هارد دیسک
قبل از ایجاد فایل Swap ، استفاده فعلی دیسک خود را بررسی خواهیم کرد تا مطمئن شویم که فضای کافی داریم. این کار را با وارد کردن دستور زیر انجام دهید:
$ df -h

Output
Filesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000

دستگاه با / در ستون Mounted on در این مورد دیسک ماست. در این مثال فضای زیادی در دسترس داریم (فقط از 1.4گیگ استفاده شده است). استفاده شما احتمالاً متفاوت خواهد بود.
اگرچه نظرات زیادی در مورد اندازه مناسب فضای swap وجود دارد ، اما واقعاً بستگی به ترجیحات شخصی شما و نیازهای برنامه شما دارد. به طور کلی ، مقداری برابر یا دو برابر مقدار RAM روی سیستم مناسب خواهد بود. یک قانون دیگر این است که اگر فقط از آن به عنوان fallback رم استفاده کنید ، احتمالاً چیزی بیش از 4 گیگ Swapنیاز نمیباشد.
مرحله 3 – ایجاد فایل swap
اکنون که فضای هارد دیسک موجود خود را می دانیم ، می توانیم یک فایل swap در سیستم فایل خود ایجاد کنیم. ما فایلی را به اندازه ای که می خواهیم به نام swapfile  در دیرکتوری ریشه (/)خود قرار خواهیم داد.
بهترین راه برای ایجاد فایل swap با برنامه fallocate است. این دستور بلافاصله یک فایل با اندازه مشخص ایجاد می کند.
از آنجا که سرور مجازی در مثال ما 1 گیگ RAM دارد ، ما یک فایل 1 گیگی را در این راهنما ایجاد خواهیم کرد. این رم را متناسب با نیازهای سرور مجازی خود تنظیم کنید:
$ sudo fallocate -l 1G /swapfile

با تایپ این دستور می توانیم تأیید کنیم که مقدار صحیح فضا محفوظ است:
$ ls -lh /swapfile

$ -rw-r–r– 1 root root 1.0G Apr 25 11:14 /swapfile

فایل ما با مقدار صحیحی از فضای کنار گذاشته شده ایجاد شده است.
مرحله 4 – فعال کردن فایل swap
اکنون که فایلی با اندازه مناسب در دسترس داریم ، باید در عمل این را به فضای swap تبدیل کنیم.
ابتدا باید مجوزهای فایل را قفل کنیم تا فقط کاربرانی که دارای حق امتیاز هستند بتوانند مطالب را بخوانند. این کار مانع از دسترسی کاربران عادی به فایل می شود که پیامدهای امنیتی قابل توجهی دارد.
با تایپ کردن دستور زیر فایل فقط در دسترس ریشه قرار میگیرد:
$ sudo chmod 600 /swapfile

تغییر مجوزها را با تایپ دستور زیر تأیید کنید:
$ ls -lh /swapfile

Output
-rw——- 1 root root 1.0G Apr 25 11:14 /swapfile

همانطور که مشاهده می کنید ، فقط کاربر اصلی دارای پرچم های خواندن و نوشتن است.
اکنون می توانیم با تایپ کردن این دستور فایل را به عنوان فضای swap مشخص کنیم:
$ sudo mkswap /swapfile

Output
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

پس از علامت گذاری فایل ، می توانیم فایل swap را فعال کنیم و به سیستم ما امکان استفاده از آن را می دهد:
$ sudo swapon /swapfile

با تایپ این دستور تأیید کنید که swap در دسترس است:
$ sudo swapon –show

Output
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
ما می توانیم بازده ابزار free را دوباره بررسی کنیم تا یافته هایمان را تأیید کنیم:
$ free -h

Output
total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi

swap ما با موفقیت تنظیم شده است و سیستم عامل ما در صورت وم شروع به استفاده از آن خواهد کرد.
مرحله 5 – دائمی کردن فایل Swap
تغییرات اخیر ما فایل Swap بخش فعلی را فعال کرده است. اما اگر راه اندازی مجدد کنیم ، سرور مجازی تنظیمات swap را به طور خودکار حفظ نمی کند. ما می توانیم با اضافه کردن فایل swap به فایل / etc / fstab خود ، این تنظیمات را تغییر دهیم.
از فایل / etc / fstab نسخه پشتیبان تهیه کنید تا در صورت بروز هرگونه خطا با مشکلی مواجه نشوید:
$ sudo cp /etc/fstab /etc/fstab.bak

با تایپ کردن این دستور اطلاعات فایل swap را به انتهای فایل / etc / fstab خود اضافه کنید:
$ echo ‘/swapfile none swap sw 0 0’ | sudo tee -a /etc/fstab

در مرحله بعدی برخی از تنظیماتی را میتوانیم به روز کنیم بررسی مینماییم تا فضای swap خود را تنظیم کنیم.
مرحله 6 – تنظیمات swap خود را تعیین کنید
چند گزینه وجود دارد که می توانید پیکربندی کنید که در عملکرد سیستم شما هنگام برخورد با swap تأثیر می گذارد.
تنظیم ویژگی Swappiness
پارامتر swappiness پیکربندی میکند که سیستم شما چند بار داده را از RAM به فضای swap در گردش قرار دهد. این مقدار بین 0 تا 100 است که درصد را نشان می دهد.
با مقادیر نزدیک به صفر ، هسته داده ها را به دیسک منتقل نمیکند مگر اینکه واقعا لازم باشد. به یاد داشته باشید ، تعامل با فایل swap “هزینه بر” است زیرا مدت زمان زیادی نسبت به تعامل با RAM طول می کشد و می تواند باعث کاهش قابل توجه عملکرد شود. به طور کلی اعلام به سیستم مبنی بر متکی نبودن زیاد به swap ، باعث سریعتر شدن سیستم شما خواهد شد.
مقادیر نزدیک به 100 ، سعی می کنند تا داده های بیشتری را در swap قرار دهند تا فضای خالی RAM بیشتری حفظ کنند. بسته به مشخصات حافظه برنامه های شما یا آنچه از سرور مجازی خود برای آن استفاده می کنید ، این کار ممکن است در بعضی موارد ارحج باشد.
می توانیم با تایپ کردن دستور زیر مقدار swappiness فعلی را مشاهده کنیم:
$ cat /proc/sys/vm/swappiness

Output
60

برای دسکتاپ ، تنظیم swappiness روی 60 مقدار بدی نیست. برای یک سرور مجازی ، ممکن است بخواهید آن را به 0 نزدیک کنید.
ما می توانیم swappiness را با استفاده از دستور sysctl به مقدار دیگری تبدیل کنیم.
به عنوان مثال ، برای تنظیم swappiness روی 10 ، می توانیم تایپ کنیم:
$ sudo sysctl vm.swappiness=10

Output
vm.swappiness = 10

این تنظیم تا ریبوت بعدی ادامه خواهد داشت. ما می توانیم با اضافه کردن خط به فایل /etc/sysctl.conf ، این مقدار را به طور خودکار در ریستارت تنظیم کنیم:
$ sudo nano /etc/sysctl.conf

در پایین می توانید اضافه کنید:
/etc/sysctl.conf
vm.swappiness=10
پس از اتمام فایل را ذخیره کنید و ببندید.
تعیین تنظیمات فشار Cache
مقدار مرتبط دیگری که ممکن است بخواهید آن را تغییر دهید vfs_cache_pressure است. این تنظیمات چگونگی انتخاب سیستم برای ذخیره اطلاعات inode  و dentry  نسبت به سایر داده ها را پیکربندی می کند.
در اصل ، داده های دسترسی در مورد سیستم فایل است. به طور کلی جستجوی آن هزینه بر است و بسیار درخواست میشود، بنابراین یک حافظه پنهان برای سیستم شما بسیار عالی خواهد بود. با پرس و جوی مجدد سیستم فایل proc می توانید مقدار فعلی را مشاهده کنید:
$ cat /proc/sys/vm/vfs_cache_pressure

Output
100
همانطور که سیستم ما در حال حاضر پیکربندی شده است ، خیلی سریع اطلاعات inode  را از حافظه نهان پاک می کند. می توانیم با تایپ کردن دستور زیر، میتوانیم آن را روی تنظیمات محافظه کارانه تری مانند 50 تنظیم کنیم:
$ sudo sysctl vm.vfs_cache_pressure=50

Output
vm.vfs_cache_pressure = 50

باز هم ، این فقط برای بخش فعلی ما معتبر است. ما می توانیم با اضافه کردن آن به فایل پیکربندی خود مانند تنظیمات swappiness آن را تغییر دهیم:
$ sudo nano /etc/sysctl.conf

در پایین ، خطی را اضافه کنید که مقدار جدید شما را مشخص می کند:
/etc/sysctl.conf
vm.vfs_cache_pressure=50

پس از اتمام فایل را ذخیره کنید و ببندید.
نتیجه
پیروی از مراحل موجود در این راهنما در مواردی که منجر به استثناهای اتمام حافظه شود ، به شما فضای تنفس می دهد. فضای swap می تواند برای جلوگیری از برخی از این مشکلات متداول فوق العاده مفید باشد.
اگر به خطاهای OOM (اتمام حافظه) برخورد می کنید ، یا می بینید که سیستم شما قادر به استفاده از برنامه های مورد نیاز شما نیست ، بهترین راه حل این است که تنظیمات برنامه خود را بهینه کنید یا سرور مجازی خود را به روز کنید.