TC(8) Linux TC(8)

tc-drr - زمان‌بند نوبت‌گردشی با کسری (Deficit Round Robin) در کنترل ترافیک

drr - زمان‌بند نوبت‌گردشی با کسری

tc qdisc ... add drr [ quantum بایت‌ها ]

زمان‌بند نوبت‌گردشی با کسری (Deficit Round Robin Scheduler) یک انضباط صف‌بندی دارای کلاس (classful qdisc) است که به عنوان جایگزینی انعطاف‌پذیرتر برای صف‌بندی منصفانه تصادفی (SFQ) به کار می‌رود.

برخلاف SFQ، در اینجا هیچ صف پیش‌ساخته‌ای وجود ندارد -- شما باید کلاس‌ها را اضافه کرده و سپس فیلترهایی را برای دسته‌بندی بسته‌ها بر همین اساس تنظیم کنید. این ویژگی می‌تواند به عنوان مثال برای استفاده از qdiscهای RED با تنظیمات متفاوت برای ترافیک‌های خاص سودمند باشد. هیچ کلاس پیش‌فرضی وجود ندارد -- اگر بسته‌ای نتواند دسته‌بندی شود، دور انداخته می‌شود (drop می‌گردد).

به هر کلاس یک شمارنده کسری (deficit counter) اختصاص داده می‌شود که مقدار اولیه آن برابر با quantum است.

الگوریتم DRR یک فهرست «فعال» (داخلی) از کلاس‌هایی که qdiscهای آن‌ها غیرخالی هستند نگهداری می‌کند. از این فهرست برای خارج کردن بسته‌ها از صف (dequeuing) استفاده می‌شود. اگر اندازه بسته کوچکتری یا مساوی مقدار شمارنده کسری باشد، بسته از کلاس واقع در ابتدای فهرست خارج می‌شود. اگر شمارنده خیلی کوچک باشد، مقدار آن به اندازه quantum افزایش می‌یابد و زمان‌بند به سراغ کلاس بعدی در فهرست فعال می‌رود.

میزان بایت‌هایی که یک جریان مجاز است پیش از انتقال زمان‌بند به کلاس بعدی، از صف خارج کند. مقدار پیش‌فرض آن برابر با MTU رابط شبکه است. حداقل مقدار مجاز ۱ است.

برای اتصال به دستگاه eth0، با استفاده از MTU رابط شبکه به عنوان مقدار quantum آن:

# tc qdisc add dev eth0 handle 1 root drr

افزودن دو کلاس:

# tc class add dev eth0 parent 1: classid 1:1 drr
# tc class add dev eth0 parent 1: classid 1:2 drr

همچنین باید حداقل یک فیلتر برای دسته‌بندی بسته‌ها اضافه کنید:

# tc filter add dev eth0 protocol .. classid 1:1

مانند SFQ، انضباط DRR تنها زمانی سودمند است که خودش مالک صف باشد -- این یک زمان‌بند خالص است و بسته‌ها را به تاخیر نمی‌اندازد. متصل کردن انضباط‌های صف غیرمحافظه‌کار کار (non-work-conserving) مانند tbf به آن منطقی نیست -- زیرا سایر qdiscها در فهرست فعال نیز تا زمان موفقیت عملیات خروج از صف غیرفعال باقی خواهند ماند. انضباط DRR را درون یک qdisc دیگر مانند HTB یا HFSC جای‌گذاری کنید تا اطمینان حاصل شود که مالک صف است.

می‌توانید با تخصیص دادن بسته‌ها به کلاس‌های متصل‌شده با استفاده از فیلتر جریان (flow filter)، رفتار SFQ را شبیه‌سازی کنید:

# tc qdisc add dev .. drr
# for i in .. 1024;do
    tc class add dev .. classid $handle:$(print %x $i)
    tc qdisc add dev .. fifo limit 16
# done
# tc filter add .. protocol ip .. $handle flow hash keys src,dst,proto,proto-src,proto-dst divisor 1024 perturb 10

M. Shreedhar and George Varghese "Efficient Fair Queuing using Deficit Round Robin", Proc. SIGCOMM 95.

این پیاده‌سازی هنگام سرریز، بسته‌ها را از طولانی‌ترین صف دور نمی‌اندازد، زیرا محدودیت‌ها توسط تک‌تک qdiscهای فرزند مدیریت می‌شوند.

tc(8), tc-htb(8), tc-sfq(8)

ماژول sched_drr توسط Patrick McHardy نوشته شده است.

January 2010 iproute2