يكي از راه هاي محافظت در برابر خطاهاي اتمام حافظه در برنامه ها ، اضافه كردن فضاي 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/core18/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 (اتمام حافظه) برخورد مي كنيد ، يا مي بينيد كه سيستم شما قادر به استفاده از برنامه هاي مورد نياز شما نيست ، بهترين راه حل اين است كه تنظيمات برنامه خود را بهينه كنيد يا سرور مجازي خود را به روز كنيد.