یکی از ساده‌ترین راه‌ها برای پاسخگویی بهتر سرور و محافظت در برابر خطاهای رایج Out of Memory در برنامه‌ها و سرویس‌ها، افزودن فضای Swap است. فضای Swap یک درایو ذخیره سازی است که سیستم عامل می‌تواند اطلاعاتی که امکان ذخیره سازی آن در حافظه وجود ندارد را بصورت موقت در آن ذخیره کند. یا به عبارتی ساده‌تر، Swap یک فضا بر روی دیسک است که در صورت پر شدن فضای حافظه فیزیکی (Ram) از آن بصورت موقت استفاده می‌کند.

در این آموزش نحوه افزدون فضای Swap در CentOS 7 را با هم فرا خواهیم گرفت.

بررسی سیستم برای اطلاعات Swap

قبل از شروع، می‌بایست فضای ذخیره سازی سرور خود بررسی کنیم که ببینیم آیا در حال حاضر فضای Swap داریم یا خیر.

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

swapon -s

در صورتی که خروجی از این دستور دریافت نکردیم، مطمئنم می‌شویم که فضای Swap بر روی سیستم یا سرور خود نداریم.

روش دیگر بررسی وجود فضای Swap استفاده از دستور free است. می‌توانیم با استفاده از دستور زیر بررسی نماییم.

free -m

دستور بالا میزان فضای حافظه استفاده شده و خالی سیستم را نمایش می‌دهد. در صورتی که فضای Swap نداشته باشیم، مقدار آن 0 برگردانده می‌شود.

نمونه خروجی:

              total        used        free      shared  buff/cache   available
Mem:           1950          80        1767           8         102        1741
Swap:             0           0           0

بررسی فضای خالی دیسک

سریع‌ترین و در دسترس‌ترین روش برای افزودن فضای Swap بر روی دیسک، استفاده از افزودن فضای Swap بر روی پارتیشن موجود است.

بدین منظور، با استفاده از دستور زیر، اطلاعات فضای دیسک خود را بررسی می‌کنیم.

df -h

نمونه خروجی:

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        953M     0  953M   0% /dev
tmpfs           976M     0  976M   0% /dev/shm
tmpfs           976M  8.5M  968M   1% /run
tmpfs           976M     0  976M   0% /sys/fs/cgroup
/dev/sda1        19G  859M   18G   5% /
tmpfs           196M     0  196M   0% /run/user/0

با توجه به خروجی نمونه متوجه می‌شویم که فضای خالی دیسک ما 18 گیگابایت می‌باشد.

در حال حاضر، می‌بایست با توجه به نیاز، فضای Swap خود را تعیین کنیم و در دستورات آتی جهت ایجاد فضای Swap از آن استفاده نماییم.

در این مثال، فضای Swap را 4 گیگابایت در نظر خواهیم گرفت.

ایجاد فایل Swap

اکنون که فضای خالی بر روی دیسک خود داریم، می‌توانیم فضای Swap را ایجاد نماییم. ما در این مرحله یک فایل با نام swapfile در شاخه / ایجاد می‌کنیم. البته می‌توانیم از هر نام دیگری برای فضای Swap خود استفاده نماییم.

سریع‌ترین و ساده‌ترین راه برای ایجاد فایل Swap استفاده از دستور fallocate می‌باشد. با استفاده از دستور زیر یک فایل 4 گیگابایتی ایجاد می‌کنیم.

fallocate -l 4G /swapfile

فایل swapfile به سرعت ایجاد می‌شود و با استفاده از دستور ls می‌توانیم بررسی کنیم.

ls -lh /swapfile

نمونه خروجی:

-rw-r--r--. 1 root root 4.0G Feb  3 00:56 /swapfile

فعال کردن فایل Swap

در حال حاضر فایل ما ایجاد شده است، ولی سیستم یا سرور نمی‌داند که این فایل قرار است برای فضای Swap استفاده شد. می‌بایست این فایل را بصورت Swap فرمت، سپس آن را فعال کنیم.

قبل از انجام هر کاری، ابتدا مجوز یا سطح دسترسی فایل را بصورت صحیح انجام می‌دهیم تا از خواندن یا نوشتن فایل توسط کاربران دیگر (به جز root) جلوگیری نماییم.

با استفاده از دستور chmod تنظیمات سطح دسترسی را بصورت صحیح انجام می‌دهیم.

chmod 600 /swapfile

این دستور، مجوز خواندن و نوشتن فایل را فقط به کاربر root محدود می‌کند.

با استفاده از دستور ls -lh می‌توانیم این مورد را نیز بررسی نماییم.

ls -lh /swapfile

خروجی:

-rw-------. 1 root root 4.0G Feb  3 00:56 /swapfile

در حال حاضر که فایل Swap امن شده است، می‌توانیم با استفاده از دستور زیر فضای Swap را تنظیم نماییم.

mkswap /swapfile

نمونه خروجی:

Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=5dbf47a2-6492-45a4-88f6-98afff420f35

فایل Swap ایجاد شده جهت استفاده به عنوان فضای Swap آماده شده است و می‌توانیم با استفاده از دستور زیر آن را فعال نماییم.

swapon /swapfile

جهت بررسی و تایید این موضوع، از دستور زیر جهت گزارشگیری از فضای Swap استفاده می‌کنیم.

