MQPRIO(8) Linux MQPRIO(8)

tc-mqprio - انضباط صف‌بندی اولویت چندصفی (QOS سخت‌افزاری برون‌سپاری‌شده)

tc qdisc ... dev dev ( parent classid | root) [ handle major: ] mqprio [ num_tc tcs ] [ map P0 P1 P2... ] [ queues count1@offset1 count2@offset2 ... ] [ hw 1|0 ] [ mode dcb|channel ] [ shaper dcb|bw_rlimit ] [ min_rate min_rate1 min_rate2 ... ] [ max_rate max_rate1 max_rate2 ... ] [ fp FP0 FP1 FP2 ... ]

انضباط صف MQPRIO یک انضباط صف‌بندی ساده است که امکان نگاشت جریان‌های ترافیک به محدوده‌های صف سخت‌افزاری را با استفاده از اولویت‌ها و یک نگاشت پیکربندی‌پذیر از اولویت به کلاس ترافیک فراهم می‌کند. یک کلاس ترافیک در این زمینه، مجموعه‌ای از کلاس‌های پیوسته qdisc است که به صورت یک‌به‌یک (1:1) به مجموعه‌ای از صف‌های ارائه‌شده توسط سخت‌افزار نگاشت می‌شوند.

به‌طور پیش‌فرض، این qdisc یک انضباط صف pfifo (صف خروج به ترتیب ورود با محدودیت بسته) را به ازای هر صف ارسال (TX) ارائه‌شده توسط دستگاه لایه پایین‌تر تخصیص می‌دهد. انضباط‌های صف‌بندی دیگر را می‌توان متعاقباً اضافه کرد. بسته‌ها با استفاده از پارامتر map در صف قرار می‌گیرند و در سراسر صف‌های مشخص‌شده در offset و count هش می‌شوند. به‌طور پیش‌فرض این پارامترها توسط درایور سخت‌افزار به گونه‌ای پیکربندی می‌شوند که با ساختارهای کیفیت سرویس (QOS) سخت‌افزار مطابقت داشته باشند.

حالت Channel از برون‌سپاری کامل (Full Offload) گزینه‌های mqprio، کلاس‌های ترافیک، پیکربندی‌های صف و ویژگی‌های کیفیت سرویس (QOS) به سخت‌افزار پشتیبانی می‌کند. سخت‌افزار فعال‌شده می‌تواند کیفیت سرویس سخت‌افزاری را همراه با توانایی هدایت جریان‌های ترافیکی به کلاس‌های ترافیکی تعیین‌شده ارائه‌شده توسط این qdisc فراهم کند. کیفیت سرویس مبتنی بر سخت‌افزار با استفاده از پارامتر shaper پیکربندی می‌شود. bw_rlimit با حداقل و حداکثر نرخ‌های پهنای باند می‌تواند برای تنظیم نرخ‌های ارسال روی هر کلاس ترافیک استفاده شود. همچنین می‌توان qdiscهای بیشتری را به کلاس‌های MQPRIO افزود تا پیکربندی‌های پیچیده‌تری ایجاد شود.

هنگام ایجاد با 'tc qdisc add'، هشت کلاس ترافیک ایجاد می‌شوند که اولویت‌های ۰ تا ۷ را به کلاس‌های ترافیک ۰ تا ۷ و اولویت‌های بیشتر از ۷ را به کلاس ترافیک ۰ نگاشت می‌کنند. این امر نیازمند پشتیبانی درایور پایه است و ایجاد آن بر روی دستگاه‌هایی که از طرح‌های کیفیت سرویس (QOS) سخت‌افزاری پشتیبانی نمی‌کنند، ناموفق خواهد بود.

این مقادیر پیش‌فرض را می‌توان با استفاده از پارامترهای qdisc بازنویسی کرد. ارائه فلگ 'hw 0' امکان اجرای نرم‌افزار را بدون هماهنگی سخت‌افزاری فراهم می‌کند.

اگر از هماهنگی سخت‌افزاری استفاده شود و آرگومان‌هایی ارائه شوند که سخت‌افزار قادر به پشتیبانی از آن‌ها نباشد، یک خطا برگردانده می‌شود. برای بسیاری از کاربران، مقادیر پیش‌فرض سخت‌افزار باید به اندازه کافی خوب کار کنند.

به عنوان یک مثال مشخص، کارت‌های شبکه اترنت متعددی از الگوریتم انتخاب ارسال اولویت اکید پیوند (TSA) استاندارد 802.1Q پشتیبانی می‌کنند. سخت‌افزار دارای قابلیت MQPRIO در هماهنگی با روش‌های دسته‌بندی زیر می‌تواند پشتیبانی برون‌سپاری‌شده سخت‌افزاری را برای این TSA فراهم کند.

