امین سالم
برنامه نویس و متخصص Distributed Ledgers

آموزش پاک کردن کش ( Cache ) لینوکس به زبان ساده

مثل همه ی سیستم عامل های دیگه, GNU/Linux نیز مدیریت حافظه خود را به صورت خیلی کارآمد تر از سایر سیستم عامل ها پیاده سازی کرده است, اما اگر پروسه ای شروع به نوشخوار کردن حافظه شما نماید و شما بخواهید آن را آزاد کنید, لینوکس راهی را به منظور flush یا آزادسازی ram cache در اختیار شما قرار میدهد.

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

چطور cache لینوکس را خالی کنیم؟

هر سیستم عامل لینوکس سه گزینه به منظور پاک کردن Cache سیستم بدون ایجاد وقفه هیچ در پروسه ها یا سرویس ها در نظر گرفته است:

۱) پاک کردن PageCache :

PageCache دسترسی های فراوان به فایل ها بر روی حافظه های غیرفرار (مانند ROM و Flash) برای شما تسریع خواهد کرد. زمانی که شما برای بار اول میخواهید بخوانید (از)/ بنویسید (به) داده مدیا مثل Hard Drive ها, لینوکس داده ها را بر روی فضای بدون استفاده از حافظه که بعنوان Cache شناخته میشود ذخیره میکند. به همین جهت دسترسی به آن فایل در دفعات بعدی سریع تر خواهد بود.

دستور آن به این صورت میباشد:

 sync; echo 1 > /proc/sys/vm/drop_caches

2) پاک کردن dentries و inode ها :

Inode ها یک ساختار داده ای هستن که بیانگر یک فایل هستن و dentries ها نیز ساختار داده ای هستن که بیانگر یک دایرکتوری میباشد. این ساختارها میتوانند به منظور ساخت یک cache حافظه , که بیانگر ساختار فایل برای روی دیسک هستند مورد استفاده قرار میگیرد.

دستور آن به صورت زیر میباشد:

sync; echo 2 > /proc/sys/vm/drop_caches

3) پاک کردن PageCache, dentries و inode :

دستور آن به صورت زیر میباشد:

sync; echo 3 > /proc/sys/vm/drop_caches

توضیح دستورات بالا:

دستور sync بافر فایل سیستم را flush خواهد کرد. دستورات به منظور اجرای دنباله دار با ; از یکدیگر جدا شده اند. همانطور که در مستندات Kernel آمده است, نوشتن داخل drop_cache بدون نابود کردن برنامه یا سرویسی cache را پاک خواهد کرد. دستور echo وظیفه نوشتن بر روی فایل را انجام خواهد داد.

اگر فقط بخواهید cache دیسک را پاک کنید, دستور اول امن ترین دستور میباشد (echo 1>...) که PageCache را پاک خواهد کرد. دستور سوم تا زمانی که از محتویات cache خود برای پاک سازی اطمینان ندارید, در سطح وسیع و سازمانی توصیه نمیشود.

  • آیا آزاد کردن Buffer و Cache در لینوکس که ممکن است توسط هسته لینوکس استفاده شده باشد ایده خوبی است؟

زمانی که شما دستگاه ورودی/خروجی را به سیستم متصل کرده اید و میخواهید تنظیمات مختلفی را اعمال و آن را چک نمایید, پس ممکن است که نیاز داشته باشید تا cache بافر را پاک کنید و میتوانید cache را بدون ریبوت کردن یا زمان خاموشی پاک نمایید.لینوکس به نحوی طراحی شده است که قبل از جستجو داخل دیسک به disk cache نگاه میندازد, اگر منبعی که نیاز داشت را داخل cache پیدا کرد در نتیجه درخواست به دیسک نخواهد رسید و در صورت پاک کردن Cache, حافظه Disk Cache برای سیستم عامل کاربردی ندارد و به منظور دسترسی به منابع مستقیم به سراغ Disk خواهد رفت. همچنین برای لحظاتی سیستم را به جهت بازیابی و ذخیره لاگ توسط سیستم عامل درون disk cache کند خواهد کرد.حال میخواهیم اسکریپتی به منظور پاک سازی RAM cache هر روز راس ساعت ۲ صبح به وسیله ی زمان بندی کار Cron ایجاد نمایم. یک shell script با دستور:

