TAPRIO(8) Linux TAPRIO(8)

tc-taprio - شکل‌دهنده اولویت آگاه به زمان (Time Aware Priority Shaper)

tc qdisc ... dev dev parent classid [ handle major: ] taprio num_tc tcs map P0 P1 P2 ... queues count1@offset1 count2@offset2 ... base-time base-time clockid clockid sched-entry <command 1> <gate mask 1> <interval 1> sched-entry <command 2> <gate mask 2> <interval 2> sched-entry <command 3> <gate mask 3> <interval 3> sched-entry <command N> <gate mask N> <interval N> [ max-sdu <queueMaxSDU[TC 0]> <queueMaxSDU[TC 1]> <queueMaxSDU[TC N]> ] [ fp <adminStatus[TC 0]> <adminStatus[TC 1]> <adminStatus[TC N]> ]

انضباط صف TAPRIO نسخه‌ای ساده‌شده از ماشین حالت زمان‌بندی تعریف‌شده در بخش 8.6.9 استاندارد IEEE 802.1Q-2018 را پیاده‌سازی می‌کند، که امکان پیکربندی دنباله‌ای از وضعیت‌های درگاه (gate states) را فراهم می‌سازد؛ به طوری که هر وضعیت درگاه، ترافیک خروجی را برای زیرمجموعه‌ای (احتمالاً خالی) از کلاس‌های ترافیک مجاز می‌دارد.

نحوه نگاشت ترافیک به صف‌های سخت‌افزاری مختلف مشابه با mqprio(8) است و بنابراین پارامترهای map و queues معنای یکسانی دارند.

سایر پارامترها زمان‌بندی و نقطه‌ای از زمان را که باید از آن آغاز شود مشخص می‌کنند (می‌تواند به گونه‌ای عمل کند که گویی زمان‌بندی در گذشته آغاز شده است).

تعداد کلاس‌های ترافیک مورد استفاده. تا ۱۶ کلاس پشتیبانی می‌شود.

نگاشت اولویت به کلاس ترافیک. اولویت‌های ۰ تا ۱۵ را به یک کلاس ترافیک مشخص نگاشت می‌کند. برای جزئیات بیشتر به mqprio(8) مراجعه کنید.

تعداد و آفست محدوده صف را برای هر کلاس ترافیک تعیین می‌کند. در قالب count@offset. محدوده‌های صف برای هر کلاس ترافیک نباید هم‌پوشانی داشته باشند و باید یک محدوده پیوسته از صف‌ها باشند.

لحظه شروع زمان‌بندی را بر حسب نانوثانیه و با استفاده از مرجع clockid مشخص می‌کند. اگر 'base-time' زمانی در گذشته باشد، زمان‌بندی در این زمان شروع خواهد شد:
base-time + (N * cycle-time)

که در آن N کوچک‌ترین عدد صحیحی است که زمان حاصل از آن بزرگ‌تر از «اکنون» (now) باشد، و «cycle-time» مجموع تمام بازه‌های ورودی‌های موجود در زمان‌بندی است؛


ساعتی را مشخص می‌کند که توسط زمان‌سنج داخلی qdisc برای اندازه‌گیری زمان و زمان‌بندی رویدادها استفاده می‌شود. این آرگومان هنگام استفاده از ویژگی برون‌سپاری کامل (flags 0x2 یا full-offload) باید حذف شود، زیرا در آن حالت، clockid به طور ضمنی dev/ptpN/ است (که در آن N توسط ethtool -T eth0 | grep 'PTP Hardware Clock' مشخص می‌شود)، و بنابراین لزوماً با CLOCK_TAI سیستم همگام نیست.

ممکن است چندین پارامتر sched-entry در یک زمان‌بندی واحد وجود داشته باشد. هر کدام از آن‌ها دارای قالب زیر هستند:
sched-entry <command> <gatemask> <interval>

مقدار <command> از مقادیر زیر پشتیبانی می‌کند:
S برای SetGateStates
H برای Set-And-Hold-MAC
R برای Set-And-Release-MAC
این دستورات از تعریف IEEE 802.1Q-2018 (جدول 8-7) پیروی می‌کنند.

مقدار <gate mask> یک ماسک بیت است که در آن هر بیت با یک کلاس ترافیک مرتبط است؛ بنابراین «روشن» بودن بیت ۰ (کم‌ارزش‌ترین بیت) به این معناست که کلاس ترافیک ۰ برای آن ورودی زمان‌بندی «فعال» است.

مقدار <interval> یک مدت زمان بر حسب نانوثانیه است که مشخص می‌کند وضعیت تعریف‌شده توسط <command> و <gate mask> پیش از رفتن به ورودی بعدی چه مدت باید حفظ شود.


این یک ماسک بیت است که حالت‌های مختلف را برای taprio مشخص می‌کند.
0x1
ویژگی txtime-assist را فعال می‌کند. در این حالت، taprio برچسب زمانی ارسال را بسته به بازه‌ای که بسته باید ارسال شود تنظیم می‌کند. سپس از انضباط صف etf(8) برای مرتب‌سازی و ارسال بسته‌ها در زمان مناسب استفاده می‌کند. مثال دوم می‌تواند به عنوان مرجعی برای پیکربندی این حالت استفاده شود.
0x2
ویژگی برون‌سپاری کامل (full-offload) را فعال می‌کند. در این حالت، taprio لیست کنترل درگاه را به کارت شبکه (NIC) ارسال می‌کند که آن را به صورت چرخه‌ای در سخت‌افزار اجرا خواهد کرد. هنگام استفاده از full-offload، نیازی به مشخص کردن آرگومان clockid نیست.

