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

محتوی این نوشته برای مرداد ۱۳۹۴ است که به دلیل انتقال وبلاگم به ویرگول دوباره بازنشر می‌کنم.خواندن اطلاعات از دیسک سخت (به طور معمول هارد دیسک) از حافظه رم کندتره و بنابر اصل دسترسی محلی احتمال دسترسی به بخشی که تازه مورد دسترسی بوده بسیار بیشتر. پس سیستم عامل سعی می کنه بلاکی که به تازگی مورد دسترسی قرار گرفته در دیسک سخت رو در حافظه رم کش کنه.اسم این کار بافر کردن دیسک و به فضایی که در رم میگیره بافر کشمی گند. چون فضای بافرکش رو نمیشه خیلی زیاد در نظر گرفت،باید قسمت هایی که جدید بهشون دسترسی نداشتیم رو حذف کنیم و در اختیار بلاک های جدید بگذاریم.تا اینجا ما فقط قصد داشتیم از فضای بافر کش بخونیم،ولی ممکنه روی اون بنویسم. موقعی که دستور write کردن روی فضای هارد به سیستم عامل داده میشه،ممکنه از نظر کاربر این نوشتن انجام شده باشه،ولی واقعا چیزی روی دیسک سخت نوشته نشده باشه.این به معنی اینکه سیستم عامل تصمیم گرفته برای بهبود کارایی روی فضای بافر کش در رم تغییرات رو انجام بده و بعدا بصورت یکجا برای نوشتن به سراغ دیسک سخت بره. وقتی اطلاعات روی بافرکش و دیسک سخت (هارد) یکی نباشند،به بافر کش ،بافرکش کثیف می گند.به این روشwrite-back می گند.البته ممکن بصورت همزمان هم تغییرات روی هارد نوشته شه،که بهش write-through می گند که کارایی کمتر داره،ولی در صورت وجود خطا (مثلا قطع برق،خاموش کردن سیستم بدون سیستم عامل و ... ) اطلاعاتی که ذخیره کردیم نابود نمی شند.freeroot@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 میشه حافظه بافرکش مورد استفاده و آزاد رو دید.syncsync باعث نوشتن بافرکش ها روی دیسک سخت میشه،در 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البته تعداد آرگومان های زیادی رو به عنوان ورودی میگیره که من خیلی در خوندنش دقیق نشدم.سیگنال دادن به کرنلبرای سیگنال دادن به کرنل در مورد سیاست هاش در کار با بافرکش باید در فایل /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 11720700bdflushیک daemon سطح کرنله که مکرر sync و flush رو صدا می زنه.برای هر صفحه در حافظه بافر کش یک بیت به اسم بیت کثیف(dirty bit) وجود داره که با اولین نوشتن روی اون صفحه در بافر کش این بیت ۱ میشه. بعد از گذشتن عمر یک صفحه اون رو می نویسه،یعنی مدتی که بعد از گذشتن ۳۰ ثانیه از ۱ شدن بیت کثیف برای صفحه داده ها و گذشت ۵ ثانیه از ۱ شدن بیت کثیف برای صفحه فراداده ها(meta data).اعداد پیش فرض سیستم هستند و میشه تغییرشون داد.البته یک daemon دیگه هم از bdflush وجود داره که بعد از رسیدن به حد آستانه شروع به نوشتن صفحات در دیسک می کنه.باز هم بصورت پیش فرض ۶۰٪ از فضای بافرکش. و البته کل فضای بافرکش بصورت پویا توسط سیستم عامل و با توجه به فضایی مورد نیاز بقیه برنامه های در حال اجرا تعیین میشه.