vi clearcache.sh

ایجاد مینماییم و خطوط زیر را در آن وارد میکنیم:

#!/bin/bash
# Note, we are using "echo 3", but it is not recommended in production instead use "echo 1"
echo "echo 3 > /proc/sys/vm/drop_caches"

نوع permission فایل clearcache.sh را جهت اجرایی شدن به صورت زیر تعیین مینماییم:

chmod 755 clearcache.sh

حال اسکریپت را هر زمان که بخواهیم میتوانیم با زدن دستور:

<powershell>

./clearchache.sh

<powershell>

اجرا نماییم ولی میتوانیم به صورت زمان بندی شده (که در بالا ذکر شد) نیز این روند را طی نماییم. ابتدا cron را به منظور اعمال زمان بندی خودکار باز میکنیم:

crontab -e

خط زیر را داخل فایل قرار میدهیم ذخیره کرده و خارج میشویم تا اسکریپت هر روز راس ساعت ۲ صبح اجرا شود.

0  2  *  *  *  /path/to/clearcache.sh

آیا پاک کردن خودکار RAM cache بر روی سرورهای مهم ایده مناسبی است؟

به هیچ وجه! یک لحظه چشم ها رو ببندید و به افتضاحی که ممکن است هر روز برای شما رقم بخورد فکر کنید. حال فرض کنید روزهای عادی مشکلی برای سرور شما به وجود نخواهد آمد چون مشتریان با تعداد عادی سر میزدند و بار زیادی بر روی سرورها نبود. حال مدیر فروشگاه برنامه تخفیف سراسری را میخواهد در فروشگاه پیاده سازی کند و به طبع درخواست بسیاری است که به وب سایت و سرور شما خواهد آمد. در نتیجه بعد از پاک شدن cache تمامی کاربران داده ها را از دیسک خواهند گرفت و در نتیجه باعث پایین آمدن سرور و اختلال در پایگاه داده سایت شما خواهد شد. پس ram cache را هر وقت نیاز است پاک نمایید نه به صورت خودکار.

چگونه فضای SWAP‌ را پاک کنیم؟

اگر بخواهید فضای SWAP را پاک کنید میتوانید دستور زیر را اجرا نمایید:

swapoff -a && swapon -a

همچنین بعد از متوجه شما تمام مخاطرات موجود میتوانید دستور بالا را به صورت فایل اجرایی داخل cron خود قرار دهید.حال میتوانیم هر دو دستور را به صورت همزمان داخل یک خط دستور برای ایجاد یک اسکریپت مناسب جهت پاک سازی RAM cache و فضای SWAP با یکدیگر ترکیب نماییم.

echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'
OR
$ su -c "echo 3 >'/proc/sys/vm/drop_caches' && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'" root

بعد از اجرای دستور بالا, دستور free -h را قبل و بعد از اجرای اسکریپت به منظور چک کردن Cache اجرا خواهیم کرد.

نویسنده : امین سالم

منبع : ITPRO

هرگونه نشر و کپی برداری با ذکر منبع و نام نویسنده و یا بدون ذکر نام منبع به منظور نشر اطلاعات و وسیع تر شدن جامعه لینوکس و متن باز باعث خوشحالی بنده می باشد.


امین سالم
امین سالم

برنامه نویس و متخصص Distributed Ledgers

فارغ التحصیل رشته سخت افزار دانشگاه شاهد هستم ، بیشتر فعالیتی که در حوزه شبکه داشته ام در حوزه زیرساخت های ارتباطی سیسکو و مایکروسافت بوده است ، دوره های CISCO(CCNA_CCNP) و MCSE را در مجتمع فنی تهران شعبه ابن سینا سپری کرده ام ، در حوزه رباتیک دارای عناوین مختلف کشوری در مسابقات داخلی هستم و علاقه مند به کارهای عملی در حوزه شبکه می باشد ، در این راستا در چندین شرکت بصورت پروژه ای و کارآموزی پروژه هایی در حوزه زیرساختی ، مایکروسافتی و VOIP را نیز انجام داده ام ، بصورت کلی دستی در برنامه نویسی و

نظرات