بلاگ/بهینه‌سازی شبکه سرور لینوکس: فعال‌سازی TCP BBR و تنظیم sysctl روی VPS و سرور اختصاصی
به‌روز شده

بهینه‌سازی شبکه سرور لینوکس: فعال‌سازی TCP BBR و تنظیم sysctl روی VPS و سرور اختصاصی

1405/06/090 بازدید
بهینه‌سازی شبکه سرور لینوکس: فعال‌سازی TCP BBR و تنظیم sysctl روی VPS و سرور اختصاصی

بهینه‌سازی شبکه سرور لینوکس: فعال‌سازی TCP BBR و تنظیم sysctl روی VPS و سرور اختصاصی

نمای شماتیک بهینه‌سازی شبکه سرور لینوکس با TCP BBR سرعت دانلود از یک سرور فقط به پهنای باند پورت آن وابسته نیست. الگوریتم کنترل ازدحام TCP، تأخیر مسیر، نرخ از دست رفتن بسته‌ها، اندازه بافرها و محدودیت‌های مجازی‌ساز هم روی throughput واقعی اثر دارند. ممکن است یک VPS به پورت یک گیگابیتی متصل باشد، اما در انتقال فایل روی مسیری با تأخیر زیاد تنها بخشی از این ظرفیت را استفاده کند. BBR الگوریتم کنترل ازدحام TCP توسعه‌یافته توسط گوگل است. این الگوریتم به‌جای تکیه‌ی اصلی بر از دست رفتن بسته برای تشخیص ازدحام، پهنای باند قابل‌دستیابی و حداقل زمان رفت‌وبرگشت را تخمین می‌زند. در بعضی مسیرهای دارای تأخیر یا packet loss، نتیجه می‌تواند throughput پایدارتر و صف کوتاه‌تر باشد. در این راهنما، فعال کردن TCP BBR در لینوکس را مرحله‌به‌مرحله انجام می‌دهیم، چند تنظیم sysctl کم‌خطر و قابل‌اندازه‌گیری را بررسی می‌کنیم و با iperf3 وضعیت قبل و بعد را می‌سنجیم. دستورها برای توزیع‌های رایج مبتنی بر Debian، Ubuntu، RHEL، Rocky Linux و AlmaLinux قابل استفاده‌اند؛ هرجا تفاوتی وجود داشته باشد، آن را مشخص می‌کنیم.

پیش از شروع: BBR چه چیزی را تغییر می‌دهد؟

هر اتصال TCP باید تصمیم بگیرد چه مقدار داده را بدون دریافت تأیید از مقصد در شبکه نگه دارد. الگوریتم کنترل ازدحام این مقدار را تنظیم می‌کند. CUBIC، الگوریتم پیش‌فرض بسیاری از توزیع‌های لینوکسی، اندازه پنجره ازدحام را با تابعی مکعبی تغییر می‌دهد و معمولاً عملکرد مناسبی در اینترنت عمومی دارد. BBR مدل متفاوتی دارد. این الگوریتم به‌طور پیوسته دو مقدار را تخمین می‌زند: - بیشترین نرخ تحویل داده که اتصال اخیراً تجربه کرده است - کمترین RTT مشاهده‌شده که تخمینی از تأخیر مسیر بدون صف است BBR با استفاده از این دو مقدار، نرخ ارسال و حجم داده در حال انتقال را کنترل می‌کند. هدف آن پر نگه داشتن مسیر انتقال، بدون ساختن صف‌های طولانی در تجهیزات میانی است. تغییر الگوریتم کنترل ازدحام نمی‌تواند محدودیت پورت، کیفیت ضعیف مسیر، CPU اشباع‌شده یا محدودیت اعمال‌شده توسط ارائه‌دهنده را حذف کند. BBR همچنین سرعت UDP را افزایش نمی‌دهد، چون کنترل ازدحام TCP فقط روی اتصال‌های TCP اثر دارد.

مقایسه CUBIC و BBR

هیچ الگوریتمی در تمام شبکه‌ها برنده نیست. انتخاب درست به RTT، میزان ازدحام، نوع ترافیک و رفتار شبکه مقصد بستگی دارد.

معیارCUBICBBR
مبنای اصلی تصمیم‌گیریرشد پنجره و واکنش به از دست رفتن بستهتخمین پهنای باند و حداقل RTT
عملکرد در مسیرهای کم‌تأخیرمعمولاً مناسبمعمولاً مناسب
عملکرد در مسیرهای با RTT بالاممکن است دیرتر به ظرفیت برسددر بسیاری از مسیرها ظرفیت را سریع‌تر پیدا می‌کند
حساسیت به packet loss غیرناشی از ازدحامبیشترمعمولاً کمتر
احتمال تشکیل صف طولانیبه وضعیت شبکه وابسته استبا مدیریت pacing برای کاهش صف طراحی شده است
نتیجه روی هر سرورقابل پیش‌بینی نیست؛ باید اندازه‌گیری شودقابل پیش‌بینی نیست؛ باید اندازه‌گیری شود

