قصه پر غصه Caching در DBMSها: PostgreSQL
فکر میکنم بر همگان واضح و مبرهنه که چرا caching به کرّات تقریبا همهجا (از کش چندلایهای که در سطح پروسهست بگیر تا کشی که سیستمعامل در سطح دیسک استفاده میکنه) استفاده میشه. علت یک خطیش میشه این که تا گپ زمانی که بین حافظههای مختلف در سرعت دسترسی به اطلاعات وجود داره رو تا حد امکان برای ما خفیفتر کنه. با این تفاسیر، بهره بردن از مکانیزم های Caching در DMBS ها چندان هم دور از ذهن نمیرسه. اما ماجرا به این سادگی ها که بنظر میاد نیست. بهتر بگم، ماجرا کاملا پیچیده است!
وقتی صحبت از کش میشه، یک پای ماجرا همزمانیه، یک پای دیگه Data Inconsistency و طبعاً هم بحث مدیریت حافظه و دهها غصه دیگه. امروز داشتم از سر کنجکاوی نگاهی به فصل Buffer cache and WAL کتاب Postgresql internals مینداختم تا یک کمی سر در بیارم که چطوری این ماجرا اتفاق میفته. همونطور که انتظارشو داشتم، کتاب به تفضیل این مبحث رو شرح داده و حتی به سورس کد هر بخشی هم که راجعبهش صحبت میکرد (مثلا Hash tableای که برای نگهداری buffer ID ها از اون استفاده شده)، به سورس کد اون ارجاع داده (هرچند که متاسفانه توضیحی روی پیاده سازی نداده). واقعیت امر اینه که فهمیدن سورسش از سواد من خارج بود ولی خوندن و مطلع شدن راجعبه مکانیزم ماجرا، من رو سر ذوق آورد و برای همین خواستم تا اون رو اینجا با شما به اشتراک بذارم.
توصیه میکنم قبل این که وارد کتاب بشید، اول به این مقاله که Caching و Buffer Cache رو در PostgreSQL توضیح داده رجوع کنین:
https://postgrespro.com/blog/pgsql/5967951
مقاله در اصل همون مطالب کتابه ولی کمی سادهتر و کمی قابل فهم تر. در قدم بعدی هم خود کتاب که لینکش رو بالاتر گذاشتم. من هم اگر فرصتی باشه تلاشم رو میکنم اون چیزی که از این ماجرا متوجه شدم کمی سادهتر اینجا بنویسم. عجالتاً این رو از من بپذیرید تا بعد که ببینم چی میشه.
———
پ.ن:
مشابه این کار رو قبلا تو این پست راجعبه Query Planner انجام دادم. اون چه که خوندم و متوجه شدم رو سعی کردم کمی سادهتر توضیح بدم. فکر میکنم مرورش چندان خالی از لطف نباشه.
Post #3266
2.73K