روش‌های متعددی برای تنظیم اولویت SKB وجود دارد که MQPRIO از آن برای انتخاب این‌که بسته در کدام کلاس ترافیکی صف‌بندی شود استفاده می‌کند.

از فضای کاربری
یک فرآیند با دسترسی‌های کافی می‌تواند کلاس مقصد را مستقیماً با SO_PRIORITY کدگذاری کند؛ ببینید: socket(7).
با iptables/nftables
می‌توان یک قانون iptables/nftables را برای تطبیق جریان‌های ترافیک و تنظیم اولویت ایجاد کرد: iptables(8).
با گروه‌های کنترلی net_prio
می‌توان از net_prio cgroup برای تنظیم اولویت تمام سوکت‌های متعلق به یک برنامه کاربردی استفاده کرد. برای جزئیات به مستندات هسته و cgroup مراجعه کنید.

تعداد کلاس‌های ترافیک مورد استفاده. تا ۱۶ کلاس پشتیبانی می‌شود. شما نمی‌توانید کلاس‌های بیشتری نسبت به صف‌ها داشته باشید.
نگاشت اولویت به کلاس ترافیک. اولویت‌های ۰ تا ۱۵ را به یک کلاس ترافیک مشخص نگاشت می‌کند.
تعداد و آفست محدوده صف را برای هر کلاس ترافیک در قالب count@offset مشخص می‌کند. محدوده‌های صف برای هر کلاس ترافیک نمی‌توانند همپوشانی داشته باشند و باید یک محدوده پیوسته از صف‌ها باشند.
برای پشتیبانی از برون‌سپاری سخت‌افزاری روی 1 تنظیم کنید. برای پیکربندی مقادیر تعیین‌شده توسط کاربر تنها در نرم‌افزار، روی 0 تنظیم کنید. مقدار پیش‌فرض این پارامتر 1 است.
برای استفاده کامل از گزینه‌های mqprio روی channel تنظیم کنید. برای برون‌سپاری تنها مقادیر TC و استفاده از پیش‌فرض‌های کیفیت سرویس سخت‌افزاری، از dcb استفاده کنید. تنها در صورتی که 'hw' روی ۱ تنظیم شده باشد پشتیبانی می‌شود.
از bw_rlimit برای تعیین محدودیت‌های نرخ پهنای باند برای یک کلاس ترافیک استفاده کنید. از dcb برای پیش‌فرض‌های کیفیت سرویس سخت‌افزاری استفاده کنید. تنها در صورتی که 'hw' روی ۱ تنظیم شده باشد پشتیبانی می‌شود.
حداقل مقدار محدودیت نرخ پهنای باند برای یک کلاس ترافیک. تنها زمانی پشتیبانی می‌شود که آرگومان 'shaper' روی 'bw_rlimit' تنظیم شده باشد.
حداکثر مقدار محدودیت نرخ پهنای باند برای یک کلاس ترافیک. تنها زمانی پشتیبانی می‌شود که آرگومان 'shaper' روی 'bw_rlimit' تنظیم شده باشد.
مشخص می‌کند که آیا کلاس‌های ترافیک به صورت سریع (express - تحویل بسته‌ها از طریق eMAC) هستند یا اولویت‌پذیر/پیش‌دستانه (preemptible - تحویل بسته‌ها از طریق pMAC)، مطابق با استاندارد IEEE 802.1Q-2018 بند 6.7.2 (پیش‌دستی فریم). به شکل یک آرایه (یک عنصر به ازای هر کلاس ترافیک) با مقادیر 'E' (برای سریع) یا 'P' (برای پیش‌دستانه) است.

چندین اولویت که به یک کلاس ترافیک یکسان نگاشت می‌شوند، و همچنین چندین TXQ که به یک کلاس ترافیک یکسان نگاشت می‌شوند، باید دارای ویژگی‌های FP یکسانی باشند. برای تفسیر FP به عنوان یک ویژگی به ازای هر اولویت، می‌توان از آرگومان 'map' برای تبدیل استفاده کرد. برای تفسیر FP به عنوان یک ویژگی به ازای هر TXQ، می‌توان از آرگومان 'queues' برای تبدیل استفاده کرد.

کلاس‌های ترافیک به‌طور پیش‌فرض سریع (express) هستند. این آرگومان فقط با تنظیم 'hw' روی ۱ پشتیبانی می‌شود. کلاس‌های ترافیک پیش‌دستانه تنها در صورتی پذیرفته می‌شوند که دستگاه دارای لایه MAC Merge با قابلیت پیکربندی از طریق ethtool(8) باشد.

ethtool(8), tc(8)