نمودار مقایسه‌ای رفتار CUBIC و BBR: نحوهٔ پر کردن پهنای باند مسیر و تفاوت در طول صف بسته‌ها در تجهیزات میانی

نسخه BBR موجود به کرنل توزیع بستگی دارد. صرف مشاهده نام bbr در فهرست الگوریتم‌ها به معنی استفاده از جدیدترین نسل BBR نیست. برای بیشتر مدیران سرور، استفاده از نسخه پشتیبانی‌شده در کرنل رسمی توزیع از نصب کرنل آزمایشی انتخاب مطمئن‌تری است.

بررسی پیش‌نیازهای سرور

برای فعال‌سازی پایدار به دسترسی root یا امکان اجرای sudo نیاز دارید. ابتدا نسخه کرنل را ببینید:

uname -r

سپس الگوریتم فعلی و الگوریتم‌های در دسترس را بررسی کنید:

sysctl net.ipv4.tcp_congestion_control
sysctl net.ipv4.tcp_available_congestion_control

خروجی ممکن است شبیه نمونه زیر باشد:

net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_available_congestion_control = reno cubic

اگر bbr در فهرست نیست، بررسی کنید ماژول آن در کرنل وجود دارد یا نه:

modinfo tcp_bbr

اگر این فرمان اطلاعات ماژول را نشان داد، آن را بارگذاری کنید:

sudo modprobe tcp_bbr

حالا دوباره فهرست الگوریتم‌ها را بخوانید:

sysctl net.ipv4.tcp_available_congestion_control

در بعضی کرنل‌ها BBR به‌صورت داخلی کامپایل شده و modinfo خروجی ندارد، اما نام آن همچنان در tcp_available_congestion_control دیده می‌شود. معیار نهایی همین فهرست است. اگر BBR در دسترس نیست، ابتدا بسته‌های رسمی کرنل توزیع را به‌روزرسانی و سرور را در یک بازه نگهداری راه‌اندازی مجدد کنید. تعویض کرنل روی سرور راه دور ریسک قطع دسترسی دارد؛ پیش از reboot از وجود کنسول اضطراری و نسخه پشتیبان مطمئن شوید.

فعال کردن TCP BBR در لینوکس

برای استفاده از BBR دو تنظیم اصلی نیاز است: الگوریتم کنترل ازدحام روی bbr قرار بگیرد و یک queue discipline مناسب مانند fq انتخاب شود. یک فایل مستقل بسازید تا تنظیمات با فایل اصلی /etc/sysctl.conf مخلوط نشوند:

sudo nano /etc/sysctl.d/99-tcp-bbr.conf

محتوای زیر را در فایل قرار دهید:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

تنظیمات را بدون reboot اعمال کنید:

sudo sysctl --system

سپس نتیجه را کنترل کنید:

sysctl net.core.default_qdisc
sysctl net.ipv4.tcp_congestion_control

خروجی مورد انتظار چنین است:

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

وجود ماژول بارگذاری‌شده را نیز می‌توان با این فرمان بررسی کرد:

lsmod | grep tcp_bbr

اگر BBR داخل خود کرنل کامپایل شده باشد، نبودن آن در خروجی lsmod الزاماً خطا نیست. مقدار tcp_congestion_control و مشاهده BBR روی اتصال فعال، بررسی دقیق‌تری است.

اطمینان از بارگذاری ماژول پس از راه‌اندازی مجدد

اگر توزیع شما BBR را به شکل ماژول ارائه می‌کند، نام آن را در تنظیمات بارگذاری خودکار ثبت کنید:

echo tcp_bbr | sudo tee /etc/modules-load.d/tcp-bbr.conf

پس از reboot دوباره این دو مقدار را بررسی کنید:

sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc

تنظیم sysctl بدون نسخه‌های جادویی

در اینترنت فایل‌هایی با ده‌ها تنظیم sysctl پیدا می‌شوند که بدون توجه به RAM، سرعت پورت و نوع بار کاری پیشنهاد شده‌اند. کپی کردن چنین فایل‌هایی ممکن است مصرف حافظه را بالا ببرد یا رفتار شبکه را بدتر کند. هر پارامتر باید برای یک مشکل اندازه‌گیری‌شده تغییر کند.

افزایش سقف بافرهای TCP

