منبع اصلی نوشتار زیر در این لینک قرار دارد

بافر و کش در لینوکس


خواندن اطلاعات از دیسک سخت (به طور معمول هارد دیسک) از حافظه رم کندتره و بنابر اصل دسترسی محلی احتمال دسترسی به بخشی که تازه مورد دسترسی بوده بسیار بیشتر. پس سیستم عامل سعی می کنه بلاکی که به تازگی مورد دسترسی قرار گرفته در دیسک سخت رو در حافظه رم کش کنه.اسم این کار بافر کردن دیسک و به فضایی که در رم میگیره بافر کش می گند.

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

تا اینجا ما فقط قصد داشتیم از فضای بافر کش بخونیم،ولی ممکنه روی اون بنویسم. موقعی که دستور write کردن روی فضای هارد به سیستم عامل داده میشه،ممکنه از نظر کاربر این نوشتن انجام شده باشه،ولی واقعا چیزی روی دیسک سخت نوشته نشده باشه.این به معنی اینکه سیستم عامل تصمیم گرفته برای بهبود کارایی روی فضای بافر کش در رم تغییرات رو انجام بده و بعدا بصورت یکجا برای نوشتن به سراغ دیسک سخت بره. وقتی اطلاعات روی بافرکش و دیسک سخت (هارد) یکی نباشند،به بافر کش ،بافرکش کثیف می گند.به این روش write-back می گند.

البته ممکن بصورت همزمان هم تغییرات روی هارد نوشته شه،که بهش write-through می گند که کارایی کمتر داره،ولی در صورت وجود خطا (مثلا قطع برق،خاموش کردن سیستم بدون سیستم عامل و ... ) اطلاعاتی که ذخیره کردیم نابود نمی شند.


free


root@Moein:~# free -m
             total       used       free     shared    buffers     cached
Mem:          5890       3465       2424        393        139       1436
-/+ buffers/cache:       1889       4000
Swap:        11445          0      11445

با استفاده از free میشه حافظه بافرکش مورد استفاده و آزاد رو دید.

sync

sync باعث نوشتن بافرکش ها روی دیسک سخت میشه،در unix هر ۳۰ ثانیه sync اجرا میشد که بعضی وقت ها به دلیل حجم زیاد write دیسک رو کند می کرده،در لینوکس از bdflush استفاده می شه که فرکانس صدا زدنش سریعتره.

Vmtouch

از Vmtouch هم میشه برای کنترل و مشاهده بافرکش استفاده کرد،ولی بصورت پیش فرض نصب نیست و باید خودتون make کنید.

root@Moein:/home/moein/Desktop# vmtouch -t .
           Files: 108
     Directories: 10
   Touched Pages: 87627 (342M)
         Elapsed: 8.8299 seconds

البته تعداد آرگومان های زیادی رو به عنوان ورودی میگیره که من خیلی در خوندنش دقیق نشدم.

vmotuch در گیت ها

سیگنال دادن به کرنل


برای سیگنال دادن به کرنل در مورد سیاست هاش در کار با بافرکش باید در فایل  /proc/sys/vm/drop_caches نوشتن.

سیگنال ۱:نوشتن صفحات کش شده و آزاد کردن حافظه بافر کش

سیگنال ۲:نوشتن inode های کش شده و آزاد کردن حافظه بافر کش

سیگنال ۳:نوشتن صفحات کش شده + نوشتن inode های کش شده و آزاد کردن حافظه بافر کش

root@Moein:~# free && sync && echo 3 > /proc/sys/vm/drop_caches && free
             total       used       free     shared    buffers     cached
Mem:       6031620    4197420    1834200     432396     148008    1869120
-/+ buffers/cache:    2180292    3851328
Swap:     11720700          0   11720700
             total       used       free     shared    buffers     cached
Mem:       6031620    2834956    3196664     431620       1284     746008
-/+ buffers/cache:    2087664    3943956
Swap:     11720700          0   11720700


bdflush


bdflush یک daemon سطح کرنله که مکرر sync و flush رو صدا می زنه.برای هر صفحه در حافظه بافر کش یک بیت به اسم بیت کثیف(dirty bit) وجود داره که با اولین نوشتن روی اون صفحه در بافر کش این بیت ۱ میشه.

bdflush بعد از گذشتن عمر یک صفحه اون رو می نویسه،یعنی مدتی که بعد از گذشتن ۳۰ ثانیه از ۱ شدن بیت کثیف برای صفحه داده ها و گذشت ۵ ثانیه از ۱ شدن بیت کثیف برای صفحه فراداده ها(meta data).اعداد پیش فرض سیستم هستند و میشه تغییرشون داد.

البته یک daemon دیگه هم از bdflush وجود داره که بعد از رسیدن به حد آستانه شروع به نوشتن صفحات در دیسک می کنه.باز هم بصورت پیش فرض ۶۰٪ از فضای بافرکش.

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