۱۳۹۲/۱۰/۲۰

آزاد کردن فضای RAM با پاک‌کردن Cache در لینوکس

مقدمه

مدتی قبل در حال بررسی عملکرد پایگاه داده MySQL و پارامترهای مختلف کش (Cache) کردن اطلاعات آن بودم. قطعه کدی به زبان سی پلاس پلاس (++C) وظیفه خواندن محتوای فایل‌ها و انتقال مقادیر محاسبه شده و دریافتی از آن‌ها را به MySQL داشت. مشکلی که بوجود آمد، پر شدن حافظه رم (RAM) بعد از چند دقیقه و کندی سیستم برای انجام سایر کارها بود.

بررسی وضعیت رم

در لینوکس دستوری به نام free وجود دارد که اطلاعات وضعیت رم و فضای swap را نشان می‌دهد.
$ free -h
total       used       free     shared    buffers     cached
Mem:          7.5G       7.4G       163M         0B        76M       4.1G
-/+ buffers/cache:       3.2G       4.3G
Swap:         7.7G       4.9M       7.7G
با توجه به خروجی دستور free مشخص می‌شود که از مجموع 7.5G فضای رم، فقط 163M خالی است. همچنین 4.1G به Cache اختصاص داده شده است. من نیاز داشتم که فضای کش شده را به صورت دستی خالی کنم.

منظور از Cache و Buffer در اینجا چیست؟

Cache شامل اطلاعات محتوای فایل‌ها و اطلاعاتی است که از دیسک خوانده شده اند.
‌Buffer شامل اطلاعات وضعیت رم و Cache و همچنین اطلاعاتی که هنوز ذخیره نشده‌اند.

پاک کردن Cache

در لینوکس فایلی به نام drop_caches وجود دارد که نوشتن در آن به کرنل (Kernel) دستور لازم برای آزاد کردن فضای cache از حافظه را می‌دهد. مقدار عددی 3 باعث پاک کردن تمامی اطلاعات کش شده می‌شود. در نظر داشته باشید که قبل از پاک کردن کش باید دستور sync را اجرا نمایید. دستور sync، اطلاعاتی که نیازمند نوشتن شدن بر روی دیسک هستند ولی هنوز در cache و buffer می‌باشند را بر روی دیسک می‌نویسد. ترکیب دستورات sync و پاک کردن cache در زیر آماده است.
$ sync; sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
بد نیست دوباره دستور free را اجرا کرده و وضعیت رم را بررسی کنیم:
$ free -h
total       used       free     shared    buffers     cached
Mem:          7.5G       3.5G       4.0G         0B       7.6M       433M
-/+ buffers/cache:       3.0G       4.5G
Swap:         7.7G       4.9M       7.7G
خوب،‌ براحتی حدود 3.4G از فضای RAM را خالی کردیم. شما می‌توانید این دستورات را توسط crontab به صورت دوره‌ای و خودکار بر روی سرور ویا کامپیوتر شخصی خود اجرا نمایید. البته بهتر است مدیریت رم را به سیستم عامل واگذار کنید.

برای مطالعه بیشتر

۴ نظر:

  1. بهتر است که یه جواریی واجبه برای اجرای sync مطمئن بشیم اون فایل سیستم در حالت نوشتن بسر نمیبره، چون نتیجه نا مطلوبی در بر خواهد داشت.

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

    پاسخحذف
  3. درسته. اگه sync صحیح انجام نشه ممکنه عملکرد سیستم رو دچار مشکل کنه.

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

    پاسخحذف