در مسیرهایی با پهنای باند و RTT بالا، پنجره TCP باید بتواند به اندازه حاصل‌ضرب پهنای باند و تأخیر رشد کند. برای نمونه، مسیر یک گیگابیتی با RTT برابر ۱۰۰ میلی‌ثانیه تقریباً به ۱۲٫۵ مگابایت داده در حال پرواز نیاز دارد. لینوکس autotuning دارد، اما سقف بافر ممکن است برای بعضی ارتباط‌ها پایین باشد. یک نقطه شروع محافظه‌کارانه برای سروری با RAM کافی:

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 131072 16777216
net.ipv4.tcp_wmem = 4096 131072 16777216

این اعداد بر حسب بایت هستند. مقدارهای tcp_rmem و tcp_wmem به‌ترتیب حداقل، پیش‌فرض و حداکثر را مشخص می‌کنند. افزایش سقف به این معنی نیست که تمام اتصال‌ها فوراً ۱۶ مگابایت حافظه مصرف می‌کنند، اما تعداد زیاد اتصال می‌تواند مصرف کلی را افزایش دهد. برای شروع، بهتر است BBR را به‌تنهایی آزمایش کنید. فقط وقتی داده‌های تست نشان می‌دهد پنجره یا بافر گلوگاه است، تنظیمات بافر را اضافه کنید.

حفظ تنظیمات در یک فایل جداگانه

می‌توانید تنظیمات تکمیلی را در فایل دیگری نگه دارید:

sudo nano /etc/sysctl.d/99-network-tuning.conf

پس از ویرایش، ابتدا صحت فایل را با اعمال آن بررسی کنید:

sudo sysctl -p /etc/sysctl.d/99-network-tuning.conf

اگر خطایی دریافت شد، همان پارامتر را بررسی یا حذف کنید. نام پارامترها و امکان تغییر آن‌ها ممکن است میان نسخه‌های کرنل، کانتینرها و میزبان‌های مجازی متفاوت باشد.

بنچمارک قبل و بعد با iperf3

بدون تست کنترل‌شده و بنچمارک نمی‌توان گفت BBR روی سرور شما مفید بوده است. speedtest برای مشاهده تقریبی سرعت اینترنت مناسب است، اما برای مقایسه الگوریتم‌های TCP کنترل کافی روی مقصد، تعداد جریان‌ها و مدت تست نمی‌دهد. iperf3 ابزار مناسب‌تری است. روی Debian و Ubuntu نصب کنید:

sudo apt update
sudo apt install iperf3

روی Rocky Linux، AlmaLinux یا RHEL:

sudo dnf install iperf3

به دو سرور نیاز دارید؛ بهتر است میان آن‌ها RTT و مسیر واقعی مشابه کاربران هدف باشد. روی سرور مقصد اجرا کنید:

iperf3 -s

پورت پیش‌فرض 5201/TCP است. آن را فقط برای IP مبدأ در فایروال باز کنید. روی سرور مورد آزمایش این فرمان را اجرا کنید:

iperf3 -c SERVER_IP -t 30

برای سنجش مسیر معکوس:

iperf3 -c SERVER_IP -t 30 -R

برای بررسی چند جریان هم‌زمان:

iperf3 -c SERVER_IP -t 30 -P 4

یک جریان تکی برای تشخیص اثر کنترل ازدحام مفیدتر است؛ تست چندجریانی نشان می‌دهد برنامه‌هایی که چند اتصال دارند چه عملکردی خواهند داشت.

روش مقایسه منصفانه

ابتدا با CUBIC سه بار تست بگیرید:

sudo sysctl -w net.ipv4.tcp_congestion_control=cubic
iperf3 -c SERVER_IP -t 30

بعد BBR را فعال کنید و همان تست را در همان ساعت، روی همان مقصد و با همان گزینه‌ها تکرار کنید:

sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
iperf3 -c SERVER_IP -t 30

میانگین throughput، تعداد retransmission و ثبات نرخ انتقال را مقایسه کنید. یک اجرای منفرد ممکن است تحت تأثیر ازدحام لحظه‌ای اینترنت قرار بگیرد. بهتر است نتایج را در چند ساعت مختلف ثبت کنید. برای بررسی RTT زیر بار، هم‌زمان با اجرای iperf3 از یک ترمینال دیگر مقصد را ping کنید:

ping SERVER_IP

اگر throughput افزایش یافته اما RTT زیر بار چند برابر شده است، فقط عدد پهنای باند را مبنای تصمیم قرار ندهید. کیفیت شبکه برای API، SSH و برنامه‌های تعاملی به تأخیر نیز وابسته است.

بررسی BBR روی اتصال واقعی

فرمان ss اطلاعات TCP را از سوکت‌های فعال نشان می‌دهد. هنگام وجود یک انتقال TCP، اجرا کنید:

ss -ti

در جزئیات اتصال به دنبال bbr بگردید. برای محدود کردن خروجی به یک پورت مشخص، برای مثال HTTPS:

ss -ti sport = :443

