TC(8) Linux TC(8)

tc-ets - زمان‌بند گزینش انتقال ارتقایافته (Enhanced Transmission Selection)

tc qdisc ... ets [ bands number ] [ strict number ] [ quanta bytes bytes bytes... ] [ priomap band band band... ]

tc class ... ets [ quantum bytes ]

زمان‌بند گزینش انتقال ارتقایافته (Enhanced Transmission Selection یا ETS) یک انضباط صف باکلاس (classful) است که قابلیت‌های انضباط‌های صف PRIO و DRR را در قالب یک زمان‌بند ترکیب می‌کند. ETS پیکربندی مجموعه‌ای از باندهای اولویت قطعی (strict) و باندهای اشتراک پهنای‌باند (bandwidth-sharing) را برای پیاده‌سازی سازوکار گزینش انتقال شرح‌داده‌شده در استاندارد 802.1Qaz آسان می‌سازد.

هنگام ایجاد با دستور 'tc qdisc add' ، تعداد ثابتی از باندها ایجاد می‌شود. هر باند یک کلاس است، اگرچه افزودن و حذف مستقیم باندها با دستورات 'tc class' امکان‌پذیر نیست. در عوض، تعداد باندهایی که باید ایجاد شوند باید در زمان افزودن qdisc در خط فرمان مشخص شود.

شماره فرعی (minor number) شناسه کلاس (classid) که برای ارجاع به یک باند استفاده می‌شود، برابر با شماره باند به‌علاوه یک است. بنابراین باند ۰ دارای شناسه کلاس major:1، باند ۱ دارای شناسه major:2 و به همین ترتیب خواهد بود.

باندهای ETS از دو نوع هستند: تعدادی از آن‌ها می‌توانند در حالت اکید (strict) باشند و بقیه در حالت اشتراک پهنای‌باند (bandwidth-sharing) قرار گیرند.

هنگام خروج بسته از صف (dequeuing)، ابتدا باندهای اکید (strict) در صورت وجود بررسی می‌شوند. ابتدا باند ۰ بررسی می‌شود؛ اگر بسته‌ای تحویل ندهد، باند ۱ بررسی می‌شود و این روند تا زمانی ادامه می‌یابند که یکی از باندها بسته‌ای را تحویل دهد یا تمام باندهای اکید بررسی شده باشند.

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

تنها qdiscهایی که صف مختص به خود را دارند باید در زیر باندهای اشتراک پهنای‌باند اضافه شوند. پیوست کردن qdiscهای بدون حفظ کار (non-work-conserving) مانند TBF به آن‌ها منطقی نیست -- زیرا سایر qdiscهای موجود در فهرست فعال تا زمان موفقیت‌آمیز بودن عملیات خروج از صف نادیده گرفته خواهند شد. این محدودیت در مورد باندهای اکید وجود ندارد.

انضباط صف ETS سه روش را برای تعیین باندی که بسته باید در آن صف‌بندی (enqueue) شود، فراهم می‌کند:

  • اولویت بسته می‌تواند مستقیماً روی یک شناسه کلاس (class handle) تنظیم شود، که در این صورت بسته در همان صف قرار خواهد گرفت. به عنوان مثال، باند شماره ۲ از یک qdisc با شناسه 11: دارای شناسه کلاس 11:3 خواهد بود. برای علامت‌گذاری بسته جهت صف‌بندی در این باند، اولویت بسته باید بر روی 0x110003 تنظیم شود.
  • یک فیلتر tc متصل به qdisc می‌تواند با استفاده از کلمه کلیدی flowid بسته را به یک باند هدایت کند.
  • به عنوان آخرین راهکار، انضباط صف ETS به جدول priomap خود (توضیح در زیر) مراجعه می‌کند که بسته‌ها را بر اساس اولویت بسته به باندها نگاشت می‌نماید.

