آپاچی کافکا یکی از پلتفرمهایی هست که برای موارد متنوعی از خزشگر موتور جستجو گرفته تا سیستمهای تحلیل لاگ کاربرد خاص خودش رو داره. هدفم از این پست بیان چند مورد از پیکربندیهای مربوط به سیستم عامل هست که میتونه اولین گام برای بهبود کارایی کافکا باشه. در اینده در مورد سایر پارامترها هم صحبت میکنیم.
صفحات کثیف!
سیستمعامل برای اینکه عملیات I/O رو بهتر انجام بده از حافظه اصلی با دسترسی تصادفی (RAM) استفاده میکنه و باعث میشه کارایی سیستم به شکل قابل توجهی برای بارکاری (workload) نوشتن بهبود پیدا کنه. وقتی شما در حال نوشتن بر روی دیسک هستید دادهها ابتدا در حافظه اصلی ذخیره و بعدا در زمانی مشخص روی دیسک ذخیره میشن. به این صفحات از حافظه که هنوز روی دیسک فلاش نشدهان صفحات کثیف گفته میشه.
دو مورد از پارامترهای مهمی که در کرنل لینوکس صفحات کثیف رو کنترل میکنن در زیر ذکر شده:
- vm.dirty_ratio:
بیشترین مقداری از حافظه available که میتونه برای ذخیرهسازی صفحات کثیف استفاده بشه. این مقدار به درصد بیان میشه. بعد از اینکه این حدآستانه فرا برسه پردازهای که در حال نوشتن بوده بلاک میشه و منتظر خالی شدن میمونه.
- vm.dirty_background_ratio
درصدی از حافظه رو تعیین میکنه که به محض رسیدن میزان صفحات کثیف به اون، ترد pdflush شروع به کار میکنه و صفحات کثیف رو بر روی دیسک مینویسه. این مقدار به درصد بیان میشه و پیشفرض این پارامتر ۱۰ ست. بنابراین کاهش این مقدار سبب میشه تا کرنل در بازههای زمانی کوتاهتری فلاش کنه و اگه اون رو به صفر برسونیم کارایی سیستم به شکل قابل توجهی کاهش پیدا میکنه.
خب حالا؟
با توجه به اینکه در کافکا دیسک نقش تعیین کنندهای در کارایی سیستم داره پیکربندی این پارامترها مهمه. تجربه ما ثابت کرده که dirty_ratio رو بهتره در حدود ۶۰ قرار بدیم. این مقدار رو میتونیم حتی در حد ۸۰ درصد هم ببریم ولی در کل هر چه این مقدار افزایش پیدا کنه دادههای فلاش نشده افزایش پیدا میکنه و باعث میشه زمانی که سیستم عامل فلاش کردن رو force میکنه (یعنی synchronous) یک وقفه در سیستم اتفاق بیفته. از طرفی دیگه حتی زمانی که کافکا crash میکنه باعث از دست رفتن داده میشه که این رو میتونیم با استفاده از replication حل کنیم. در مورد پارامتر dirty_background_ratio هم توصیه میکنیم اون رو به ۵ کاهش بدید.
برای اطلاعات بیشتر این راهنما رو بخونید.
بافر شبکه
کرنل لینوکس این قابلیت رو به ما میده که خیلی راحت اون رو برای موارد خاص پیکربندی کنیم. فراموش نکنید که کرنل لینوکس برای انتقالهای سریع و حجیم از پیش پیکربندی نشده. به همین دلیل توصیه میکنم برای کافکا این تنظیمات رو متناسب با بار کاری خودتون تنظیم کنید. بنابراین با استفاده از پارامترهای net.core.wmem_default و net.core.rmem_default میزان بافر read/write سوکتهای سیستم رو مشخص کنید. توصیه میکنم که برای این دو پارامتر مقدار ۱۳۱۰۷۲ (۱۲۸ کیلوبایت) رو در نظر بگیرید. علاوه بر این دو پارامتر .net.core.[r|w]mem_max هم داریم که حداکثر مقدار این بافرها رو مشخص میکنن که توصیه میشه اون رو به ۲۰۹۷۱۵۲ (۲ مگابایت) مقدار دهی کنید.
علاوه بر این پارامترها، دو پارامتر net.ipv4.tcp_[w/r]mem هم برای تنظیمات tcp وجود داره که باید متناسب با بارکاری تغییر پیدا کنن. این دو پارامتر هر کدام ۳ مقدار min|default|max دارن که اولی حداقل میزان بافر و دومی مقدار پیشفرض و سومی حداکثر مقدار رو تعیین میکنه. این پارامترها رو با مقادیر ۴کیلوبایت (حداقل) ، ۶۴کیلوبایت(پیشفرض) و ۲ مگابایت (حداکثر) مقدار دهی کنید.
حافظه مجازی
در مرحله اول روی هر سرویسدهندهای توصیه میکنم swap رو غیر فعال کنید چون اگر به هر دلیلی برنامه شما نیاز به حافظه بیشتر داشته باشه و از swap استفاده کنه به شدت کاراییش رو از دست میده. اگر اصرار بر این دارید که از swap استفاده کنید توصیه میکنم پارامتر vm.swappiness رو به یک مقدار کم (مثلا ۱) مقدار دهی کنید. از مقدار صفر استفاده نکنید مگر اینکه دقیقا کرنلی که استفاده میکنید رو بشناسید. در گذشته مقدار صفر باعث میشد فقط در زمانی که outOfMemory اتفاق میافتاد از swap استفاده بشه ولی در حال حاضر معمولا مقدار صفر باعث میشه که هیچ وقت swap استفاده نشه.
دیسک
برای دیسک تنظیمات خاصی لازم نیست انجام بدید فقط حتما برای moun point دیسک از noatime استفاده کنید چون درغیر اینصورت باعث میشه بعد از هر بار read هم زمان دستیابی فایلها تغییر کنه که به این معنی یک write هست. این مشکل در دیسکهای ssd هم خودش رو به شکلی دیگه نشون میده که کم شدن عمر ssd هست.
بسیار عالی
میلاد عزیز بسیار عالی بود.