توجه کنید تغییر tcp_congestion_control معمولاً روی اتصال‌های TCP جدید اعمال می‌شود. برای اطمینان، پس از تغییر الگوریتم یک اتصال تازه ایجاد کنید و همان را بررسی کنید. اگر سرور داخل کانتینر اجرا می‌شود، ممکن است اجازه تغییر این پارامترها را نداشته باشید. کنترل الگوریتم TCP و queue discipline معمولاً در اختیار کرنل میزبان است. در VPS کامل با مجازی‌سازی KVM معمولاً دسترسی بیشتری دارید، اما سیاست ارائه‌دهنده همچنان تعیین‌کننده است.

خطاهای رایج و راه‌حل آن‌ها

خطای «No such file or directory»

اگر هنگام تنظیم BBR این خطا را می‌بینید، کرنل احتمالاً الگوریتم را ارائه نمی‌کند یا ماژول آن بارگذاری نشده است. خروجی این دو فرمان را بررسی کنید:

modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

اگر همچنان BBR دیده نمی‌شود، از کرنل رسمی جدیدتر توزیع استفاده کنید.

خطای «Operation not permitted»

این خطا معمولاً در کانتینرهای بدون دسترسی لازم رخ می‌دهد. تغییر sysctl از داخل کانتینر ممکن نیست و باید در میزبان انجام شود. در یک سرویس مدیریت‌شده نیز شاید لازم باشد موضوع را از پشتیبانی ارائه‌دهنده پیگیری کنید.

افزایش نیافتن سرعت

ثابت ماندن throughput الزاماً نشانه خرابی BBR نیست. ممکن است عامل محدودکننده یکی از این موارد باشد: - سقف سرعت پورت یا محدودیت پلن - محدودیت دیسک هنگام انتقال فایل - CPU اشباع‌شده به‌دلیل TLS، VPN یا رمزنگاری - مسیر کم‌تأخیر و بدون packet loss که CUBIC روی آن خوب عمل می‌کند - محدودیت سمت گیرنده یا شبکه مقصد - شکل‌دهی ترافیک در hypervisor یا شبکه ارائه‌دهنده برای جداسازی مشکل دیسک از شبکه، iperf3 را به‌جای انتقال فایل استفاده کنید. هنگام تست نیز مصرف CPU، retransmission و RTT را زیر نظر بگیرید.

بازگرداندن تنظیمات

اگر نتیجه بدتر شد، الگوریتم را موقتاً به CUBIC برگردانید:

sudo sysctl -w net.ipv4.tcp_congestion_control=cubic

برای بازگشت پایدار، فایل /etc/sysctl.d/99-tcp-bbr.conf را ویرایش کنید:

net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = cubic

پیش از انتخاب fq_codel بررسی کنید که در کرنل شما موجود باشد. سپس تنظیمات را اعمال کنید:

sudo sysctl --system

اگر تنظیمات تکمیلی بافر را نیز افزوده‌اید، آن‌ها را جداگانه حذف کنید تا مشخص شود کدام تغییر روی نتیجه اثر داشته است.

انتخاب زیرساخت مناسب برای ترافیک شبکه

BBR می‌تواند استفاده TCP از مسیر را بهتر کند، اما ظرفیت پردازنده، کیفیت شبکه و محدودیت پورت را تغییر نمی‌دهد. برای وب‌سایت، API، پراکسی و load balancer یا سرویس دانلود با بار متوسط، یک سرور مجازی ابری آریاسرویس امکان انتخاب منابع متناسب با بار کاری را فراهم می‌کند. برای بارهای سنگین‌تر، راهنمای خرید سرور اختصاصی گزینه‌های CPU و پهنای باند بیشتر را بررسی می‌کند. پیش از تهیه سرویس، موقعیت کاربران، حجم ترافیک، نیاز پردازشی و سقف پهنای باند پلن را کنار هم بررسی کنید.

جمع‌بندی

برای فعال کردن TCP BBR در لینوکس، ابتدا باید پشتیبانی کرنل را با tcp_available_congestion_control بررسی کنید. سپس net.ipv4.tcp_congestion_control=bbr و معمولاً net.core.default_qdisc=fq را در یک فایل زیر /etc/sysctl.d/ قرار دهید و با sysctl --system اعمال کنید. مرحله مهم‌تر، اندازه‌گیری است. با iperf3 در شرایط یکسان از CUBIC و BBR تست بگیرید، تست معکوس را هم اجرا کنید و علاوه بر throughput، به retransmission و RTT زیر بار توجه داشته باشید. تنظیمات بافر را تنها در صورت مشاهده گلوگاه و با در نظر گرفتن RAM و تعداد اتصال‌ها تغییر دهید. این روش نتیجه‌ای قابل دفاع‌تر از کپی کردن یک فهرست طولانی از پارامترهای sysctl دارد.