در این مبحث با توجه به نیاز به کنترل نمودن میزان بافر/کش مموری به روش های مدیریت این موضو ع میپردازیم :
در نمای کلی تمام برنامه های در حال استفاده، نیازمند خواندن/نوشتن هستند و سیستم عامل ابن امر را بااستفاده از بافر/کش داخل مموری سیستم، بصورت لایو انجام می دهد.
به دلیل اینکه تاخیر حضور دیسک برای خواندن / نوشتن برای یوزر محسوس نباشد، و از طرفی سرعت مموری بیشتر از دیسک می باشد، سیستم عامل اول داده ها را بر روی مموری کش میکند که این موضوع به اصطلاح بافر مموری را پر میکند تا زمانی که اطلاعات از بافر بر روی دیسک نوشته شوند. به اصطلاح drain کردن داده ها روی دیسک و reclaim کردن مموری.
برای دیدن بافر/کش می توانید از دستور زیر استفاده کنید :
free -h
که با توجه به خروجی می توان فاکتور های مربوط به مموری از جمله بافر/کش را ملاحظه نمود:
Result: total used free shared buff/cache available Mem: 1.0Ti 2.6Gi 925Gi 3.0Mi 79Gi 999Gi Swap: 68Gi 8.0Mi 68Gi
برای تکمیل توضیحات، توجه به این موضوع که هرچقدر بافر/کش در مموری زیاد و بالا باشد میزان پرفورمنس ماشین بر اساس میزان خالی مموری کاهش میابد، به بیان دیگر نسبت میزان بافر/کش به میزان آزاد مموری معکوس می باشد که این امر در بعضی مواقع مشکل ساز می شود چراکه تاثیر تاخیر خالی شدن بافر روی پرفورمنس سیستم محسوس می شود.
به همین دلیل در برخی مواقع نیاز به مدیریت این موضوع می باشد که برای آن به بررسی چند راه حل موجود می پرازیم.
روش اول
۱. یکی از راه حل های کنترل بافر/کش ، خالی کردن دستی آن است بدین صورت که :
در قسمت proc که تمام پروسس های سیستم در آن قرار دارد، در فایل مربوط به بافر/کش مموری (/proc/sys/vm/drop_caches) ، تغییراتی ایجاد کنیم که باعث خالی شدن آن شود که این تغییرات بسته به نوع درخواست ما، از بافر/کش مموری پاک می شوند:
در کل ۳ مدل جنس داده در بافر/کش ذخیره می شوند که عبارتند از : pagecache, dentries and inodes
که بنا به نیاز ما با دستورهای زیر می توانیم آنها را از مموری خارج کنیم :
sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches
استفاده می کنیم.
روش دوم
کنترل میزان دقت سیستم عامل به خالی کردن بافر/کش که منتج به برگشت سریعتر میزان مموری به مموری آزاد می شود که با تغییر در تنظیمات فایل زیر انجام می شود:
لازم به ذکر است که مقدار پیش فرض در این فایل مقدار ۱۰۰ می باشد و با بلاتر بردن این عدد میزان فورس کردن سیستم عامل نسبت به این موضوع بیشتر می شود.
echo 150 > /proc/sys/vm/vfs_cache_pressure
می توانیم نسبت به نیاز عدد جایگزین ۱۵۰ را وارد کنیم.
روش سوم
استفاده از Control Group است که به همان cgroup اشاره دارد. می دانیم که cgroup در کرنل لینوکس می تواند یک یا چند پروسس که عضو آن هستند را برای استفاده از منابع کنترل کند.
در این روش می توانیم با ساخت یک cgroup و اضافه کردن پروسس های مد نظر به آن، برای استفاده از منابع محدودیت هایی ایجاد کنیم که البته نسبت به هر برنامه مستلزم محاسبات دقیق می باشد.
برای ادامه این روش در ابتدا باید بدانیم که با کدام ورژن از cgroup کار می کنیم و همینطور باید مطمئن باشیم که پکیج های وابسته نصب باشند مانند:
cgroup-tools or libcgroup
در ابتدا با دستور زیر یک cgroup میسازیم :
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:/foo
حالا به عنوان مثال برای cgroup ساخته شد همحدودیت استفاده از ۲ گیگ مموری را اعمال میکنیم :
sudo echo 2G > /sys/fs/cgroup/foo/memory.max
و برای اطمینان از میزان محدودیت های cgroup ها میتوانیم از دستور زیر استفاده کنیم :
cgget -g memory:/foo/ | grep memory.max Result: memory.max: 2147483648