مقدمه
مدتی قبل در حال بررسی عملکرد پایگاه داده 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 به صورت دورهای و خودکار بر روی سرور ویا کامپیوتر شخصی خود اجرا نمایید. البته بهتر است مدیریت رم را به سیستم عامل واگذار کنید.
برای مطالعه بیشتر