کلادفلر میزان مصرف حافظه کش DNS در سرویس 1.1.1.1 را به کمتر از نصف رساند و حدود ۱۰۰ ترابایت رم را در شبکه خود آزاد کرد. مهندسان این شرکت بدون تغییر در سختافزار یا حذف ماژولهای حافظه، تنها نحوه ذخیرهسازی نرمافزاری دادههای کش DNS را بهینهسازی کردهاند.
این بهینهسازی حول پلتفرم کشینگ DNS کلادفلر موسوم به «بیگ پایناپل» (Big Pineapple) انجام شد که در پسزمینه سرویس محبوب 1.1.1.1، فایروال DNS و چند سرویس دیگر این شرکت فعالیت میکند. سباستین نوتبوم، مهندس سیستم، در یک پست وبلاگی فنی به تشریح پنج تغییر در کدهای زبان Rust (Rust) پرداخت که حجم یک ورودی کش معمولی را از ۹۵۳ بایت به ۴۲۰ بایت کاهش داده است.
این تغییرات سرعت کش را نیز افزایش داد. کلادفلر گزارش داده است که توان عملیاتی درج اطلاعات (Insert Throughput) از ۶۲۵ هزار به ۸۹۳ هزار ورودی در ثانیه رسیده و تاخیر جستجو (Lookup Latency) از ۸۲۸ به ۶۷۰ نانوثانیه کاهش یافته است. در طول زمان استقرار این بهروزرسانی از اواسط اردیبهشت تا اوایل تیرماه، میزان مصرف حافظه صدک ۹۹ (p99) در هر نمونه (Instance) از ۹.۳ گیگابایت به ۵.۳ گیگابایت رسید.
به گفته کلادفلر، پلتفرم بیگ پایناپل در هر لحظه بیش از ۲۵۰ میلیارد ورودی DNS را در خود نگه میدارد و در چنین مقیاسی، حتی مقادیر ناچیز هدررفت حافظه نیز به سرعت روی هم انباشته میشوند. برآوردهای این شرکت نشان میدهد که تنها یک بایت اضافی در هر ورودی کش، بیش از ۲۵۰ گیگابایت هزینه منابع برای کل زیرساخت شبکه به همراه دارد.

یکی از بزرگترین تغییرات مربوط به انواع دادههای Vec و String در زبان برنامهنویسی Rust بود. این ساختارها برای توسعهپذیری طراحی شدهاند، بنابراین علاوه بر خود دادهها، اطلاعات مربوط به ظرفیت را نیز ذخیره میکنند؛ اما رکوردهای DNS پس از ورود به کش نیازی به گسترش ندارند. کلادفلر این ساختارها را با بخشهای محدود با اندازه ثابت (Fixed-size Boxed Slices) جایگزین کرد تا فرادادههای (Metadata) غیرضروری حذف شوند. این شرکت اعلام کرد که همین یک تغییر، بیش از ۱۵ ترابایت در مصرف رم صرفهجویی کرده است.
مهندسان همچنین در نحوه چیدمان پاسخهای DNS در حافظه تجدیدنظر کردند. در گذشته، بیگ پایناپل برای هر پاسخ، سه لیست رکورد جداگانه را ذخیره میکرد. در طراحی جدید، رکوردها در یک بافر واحد قرار میگیرند و با آفستهای دو بایتی شناسایی میشوند.
از این پس، زمانی که نام مالک (Owner Name) صرفاً تکرار همان دامنه جستجوشده باشد، کش آن را نگه نمیدارد. کلادفلر این نامها را هنگام ارسال پاسخ دوباره میسازد. علاوه بر این، دادههای رکورد اکنون به صورت بایتهای خام در قالب انتقال (Wire-format) و همراه با پیشوند طول ذخیره میشوند. این تغییر یک ناهماهنگی در طراحی قبلی را برطرف میکند؛ پیشتر، یک رکورد چهار بایتی IPv4 A به اندازه بزرگترین نوع رکورد DNS در کش کلادفلر (رکورد نسبتاً نامتداول NAPTR) یعنی ۱۴۴ بایت فضا اشغال میکرد. ذخیرهسازی دادههای خام در قالب دارای طول متغیر، این اتلاف منابع را کاهش میدهد.
۱۰۰ ترابایت حافظه رمی که کلادفلر در سراسر تجهیزات خود بازیابی کرده است، تقریباً با ظرفیت حافظه ۱۳۰ سرور نسل ۱۳ این شرکت که هر کدام دارای ۷۶۸ گیگابایت رم DDR5-6400 هستند، برابری میکند. این شرکت پیشتر پیکربندی ۱۱۵۲ گیگابایتی را برای این نسل از سرورها در نظر گرفته بود، اما پس از ارزیابی هزینههای بالای رمهای با ظرفیت بیشتر، از این تصمیم منصرف شد.
با صرفهجویی حاصلشده، کلادفلر قصد دارد این حافظه را به کشهای بزرگتر DNS اختصاص دهد. نگهداری محلی رکوردهای بیشتر باعث بهبود نرخ اصابت کش (Cache Hit Rate) شده و ترافیک ارسالی به سرورهای معتبر DNS را کاهش میدهد.
این پروژه در ادامه تلاش بزرگ دیگری برای بهینهسازی حافظه صورت میگیرد که سال گذشته با بازنویسی لایه پردازش درخواست FL2 کلادفلر با زبان Rust به پایان رسید. با توجه به افزایش قیمت حافظه سرورها، بهینهسازی کدها راهکاری بسیار مناسب برای استفاده بهینه از منابع و استخراج حداکثر توان از زیرساختهای فعلی است.











ارسال دیدگاه