مثال زیر نشان می‌دهد چگونه اولویت‌ها را به ۴ کلاس ترافیک ("num_tc 4") متصل کنید و سپس چگونه این کلاس‌های ترافیک را با ۴ صف سخت‌افزاری توسط mqprio و با هماهنگی سخت‌افزاری جفت کنید ("hw 1"، یا ذکر نشود، زیرا ۱ مقدار پیش‌فرض است). کلاس ترافیک ۰ (tc0) به صف سخت‌افزاری ۰ (q0)، کلاس tc1 به q1، کلاس tc2 به q2، و tc3 به q3 نگاشت می‌شود.

# tc qdisc add dev eth0 root mqprio \
              num_tc 4 \
              map 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 \
              queues 1@0 1@1 1@2 1@3 \
              hw 1

مثال بعدی نشان می‌دهد چگونه اولویت‌ها را به ۳ کلاس ترافیک ("num_tc 3") متصل کنید و چگونه این کلاس‌های ترافیک را با ۴ صف بدون هماهنگی سخت‌افزاری ("hw 0") جفت کنید. کلاس ترافیک ۰ (tc0) به صف سخت‌افزاری ۰ (q0)، کلاس tc1 به q1، و tc2 به q2 و q3 نگاشت می‌شود، که انتخاب صف بین این دو صف تا حدی به شکل تصادفی تعیین می‌شود.

# tc qdisc add dev eth0 root mqprio \
              num_tc 3 \
              map 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 \
              queues 1@0 1@1 2@2 \
              hw 0

در هر دو مورد بالا، مقادیر اولویت از ۰ تا ۳ (prio0-3) به tc0، مقادیر prio4-7 به tc1، و prio8-11 به tc2 نگاشت شده‌اند (ویژگی "map"). چهار مقدار اولویت آخر (prio12-15) در این دو مثال به روش‌های متفاوتی نگاشت شده‌اند. آن‌ها در مثال اول به tc3 و در مثال دوم به tc2 نگاشت شده‌اند. مقادیر این دو مثال به شرح زیر است:

┌────┬────┬───────┐  ┌────┬────┬────────┐
│Prio│ tc │ queue │  │Prio│ tc │  queue │
├────┼────┼───────┤  ├────┼────┼────────┤
│  0 │  0 │     0 │  │  0 │  0 │      0 │
│  1 │  0 │     0 │  │  1 │  0 │      0 │
│  2 │  0 │     0 │  │  2 │  0 │      0 │
│  3 │  0 │     0 │  │  3 │  0 │      0 │
│  4 │  1 │     1 │  │  4 │  1 │      1 │
│  5 │  1 │     1 │  │  5 │  1 │      1 │
│  6 │  1 │     1 │  │  6 │  1 │      1 │
│  7 │  1 │     1 │  │  7 │  1 │      1 │
│  8 │  2 │     2 │  │  8 │  2 │ 2 or 3 │
│  9 │  2 │     2 │  │  9 │  2 │ 2 or 3 │
│ 10 │  2 │     2 │  │ 10 │  2 │ 2 or 3 │
│ 11 │  2 │     2 │  │ 11 │  2 │ 2 or 3 │
│ 12 │  3 │     3 │  │ 12 │  2 │ 2 or 3 │
│ 13 │  3 │     3 │  │ 13 │  2 │ 2 or 3 │
│ 14 │  3 │     3 │  │ 14 │  2 │ 2 or 3 │
│ 15 │  3 │     3 │  │ 15 │  2 │ 2 or 3 │
└────┴────┴───────┘  └────┴────┴────────┘
      example1             example2

مثال دیگری از نگاشت صف به شرح زیر است. در این‌جا ۵ کلاس ترافیک و ۸ صف سخت‌افزاری وجود دارد:

# tc qdisc add dev eth0 root mqprio \
              num_tc 5 \
              map 0 0 0 1 1 1 1 2 2 3 3 4 4 4 4 4 \
              queues 1@0 2@1 1@3 1@4 3@5

نگاشت مقادیر برای این مثال به صورت زیر است:

       ┌───────┐
tc0────┤Queue 0│◄────1@0
       ├───────┤
     ┌─┤Queue 1│◄────2@1
tc1──┤ ├───────┤
     └─┤Queue 2│
       ├───────┤
tc2────┤Queue 3│◄────1@3
       ├───────┤
tc3────┤Queue 4│◄────1@4
       ├───────┤
     ┌─┤Queue 5│◄────3@5
     │ ├───────┤
tc4──┼─┤Queue 6│
     │ ├───────┤
     └─┤Queue 7│
       └───────┘

John Fastabend, <john.r.fastabend@intel.com>

24 Sept 2013 iproute2