راهنمای رسیدن به ۱۰۰ گیگابیت روی لینوکس
خلاصهٔ کاملتر
نویسندهی pixeldrain تعریف میکنه که وقتی یک سرور با کارت شبکهی ۱۰۰ گیگابیتی سفارش داد، انتظار داشت همهچی از اول کار کنه؛ ولی سرور سر ۲۰ گیگابیت کرش میکرد و هاستش هم کمکی ازش برنیومد. این راهنما حاصل یک سال آزمون و خطا، خوندن دیتاشیت کارت شبکه، پروفایل گرفتن و پچ کردن کرنله.
اولین لایه sysctl هاست. به گفتهی او الگوریتم کنترل ازدحام BBR (یعنی همون منطقی که تصمیم میگیره با چه سرعتی داده بفرستی) تنها گزینهایه که با گم شدن یک پکت سرعت رو زمین نمیزنه، و بهتره qdisc رو هم روی fq بذاری تا BBR از pacing خود fq استفاده کنه. پچ tcp_shrink_window کلاودفلر هم که از کرنل ۶.۵ توی هسته اومده، مصرف حافظهی بافرهای TCP رو روی سرورهای او ۸۰ درصد کم کرده.
net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc=fq
net.ipv4.tcp_shrink_window=1اندازهی بافر TCP هم مستقیم سقف سرعت رو تعیین میکنه، چون تا وقتی ACK نرسیده باید داده توی حافظه بمونه. مثال خودش: رفتوبرگشت آمستردام تا توکیو حدود ۲۶۰ میلیثانیهست، پس برای ۱۰ گیگابیت باید حدود ۳۲۵ مگابایت رو نگه داری. برای همین سرورهای pixeldrain سقف بافر رو ۱ گیگابایت گذاشتن و net.ipv4.tcp_mem رو هم روی ۴۰، ۵۰ و ۶۰ درصد کل RAM تنظیم کردن تا سقف سراسری کرنل جلوی کار رو نگیره.
سمت کارت شبکه فقط سه چیز مهمه: تعداد channel ها به اندازهی هستههای یک CPU و نه پخششده روی دو سوکت (وگرنه کش thrash میشه و کارایی میریزه)، ring buffer روی بیشترین مقدار که برای کارتهای Mellanox معمولاً ۸۱۹۲ ـه، و interrupt coalescing دستی روی ۱۰۰ میکروثانیه با adaptive خاموش. کارتهای ConnectX-5 و ConnectX-6 هم به نظرش بهتر از Intel E810 جواب دادن و درایور داخل کرنل بهتر از درایور اختصاصیه.
اما تکاندهندهترین بخش مقاله BIOS ـه. نویسنده میگه IOMMU روشن عملاً کارت شبکهی گرانقیمتت رو بیمصرف میکنه و همون بود که هفتهها سرورهاش رو قفل میکرد. فقط اگه بیشتر از ۲۵۵ ترد CPU داری لینوکس به IOMMU احتیاج داره و باید به جای خاموش کردن، حالت passthrough رو با iommu=pt روشن کنی. در آخر هم pixeldrain اصلاً reverse proxy نداره و مستقیم از وبسرور داخلی Go استفاده میکنه، چون با nginx هر درخواست شش بار از مرز کرنل و یوزراسپیس رد میشه.
نکات کلیدی:
- پایهی تنظیمات: BBR بهعلاوهی qdisc برابر fq و tcp_shrink_window=1 روی کرنل ۶.۵ به بالا
- سقف بافر TCP روی سرورهای pixeldrain ۱ گیگابایت و tcp_mem روی ۴۰/۵۰/۶۰ درصد RAM
- ring buffer روی ۸۱۹۲ و rx/tx-usecs روی ۱۰۰ میکروثانیه با adaptive خاموش
- IOMMU روشن بزرگترین قاتل کارایی بود؛ با بیش از ۲۵۵ ترد به جاش iommu=pt
- به جای reverse proxy، وبسرور داخلی Go و SO_REUSEPORT برای ریاستارت بدون قطعی




