PRIO(8) Linux PRIO(8)

tc-prio - انضباط صف‌بندی اولویت‌دار (Priority qdisc)

tc qdisc ... dev dev ( parent classid | root) [ handle major: ] prio [ bands bands ] [ priomap band band band... ] [ estimator interval timeconstant ]

انضباط صف PRIO یک انضباط صف‌بندی کلاسی (classful) ساده است که شامل تعداد دلخواهی از کلاس‌ها با اولویت‌های متفاوت می‌شود. خروج بسته‌ها از صف این کلاس‌ها بر اساس ترتیب عددی نزولی اولویت صورت می‌گیرد. PRIO یک زمان‌بند (scheduler) است و هرگز بسته‌ها را با تاخیر مواجه نمی‌کند - این یک انضباط صف نگه‌دارنده کار (work-conserving) است، هرچند ممکن است انضباط‌های صف قرارگرفته درون کلاس‌های آن چنین نباشند.

این انضباط صف برای کاهش زمان تاخیر (latency) در شرایطی که نیازی به کاستن از سرعت ترافیک نیست، بسیار کاربردی است.

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

هنگام خروج از صف (dequeueing)، ابتدا باند ۰ بررسی می‌شود و تنها در صورتی که بسته‌ای برای تحویل نداشته باشد، PRIO به سراغ باند ۱ می‌رود و به همین ترتیب ادامه می‌دهد. بنابراین، بسته‌هایی با بیشترین قابلیت اطمینان باید به باند ۰، بسته‌های با کمترین تاخیر به باند ۱ و مابقی بسته‌ها به باند ۲ هدایت شوند.

از آنجا که خود انضباط صف PRIO دارای شماره فرعی (minor) صفر خواهد بود، باند ۰ در واقع major:1 و باند ۱ همان major:2 و به همین ترتیب خواهد بود. به جای major، باید شماره اصلی تخصیص‌یافته به انضباط صف در tc qdisc add را با پارامتر handle جایگزین کنید.

سه روش برای PRIO جهت تعیین این‌که یک بسته در کدام باند در صف قرار گیرد در دسترس است:

از فضای کاربر (From userspace)
فرآیندی با دسترسی‌های کافی می‌تواند کلاس مقصد را مستقیماً با استفاده از SO_PRIORITY مشخص کند؛ صفحه راهنمای socket(7) را ببینید.
با یک فیلتر tc (with a tc filter)
یک فیلتر tc متصل به انضباط صف ریشه می‌تواند ترافیک را مستقیماً به یک کلاس هدایت کند.
با نگاشت priomap (with the priomap)
بر اساس اولویت بسته، که خود از نوع سرویس (Type of Service یا TOS) تخصیص‌یافته به بسته استخراج می‌شود.

تنها گزینه priomap به این انضباط صف اختصاص دارد.

تعداد باندها. اگر از مقدار پیش‌فرض ۳ تغییر کند، priomap نیز باید به‌روزرسانی شود.
پارامتر priomap اولویت یک بسته را به یک کلاس نگاشت می‌کند. اولویت می‌تواند مستقیماً از فضای کاربر تنظیم شود یا از نوع سرویس (TOS) بسته مشتق گردد.

این پارامتر نحوه نگاشت اولویت‌های بسته (تخصیص‌یافته توسط هسته) به باندها را تعیین می‌کند. نگاشت بر مبنای بایت (octet) نوع سرویس یا همان TOS بسته انجام می‌گیرد که ساختار آن به این شکل است:

0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
|           |               |   |
|PRECEDENCE |      TOS      |MBZ|
|           |               |   |
+---+---+---+---+---+---+---+---+

چهار بیت TOS (که «فیلد TOS» نامیده می‌شوند) به صورت زیر تعریف می‌شوند:

Binary Decimal  Meaning
-----------------------------------------
1000   8         Minimize delay (md)
0100   4         Maximize throughput (mt)
0010   2         Maximize reliability (mr)
0001   1         Minimize monetary cost (mmc)
0000   0         Normal Service

از آنجا که ۱ بیت در سمت راست این چهار بیت قرار دارد، مقدار واقعی فیلد TOS دو برابر مقدار بیت‌های TOS است. خروجی tcpdump -v -v مقدار کل فیلد TOS را نشان می‌دهد، نه فقط چهار بیت آن را. این همان مقداری است که در ستون اول جدول زیر مشاهده می‌کنید:

TOS     Bits  Means                    Linux Priority    Band
------------------------------------------------------------
0x0     0     Normal Service           0 Best Effort     1
0x2     1     Minimize Monetary Cost   0 Best Effort     1
0x4     2     Maximize Reliability     0 Best Effort     1
0x6     3     mmc+mr                   0 Best Effort     1
0x8     4     Maximize Throughput      2 Bulk            2
0xa     5     mmc+mt                   2 Bulk            2
0xc     6     mr+mt                    2 Bulk            2
0xe     7     mmc+mr+mt                2 Bulk            2
0x10    8     Minimize Delay           6 Interactive     0
0x12    9     mmc+md                   6 Interactive     0
0x14    10    mr+md                    6 Interactive     0
0x16    11    mmc+mr+md                6 Interactive     0
0x18    12    mt+md                    4 Int. Bulk       1
0x1a    13    mmc+mt+md                4 Int. Bulk       1
0x1c    14    mr+mt+md                 4 Int. Bulk       1
0x1e    15    mmc+mr+mt+md             4 Int. Bulk       1

ستون دوم حاوی مقدار چهار بیت مربوطه در TOS است و به دنبال آن معنای ترجمه‌شده آن‌ها آمده است. به عنوان مثال، ۱۵ بیانگر بسته‌ای است که خواستار کمترین هزینه مالی (Minimal Monetary Cost)، بیشترین قابلیت اطمینان (Maximum Reliability)، بیشترین توان عملیاتی (Maximum Throughput) و کمترین تاخیر (Minimum Delay) است.

ستون چهارم نحوه تفسیر بیت‌های TOS توسط هسته لینوکس را فهرست کرده و نشان می‌دهد به کدام اولویت نگاشت می‌شوند.

ستون آخر نتیجه priomap پیش‌فرض را نشان می‌دهد. در خط فرمان، priomap پیش‌فرض به این صورت است:

1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

این بدان معناست که به عنوان مثال اولویت ۴ به باند شماره ۱ نگاشت می‌شود. همچنین priomap به شما امکان می‌دهد اولویت‌های بالاتر (بزرگ‌تر از ۷) را نیز مشخص کنید که مربوط به نگاشت‌های TOS نیستند، اما از راه‌های دیگری تنظیم شده‌اند.

این جدول برگرفته از RFC 1349 (برای جزئیات بیشتر آن را مطالعه کنید) توضیح می‌دهد که برنامه‌ها چگونه بیت‌های TOS خود را تنظیم می‌کنند:

TELNET                   1000           (minimize delay)
FTP
        Control          1000           (minimize delay)
        Data             0100           (maximize throughput)
TFTP                     1000           (minimize delay)
SMTP
        Command phase    1000           (minimize delay)
        DATA phase       0100           (maximize throughput)
Domain Name Service
        UDP Query        1000           (minimize delay)
        TCP Query        0000
        Zone Transfer    0100           (maximize throughput)
NNTP                     0001           (minimize monetary cost)
ICMP
        Errors           0000
        Requests         0000 (mostly)
        Responses        <same as request> (mostly)

کلاس‌های PRIO را نمی‌توان بیشتر پیکربندی کرد - آن‌ها هنگام اتصال انضباط صف PRIO به‌طور خودکار ایجاد می‌شوند. با این حال، هر کلاس می‌تواند خود شامل یک انضباط صف دیگر باشد.

حجم بالای ترافیک در باندهای با شماره پایین‌تر (دارای اولویت بالاتر مانند باند ۰) می‌تواند باعث گرسنگی (starvation) باندهای با شماره بالاتر شود. این مشکل را می‌توان با اتصال یک شکل‌دهنده ترافیک (به عنوان مثال tc-tbf(8)) به این باندها مهار کرد تا اطمینان حاصل شود که پیوند ارتباطی را به انحصار خود درنمی‌آورند.

Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, J Hadi Salim <hadi@cyberus.ca>. این صفحه راهنما توسط bert hubert <ahu@ds9a.nl> نگهداری می‌شود.

16 December 2001 iproute2