حافظه کش، بافر و فضای سواپ چیست؟

حافظه کش (RAM Cache

حافظه کش بخشی از RAM است که لینوکس از آن برای ذخیره داده‌هایی که مرتب استفاده می‌شوند، استفاده می‌کند. این کار باعث می‌شود سیستم سریع‌تر کار کند، چون داده‌ها از RAM (که سریع است خوانده می‌شوند، نه از دیسک سخت (که کندتر است. اما اگر کش بیش از حد پر شود یا داده‌های قدیمی را نگه دارد، ممکن است عملکرد سیستم کاهش یابد.

مثال ساده: فرض کنید شما مرتب یک فایل خاص را باز می‌کنید. لینوکس این فایل را در کش نگه می‌دارد تا دفعه بعد سریع‌تر باز شود. اما اگر این فایل دیگر لازم نباشد، فضای کش بیهوده اشغال می‌شود.

بافر (Buffer

بافر هم مثل کش داده‌ها را موقتاً ذخیره می‌کند، اما برای انتقال داده بین اجزای سیستم (مثل CPU و دیسک سخت استفاده می‌شود. اگر بافر بیش از حد پر شود، ممکن است سرعت سیستم کم شود.

مثال ساده: وقتی فایلی را از دیسک سخت به برنامه‌ای منتقل می‌کنید، بافر مثل یک پل عمل می‌کند تا داده‌ها روان‌تر منتقل شوند.

فضای سواپ (Swap Space

سواپ بخشی از دیسک سخت است که وقتی RAM پر می‌شود، به‌عنوان حافظه مجازی استفاده می‌شود. این کار از کرش کردن سیستم جلوگیری می‌کند، اما چون دیسک سخت کندتر از RAM است، استفاده زیاد از سواپ می‌تواند سیستم را کند کند.

مثال ساده: اگر RAM شما 8 گیگابایت باشد و برنامه‌های زیادی باز کنید که 10 گیگابایت حافظه نیاز دارند، لینوکس از فضای سواپ روی دیسک سخت استفاده می‌کند.

چگونه حافظه کش، بافر و سواپ را پاک کنیم؟

قبل از شروع، بهتر است وضعیت حافظه سیستم را بررسی کنید تا ببینید چقدر حافظه در حال استفاده است:

free -h

توضیح: این دستور میزان حافظه RAM، کش، بافر و سواپ استفاده‌شده را به‌صورت خوانا (در واحد گیگابایت یا مگابایت نشان می‌دهد.

خروجی نمونه:

total used free shared buff/cache available

Mem: 7.8G 2.5G 3.0G 200M 2.3G 4.8G

Swap: 2.0G 500M 1.5G

توضیح خروجی: در اینجا 7.8 گیگابایت RAM داریم که 2.5 گیگابایت استفاده شده، 3 گیگابایت آزاد است و 2.3 گیگابایت برای کش و بافر استفاده شده. همچنین 500 مگابایت از سواپ در حال استفاده است.

یا می‌توانید از این دستور استفاده کنید:

vmstat -s

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

پاک کردن حافظه کش در لینوکس

لینوکس سه روش برای پاک کردن کش بدون مختل کردن برنامه‌ها یا سرویس‌ها ارائه می‌دهد. این روش‌ها از طریق فایل /proc/sys/vm/drop_caches انجام می‌شوند. برای این کار باید دسترسی مدیر (root داشته باشید.

1. پاک کردن فقط PageCache

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

توضیح:

  • sudo: برای اجرای دستور با دسترسی مدیر.
  • sync: مطمئن می‌شود تمام داده‌های تغییرکرده در بافر به دیسک نوشته شوند تا چیزی از دست نرود.
  • echo 1 > /proc/sys/vm/drop_caches: فقط حافظه کش مربوط به فایل‌ها (PageCache را پاک می‌کند.

اگر خطای دسترسی داشتید:

echo 1 | sudo tee /proc/sys/vm/drop_caches

توضیح: این روش جایگزین است و همان کار را انجام می‌دهد.

خروجی نمونه: هیچ خروجی مستقیمی ندارد، اما می‌توانید با free -h بررسی کنید که مقدار buff/cache کاهش یافته است.

2. پاک کردن Dentries و Inodes

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

توضیح:

  • Dentry: اطلاعات مربوط به ساختار دایرکتوری‌ها (پوشه‌ها.
  • Inodes: اطلاعات متادیتا درباره فایل‌ها (مثل نام و مکان فایل.
  • این دستور کش مربوط به این اطلاعات را پاک می‌کند.

اگر خطای دسترسی داشتید:

echo 2 | sudo tee /proc/sys/vm/drop_caches

خروجی نمونه: مثل بالا، خروجی مستقیم ندارد، اما حافظه آزاد شده را می‌توانید با free -h ببینید.

3. پاک کردن PageCache، Dentry و Inodes

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

توضیح: این دستور همه کش‌ها (PageCache، Dentry و Inodes را پاک می‌کند. این کامل‌ترین روش است، اما باید با احتیاط استفاده شود، به‌خصوص در سرورهای تولیدی.

اگر خطای دسترسی داشتید:

echo 3 | sudo tee /proc/sys/vm/drop_caches

خروجی نمونه: باز هم خروجی مستقیم ندارد، اما با free -h می‌بینید که مقدار buff/cache به شدت کاهش یافته است.

هشدار: استفاده از echo 3 در محیط‌های تولیدی توصیه نمی‌شود، مگر اینکه مطمئن باشید چه می‌کنید، چون ممکن است عملکرد سیستم را مختل کند.

پاک کردن فضای سواپ در لینوکس

برای پاک کردن فضای سواپ، می‌توانید سواپ را موقتاً خاموش و دوباره روشن کنید:

  1. خاموش کردن سواپ:

sudo swapoff -a

توضیح: این دستور تمام پارتیشن‌های سواپ را غیرفعال می‌کند و داده‌های سواپ به RAM منتقل می‌شوند (اگر RAM کافی باشد.

  1. روشن کردن دوباره سواپ:

sudo swapon -a

توضیح: این دستور سواپ را دوباره فعال می‌کند.

خروجی نمونه: با اجرای free -h بعد از این دستورات، باید مقدار استفاده‌شده سواپ به صفر برسد:

Swap: 2.0G 0B 2.0G

هشدار: اگر RAM کافی برای انتقال داده‌های سواپ نداشته باشید، این دستور ممکن است باعث کرش سیستم شود.

آیا پاک کردن کش، بافر و سواپ توصیه می‌شود؟

به‌طور کلی، پاک کردن دستی کش و بافر در لینوکس ایده خوبی نیست، چون لینوکس به‌صورت هوشمند این منابع را مدیریت می‌کند. پاک کردن این حافظه‌ها ممکن است باعث شود سیستم برای دسترسی به داده‌ها به دیسک سخت مراجعه کند که کندتر است.

چه زمانی باید این کار را انجام داد؟

  • وقتی سیستم تحت فشار حافظه شدید است و راه دیگری برای آزاد کردن حافظه ندارید.
  • برای تست یا عیب‌یابی در محیط‌های غیرتولیدی.

مثال خطرناک: فرض کنید سرور شما میزبان یک وب‌سایت پربازدید است و هر روز ساعت 2 صبح اسکریپتی برای پاک کردن کش اجرا می‌شود. اگر در همان زمان تعداد زیادی کاربر آنلاین باشند، پاک شدن کش باعث می‌شود داده‌ها از دیسک سخت خوانده شوند، که می‌تواند سرور را کند یا حتی کرش کند.

اتوماسیون پاکسازی حافظه

برای خودکار کردن پاکسازی حافظه، می‌توانید از cron استفاده کنید تا دستورات در زمان‌های مشخص اجرا شوند.

  1. باز کردن تنظیمات کرون:

crontab -e

  1. اضافه کردن دستورات برای اجرای روزانه در نیمه‌شب:

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

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

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

0 0 * * * swapoff -a && swapon -a

توضیح:

  • 0 0 * * *: یعنی هر روز ساعت 00:00 (نیمه‌شب.
  • دستورات بالا به‌ترتیب کش، بافر و سواپ را پاک می‌کنند.

هشدار: استفاده از sudo در کرون ممکن است مشکل ایجاد کند، مگر اینکه کرون را برای کاربر root تنظیم کنید یا دسترسی بدون رمز (passwordless sudo را فعال کنید. راه بهتر این است که دستورات را در یک اسکریپت ذخیره کنید و کرون آن اسکریپت را اجرا کند.

مثال اسکریپت:

#!/bin/

sync

echo 3 > /proc/sys/vm/drop_caches

swapoff -a && swapon -a

این اسکریپت را مثلاً با نام clear_memory.sh ذخیره کنید، دسترسی اجرا بدهید (chmod +x clear_memory.sh و در کرون اضافه کنید:

0 0 * * * /path/to/clear_memory.sh

تمام حالت‌های ممکن برای دستورات

دستورات پاک کردن کش:

  1. پاک کردن فقط PageCache:

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

یا

echo 1 | sudo tee /proc/sys/vm/drop_caches

  1. پاک کردن Dentry و Inodes:

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

یا

echo 2 | sudo tee /proc/sys/vm/drop_caches

  1. پاک کردن PageCache، Dentry و Inodes:

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

یا

echo 3 | sudo tee /proc/sys/vm/drop_caches

دستورات پاک کردن سواپ:

  1. خاموش و روشن کردن سواپ:

sudo swapoff -a && sudo swapon -a

  1. مشخص کردن پارتیشن خاص سواپ: اگر چند پارتیشن سواپ دارید، می‌توانید فقط یکی را غیرفعال کنید:

sudo swapoff /dev/sda5

sudo swapon /dev/sda5

توضیح: /dev/sda5 باید با نام پارتیشن سواپ شما جایگزین شود. برای پیدا کردن پارتیشن سواپ، از cat /proc/swaps استفاده کنید.

دستورات بررسی حافظه:

  1. بررسی کلی حافظه:

free -h

  1. بررسی جزئیات حافظه:

vmstat -s

  1. بررسی پارتیشن‌های سواپ:

cat /proc/swaps


✍️ نویسنده: حسین سیلانی

🔗 درباره من: seilany.ir

📢 نویسندگی و مشارکت در وبلاگ: t.me/seilany