swapon -s

نمونه خروجی:

Filename                                Type            Size    Used    Priority
/swapfile                               file    4194300 0       -2

همچنین می‌توانیم از دستور free نیز استفاده نماییم.

free -m

نمونه خروجی:

              total        used        free      shared  buff/cache   available
Mem:           1950          83        1744           8         122        1727
Swap:          4095           0        4095

فضای Swap با موفقیت تنظیم شده است و سیستم یا سرور در صورت لزوم می‌تواند از این فضا استفاده نماید.

ایجاد تغییرات دائمی در فایل Swap

فضای Swap ما در حال حاضر فعال است ولی پس از ریستارت، سرور نمی‌تواتد بصورت خودکار از این فایل به عنوان فضای Swap استفاده کند. می‌توانیم این مورد را با تغییر در فایل fstab ایجاد نماییم. fstab که مخفف File System Table می‌باشد، فایلی برای برای پیکربندی سیستم و جدولی برای مدیریت فایل سیستم (File System) و پارتیشن‌ها می‌باشد که معمولاً در آدرس /etc/fstab قرار دارد.

فایل fstab را با ویرایشگر دلخواه مانند nano یا vi ویرایش می‌کنیم.

vi /etc/fstab

در انتهای فایل، یک خط به عنوان فضای Swap اضافه می‌نماییم.

/swapfile   swap    swap    sw  0   0

پس از ایجاد تغییر، فایل را ذخیره و از آن خارج می‌شویم. در این صورت پس از هر بار ریستارت سیستم یا سرور، فضای Swap جهت استفاده آماده خواهد بود.

تنظیمات بهبود عملکرد Swap (اختیاری)

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

Swappiness

پارامتر Swappiness به عنوان یک ویژگی هسته یا کرنل لینوکس، تعیین می‌کند که چند بار سیستم می‌تواند از فضای Swap استفاده کند. این مقدار بین 0 تا 100 است که درصد استفاده از حافظه را نشان می‌دهد. مقدار کم Swappiness باعث می‌شود هسته تا سعی خواهد کرد تا حد امکان از Swap جلوگیری کند مگر اینکه کاملاً ضروری باشد، توجه داشته باشید که استفاده از Swap هزینه بالایی در کیفیت استفاده از سرویس‌ها برای ما خواهد داشت زیر بسیار کندتر از فضای حافظه عمل می‌کند و مقدار بالاتر این پارامتر باعث می‌شود هسته یا کرنل لینوکس سریع‌تر از فضای Swap استفاده کند.

با استفاده از دستور زیر می‌توانیم مقدار فعلی پارامتر Swappiness را مشاهده نماییم.

cat /proc/sys/vm/swappiness

خروجی:

30

مقدار پارامتر Swappiness در CentOS 7 بصورت پیش‌فرض 30 می‌باشد که این مقدار برای سیستم‌های خانگی مناسب است. برای استفاده از سرور در کارهای عملیاتی و تجاری، این مقدار را به صفر نزدیک خواهیم کرد.

می‌توانیم مقدار Swappiness را با استفاده از دستور sysctl به مقدار دلخواه دیگری تغیر دهیم.

به عنوان مثال، مقدار Swappiness را به 10 تغییر می‌دهیم.

sysctl vm.swappiness=10

خروجی:

vm.swappiness = 10

اعمال این تنظیمات تا ریستارت نشدن سرور پابرجاست، به منظور دائمی کردن این تغییرات خط زیر را به فایل کانفیگ sysctl اضافه می‌نماییم.

vi /etc/sysctl.conf

تنظیمات Swappiness را به انتهای فایل اضافه می‌نماییم.

vm.swappiness = 10

پس از اعمال تغییرات، در صورت ریستارت شدن سرور مقدار Swappiness بر روی مقدار تعیین شده تنظیم خواهد شد.

Cache Pressure

مقدار دیگری که ممکن است بخواهیم آن را تغییر دهیم vfs_cache_pressure است. این تنظیم بر روی ذخیره اطلاعات metadata فایل سیستم تاثیر خواهد گذاشت. خواندن و بازخوانی (refreshing) این اطلاعات بسیار پر هزینه است، بنابراین ذخیره بیشتر آن در Cache برای عملکرد سیستم بسیار عالی است.

می‌توانیم مقدار فعلی Cache Pressure را با استفاده از دستور زیر مشاهده نماییم.

cat /proc/sys/vm/vfs_cache_pressure

خروجی:

100

همانطور که مشاهده می‌نمایید، در حال حاضر با تنظیم مقدار 100 اطلاعات ورودی به سرعت از Cache حذف می‌شوند. می‌توانیم با استفاده از sysctl این مقدار را بر روی 50 برای اعمال تنظیمات محافظه کارانه‌تر تغییر دهیم.

sysctl vm.vfs_cache_pressure=50

خروجی:

vm.vfs_cache_pressure = 50

همچنین برای دائمی کردن این مقدار مانند Swappiness، تنظیمات آن را به فایل تنظیمات اضافه می‌نماییم.

vi /etc/sysctl.conf

خط زیر را به انتهای فایل اضافه می‌کنیم.

vm.vfs_cache_pressure = 50

پس از ذخیره کردن فایل، تنظیمات مورد نظر پس از ریستارت سیستم نیز بر روی سیستم وجود خواهند داشت.