تعداد باندهایی که باید در حالت اکید ایجاد شوند. اگر مشخص نشود، این مقدار 0 است.
هر باند اشتراک پهنای‌باند نیاز دارد کوانتوم خود را بداند، که همان مقدار بایتی است که باند مجاز است پیش از حرکت زمان‌بند به باند اشتراک پهنای‌باند بعدی از صف خارج کند. آرگومان quanta مقادیر کوانتوم را برای هر یک از باندهای اشتراک پهنای‌باند فهرست می‌کند. حداقل مقدار برای هر کوانتوم ۱ است. اگر quanta مشخص نشود، حالت پیش‌فرض بدون باندهای اشتراک پهنای‌باند است، اما توجه داشته باشید که هنگام تعیین تعداد زیادی از bands، باندهای اضافی به‌طور پیش‌فرض در حالت اشتراک پهنای‌باند خواهند بود.
تعداد باندها که به‌طور صریح مشخص می‌شود. این مقدار باید حداقل به اندازه‌ای بزرگ باشد که باندهای اکید تعیین‌شده با کلمه کلیدی strict و باندهای اشتراک پهنای‌باند تعیین‌شده در quanta را پوشش دهد. اگر مقدار بزرگ‌تری مشخص شود، هر باند اضافی در حالت اشتراک پهنای‌باند خواهد بود و کوانتوم آن‌ها بر اساس MTU رابط شبکه محاسبه می‌شود. اگر مقداری داده نشود، به تعداد لازم باند ایجاد می‌شود تا تمامی باندهای تعیین‌شده توسط کلمات کلیدی strict و quanta پوشش داده شوند.
جدول priomap اولویت یک بسته را به یک باند نگاشت می‌کند. آرگومان فهرستی از اعداد است. اولین عدد مشخص می‌کند بسته‌های با اولویت ۰ باید در کدام باند قرار گیرند، عدد دوم برای اولویت ۱ است و به همین ترتیب.

این فهرست می‌تواند تا ۱۶ عدد داشته باشد. اگر تعداد کمتری مشخص شود، باند پیش‌فرضی که ترافیک با یکی از اولویت‌های ذکرنشده به آن می‌رود، آخرین باند است.

افزودن یک qdisc با ۸ باند اشتراک پهنای‌باند، با استفاده از MTU رابط شبکه به عنوان کوانتوم آن‌ها. از آنجا که تمام کوانتوم‌ها یکسان هستند، این امر به توزیع برابر پهنای‌باند بین باندها منجر می‌شود و هر کدام حدود ۱۲٫۵٪ از پیوند را دریافت می‌کنند. ۸ اولویت پایین به صورت معکوس ۱:۱ به باندهای مجزا اختصاص می‌یابند (به طوری که بالاترین اولویت به اولین باند اختصاص می‌یابد):

# tc qdisc add dev eth0 root handle 1: ets bands 8 priomap 7 6 5 4 3 2 1 0
# tc qdisc show dev eth0
qdisc ets 1: root refcnt 2 bands 8 quanta 1514 1514 1514 1514 1514 1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

تنظیم اولین باند از qdisc فوق جهت اختصاص کوانتوم ۲۶۵۰ به آن، که حدود ۲۰٪ از پیوند را به آن اختصاص می‌دهد (و حدود ۱۱٫۵٪ به باندهای باقی‌مانده):

# tc class change dev eth0 classid 1:1 ets quantum 2650
# tc qdisc show dev eth0
qdisc ets 1: root refcnt 2 bands 8 quanta 2650 1514 1514 1514 1514 1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

ایجاد یک qdisc کاملاً اکید با نگاشت معکوس ۱:۱ بین اولویت‌ها و باندها:

# tc qdisc add dev eth0 root handle 1: ets strict 8 priomap 7 6 5 4 3 2 1 0
# tc qdisc sh dev eth0
qdisc ets 1: root refcnt 2 bands 8 strict 8 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

افزودن یک qdisc با ۶ باند؛ ۳ باند اکید و ۳ باند ETS با وزن‌های ۳۵٪، ۳۰٪ و ۲۵٪:

# tc qdisc add dev eth0 root handle 1: ets strict 3 quanta 3500 3000 2500 priomap 0 1 1 1 2 3 4 5
# tc qdisc sh dev eth0
qdisc ets 1: root refcnt 2 bands 6 strict 3 quanta 3500 3000 2500 priomap 0 1 1 1 2 3 4 5 5 5 5 5 5 5 5 5

ایجاد یک qdisc به گونه‌ای که ترافیک با اولویت‌های ۲، ۳ و ۴ نسبت به سایر ترافیک‌ها اولویت اکید داشته باشند و بقیه به کلاس‌های اشتراک پهنای‌باند با وزن‌های برابر بروند:

# tc qdisc add dev eth0 root handle 1: ets bands 8 strict 3 priomap 3 4 0 1 2 5 6 7
# tc qdisc sh dev eth0
qdisc ets 1: root refcnt 2 bands 8 strict 3 quanta 1514 1514 1514 1514 1514 priomap 3 4 0 1 2 5 6 7 7 7 7 7 7 7 7 7

tc(8), tc-prio(8), tc-drr(8)

بخش‌هایی از این صفحه راهنما و همچنین خود کد از انضباط‌های صف PRIO و DRR برگرفته شده‌اند.
خود انضباط صف ETS توسط Petr Machata نوشته شده است.

December 2019 iproute2