ویژگی‌های txtime-assist و full-offload مانعةالجمع هستند، یعنی تنظیم flags روی 0x3 نامعتبر است.


این پارامتر مختص حالت برون‌سپاری txtime است. حداکثر زمانی را مشخص می‌کند که ممکن است یک بسته برای رسیدن از qdisc به کارت شبکه نیاز داشته باشد. این مقدار باید همیشه بزرگ‌تر از دلتای مشخص‌شده در qdisc etf(8) باشد.

آرایه‌ای شامل حداکثر ۱۶ عنصر (یک عنصر به ازای هر کلاس ترافیک) را مشخص می‌کند که با جدول queueMaxSDU از استاندارد IEEE 802.1Q-2018 مطابقت دارد. هر عنصر آرایه نمایانگر حداکثر اندازه بار مفید (payload) لایه ۲ است که می‌تواند از آن کلاس ترافیک خارج شود. عناصری که پر نشده‌اند به طور پیش‌فرض ۰ هستند. مقدار ۰ به این معنی است که کلاس ترافیک می‌تواند بسته‌هایی تا حداکثر MTU درگاه ارسال کند.

انتخاب می‌کند که آیا کلاس‌های ترافیک به صورت فوری (express) هستند یا قابل‌پیش‌دستی (preemptible). برای جزئیات به tc-mqprio(8) مراجعه کنید.

مثال زیر نشان می‌دهد چگونه یک زمان‌بندی ترافیک با سه کلاس ترافیک ("num_tc 3") که به کلاس‌های ترافیک متفاوتی تفکیک شده‌اند کار می‌کند؛ ما این‌ها را TC 0، TC 1 و TC 2 می‌نامیم. می‌توان پارامتر "map" زیر را بدین صورت خواند: ترافیک با اولویت ۳ به عنوان TC 0، اولویت ۲ به عنوان TC 1 و بقیه به عنوان TC 2 دسته‌بندی می‌شوند.

زمان‌بندی در لحظه 1528743495910289987 با استفاده از مرجع CLOCK_TAI آغاز خواهد شد. زمان‌بندی از سه ورودی تشکیل شده که هر کدام ۳۰۰ میکروثانیه (300us) طول می‌کشند.

# tc qdisc replace dev eth0 parent root handle 100 stab overhead 24 taprio \
              num_tc 3 \
              map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
              queues 1@0 1@1 2@2 \
              base-time 1528743495910289987 \
              sched-entry S 01 300000 \
              sched-entry S 02 300000 \
              sched-entry S 04 300000 \
              clockid CLOCK_TAI

در ادامه مثالی برای فعال‌سازی حالت برون‌سپاری txtime در taprio آورده شده است. برای اطلاعات بیشتر درباره پیکربندی qdisc مربوط به ETF، به etf(8) مراجعه کنید.

# tc qdisc replace dev eth0 parent root handle 100 stab overhead 24 taprio \
              num_tc 3 \
              map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
              queues 1@0 1@0 1@0 \
              base-time 1528743495910289987 \
              sched-entry S 01 300000 \
              sched-entry S 02 300000 \
              sched-entry S 04 400000 \
              flags 0x1 \
              txtime-delay 200000 \
              clockid CLOCK_TAI
# tc qdisc replace dev $IFACE parent 100:1 etf skip_skb_check \
              offload delta 200000 clockid CLOCK_TAI

مثال زیر یک زمان‌بندی در حالت برون‌سپاری کامل (full offload) است. base-time برابر با ۲۰۰ نانوثانیه است و cycle-time به صورت ضمنی به عنوان مجموع مدت‌زمان‌های تمام sched-entry محاسبه می‌شود (یعنی 20 us + 20 us + 60 us = 100 us). اگرچه base-time در گذشته قرار دارد، سخت‌افزار اجرای زمان‌بندی را در یک زمان PTP آغاز می‌کند که برابر با کوچک‌ترین مضرب صحیح از ۱۰۰ میکروثانیه به علاوه ۲۰۰ نانوثانیه است که از زمان PTP فعلی کارت شبکه بزرگ‌تر باشد. علاوه بر این، MTU برای کلاس ترافیک ۵ به ۲۰۰ بایت (octet) محدود شده است، به طوری که تداخل ایجادشده روی کلاس ترافیک ۷ در طول پنجره زمانی که هر دو درگاه باز هستند محدود شود. این تداخل با زمان ارسال max SDU، به علاوه طول سرآیند L2، به علاوه سربار L1 (تعیین‌شده از جدول اندازه مشخص‌شده با استفاده از tc-stab(8)) مشخص می‌شود.

# tc qdisc add dev eth0 parent root stab overhead 24 taprio \
              num_tc 8 \
              map 0 1 2 3 4 5 6 7 \
              queues 1@0 1@1 1@2 1@3 1@4 1@5 1@6 1@7 \
              max-sdu 0 0 0 0 0 200 0 0 \
              base-time 200 \
              sched-entry S 80 20000 \
              sched-entry S a0 20000 \
              sched-entry S 5f 60000 \
              flags 0x2

tc-stab(8)

Vinicius Costa Gomes <vinicius.gomes@intel.com>

25 Sept 2018 iproute2