یکی از سادهترین راهها برای پاسخگویی بهتر سرور و محافظت در برابر خطاهای رایج Out of Memory در برنامهها و سرویسها، افزودن فضای Swap است. فضای Swap یک درایو ذخیره سازی است که سیستم عامل میتواند اطلاعاتی که امکان ذخیره سازی آن در حافظه وجود ندارد را بصورت موقت در آن ذخیره کند. یا به عبارتی سادهتر، Swap یک فضا بر روی دیسک است که در صورت پر شدن فضای حافظه فیزیکی (Ram) از آن بصورت موقت استفاده میکند.
در این آموزش نحوه افزدون فضای Swap در CentOS 7 را با هم فرا خواهیم گرفت.
قبل از شروع، میبایست فضای ذخیره سازی سرور خود بررسی کنیم که ببینیم آیا در حال حاضر فضای 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 را ایجاد نماییم. ما در این مرحله یک فایل با نام 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 فرمت، سپس آن را فعال کنیم.
قبل از انجام هر کاری، ابتدا مجوز یا سطح دسترسی فایل را بصورت صحیح انجام میدهیم تا از خواندن یا نوشتن فایل توسط کاربران دیگر (به جز 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 استفاده کند. میتوانیم این مورد را با تغییر در فایل fstab ایجاد نماییم. fstab که مخفف File System Table میباشد، فایلی برای برای پیکربندی سیستم و جدولی برای مدیریت فایل سیستم (File System) و پارتیشنها میباشد که معمولاً در آدرس /etc/fstab
قرار دارد.
فایل fstab
را با ویرایشگر دلخواه مانند nano
یا vi
ویرایش میکنیم.
vi /etc/fstab
در انتهای فایل، یک خط به عنوان فضای Swap اضافه مینماییم.
/swapfile swap swap sw 0 0
پس از ایجاد تغییر، فایل را ذخیره و از آن خارج میشویم. در این صورت پس از هر بار ریستارت سیستم یا سرور، فضای Swap جهت استفاده آماده خواهد بود.
راه حلهای مختلفی برای افزایش و بهبود عملکرد سیستم هنگام استفاده از فضای Swap وجود دارد. این تنظیمات اختیاری میباشد و به نیاز سیستم و برنامه شما بستگی دارد.
پارامتر 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 بر روی مقدار تعیین شده تنظیم خواهد شد.
مقدار دیگری که ممکن است بخواهیم آن را تغییر دهیم 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
پس از ذخیره کردن فایل، تنظیمات مورد نظر پس از ریستارت سیستم نیز بر روی سیستم وجود خواهند داشت.