FQ(8) Linux FQ(8)

tc-fq - سیاست‌گذاری و مدیریت ترافیک با صف‌بندی عادلانه (Fair Queue)

tc qdisc ... fq [ limit PACKETS ] [ flow_limit PACKETS ] [ quantum BYTES ] [ initial_quantum BYTES ] [ maxrate RATE ] [ buckets NUMBER ] [ orphan_mask NUMBER ] [ pacing | nopacing ] [ ce_threshold TIME ]

FQ (صف‌بندی عادلانه یا Fair Queue) یک زمان‌بند بسته بدون کلاس (classless packet scheduler) است که عمدتاً برای ترافیک تولیدشده محلی (locally generated traffic) کاربرد دارد. این زمان‌بند برای دستیابی به گام‌بندی (pacing) به ازای هر جریان طراحی شده است. FQ جداسازی جریان‌ها را انجام می‌دهد و قادر است الزامات گام‌بندی تعیین‌شده توسط پشته TCP را رعایت کند. تمامی بسته‌های متعلق به یک سوکت به عنوان یک «جریان» (flow) در نظر گرفته می‌شوند. برای بسته‌های غیرمحلی (بار کاری مسیریاب)، از درهم‌سازی بسته (packet hash) به عنوان روش جایگزین استفاده می‌شود.

یک برنامه کاربردی می‌تواند با استفاده از فراخوانی SO_MAX_PACING_RATE در setsockopt، حداکثر نرخ گام‌بندی را مشخص کند. این زمان‌بند بسته با ایجاد تاخیر میان بسته‌ها، محدودیت نرخ تعیین‌شده برای هر سوکت را رعایت می‌کند. توجه داشته باشید که پس از لینوکس ۴.۲۰، هسته لینوکس مکانیزم EDT (زودترین زمان خروج یا Earliest Departure Time) را به کار گرفت و TCP مستقیماً زمان خروج مناسب را برای هر skb تنظیم می‌کند.

خروج بسته‌ها از صف (dequeueing) به شیوه نوبت‌گردشی (round-robin) انجام می‌شود. یک صف اختصاصی FIFO برای بسته‌های با اولویت بالا (اولویت TC_PRIO_CONTROL) رزرو شده است و این بسته‌ها همواره پیش از سایر بسته‌ها از صف خارج می‌شوند.

زمان‌بند FQ از نوع غیرحافظ کار (non-work-conserving) است.

گام‌بندی TCP برای جریان‌هایی که دوره‌های بی‌کاری (idle times) دارند مفید است، زیرا پنجره ازدحام به پشته TCP اجازه می‌دهد تعداد زیادی بسته را در صف قرار دهد. این ویژگی رویکرد «شروع آهسته پس از بی‌کاری» (slow start after idle) را برطرف می‌کند؛ رویکردی که به جریان‌های با BDP بزرگ و برنامه‌های انتقال‌دهنده داده‌های تکه‌ای مانند پخش ویدیو آسیب شدیدی وارد می‌کرد.

حد نهایی و سخت‌گیرانه روی اندازه واقعی صف. هنگامی که این حد تکمیل شود، بسته‌های ورودی جدید دور ریخته (drop) می‌شوند. اگر مقدار آن کاهش یابد، بسته‌ها دور ریخته می‌شوند تا محدودیت جدید برآورده شود. مقدار پیش‌فرض 10000 بسته است.

حد نهایی و سخت‌گیرانه برای حداکثر تعداد بسته‌های در صف به ازای هر جریان. مقدار پیش‌فرض 100 است.

اعتبار به ازای هر دور نوبت‌گردشی (RR) برای خروج از صف؛ یعنی مقدار بایتی که یک جریان مجاز است در یک نوبت از صف خارج کند. مقدار بزرگ‌تر به معنای فاصله زمانی طولانی‌تر تا نوبت خدمت‌رسانی به جریان بعدی خواهد بود. مقدار پیش‌فرض ۲ برابر MTU رابط شبکه است.

اعتبار اولیه نرخ ارسال؛ یعنی مقدار بایتی که یک جریان جدید در ابتدا مجاز است از صف خارج کند. این پارامتر به‌طور ویژه برای استفاده از IW10 بدون تاخیر افزوده طراحی شده است. مقدار پیش‌فرض ۱۰ برابر MTU رابط شبکه (یعنی ۱۵۱۴۰ بایت برای اترنت «استاندارد») است.

حداکثر نرخ ارسال برای یک جریان. مقدار پیش‌فرض نامحدود (unlimited) است. تنظیمات اختصاصی برنامه از طریق SO_MAX_PACING_RATE تنها در صورتی نادیده گرفته می‌شود که بزرگ‌تر از این مقدار باشد.

اندازه جدول درهم‌سازی مورد استفاده برای جستجوی جریان‌ها. به هر سطل (bucket) یک درخت سرخ‌وسیاه (red-black tree) برای مرتب‌سازی کارآمد تداخل‌ها تخصیص داده می‌شود. مقدار پیش‌فرض: 1024 است.

برای بسته‌هایی که متعلق به یک سوکت مشخص نیستند، fq می‌تواند بخشی از skb->hash را ماسک کرده و تعداد سطل‌های اختصاص‌یافته به آن ترافیک را کاهش دهد. این یک مکانیزم پیشگیری از حملات داس (DDOS) است و مقدار پیش‌فرض آن 1023 می‌باشد (به این معنا که بیش از 1024 جریان به این بسته‌ها اختصاص نمی‌یابد).

فعال یا غیرفعال کردن گام‌بندی جریان. مقدار پیش‌فرض فعال (enabled) است.

آستانه‌ای تعیین می‌کند که بالاتر از آن، تمامی بسته‌ها با علامت تجربه ازدحام ECN (Congestion Experienced) نشانه‌گذاری می‌شوند. این گزینه برای الگوریتم‌های کنترل ازدحام سبک DCTCP که به نشانه‌گذاری در آستانه‌های صف بسیار کم‌عمق نیاز دارند کاربرد دارد.

# tc qdisc add dev eth0 root fq ce_threshold 4ms
# tc -s -d qdisc show dev eth0
qdisc fq 8001: dev eth0 root refcnt 2 limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028b initial_quantum 15140b low_rate_threshold 550Kbit refill_delay 40.0ms ce_threshold 4.0ms
 Sent 72149092 bytes 48062 pkt (dropped 2176, overlimits 0 requeues 0)
 backlog 1937920b 1280p requeues 0
  flows 34 (inactive 17 throttled 0)
  gc 0 highprio 0 throttled 0 ce_mark 47622 flows_plimit 2176

tc(8), socket(7)

صف‌بندی FQ توسط Eric Dumazet نوشته شده است.

10 Sept 2015 iproute2