TC(8) Linux TC(8)

tc-sfq - صف‌بندی تصادفی منصفانه (Stochastic Fairness Queueing)

tc qdisc ... [ divisor hashtablesize ] [ limit packets ] [ perturb seconds ] [ quantum bytes ] [ flows number ] [ depth number ] [ headdrop ] [ redflowlimit bytes ] [ min bytes ] [ max bytes ] [ avpkt bytes ] [ burst packets ] [ probability P ] [ ecn ] [ harddrop ]

صف‌بندی تصادفی منصفانه (Stochastic Fairness Queueing یا SFQ) یک انضباط صف‌بندی (qdisc) بدون کلاس است که برای کنترل ترافیک با دستور tc(8) در دسترس است.

انضباط SFQ ترافیک را شکل‌دهی نمی‌کند، بلکه تنها بر مبنای «جریان‌ها» (flows) زمان‌بندی ارسال بسته‌ها را مدیریت می‌کند. هدف تضمین انصاف و عدالت است به گونه‌ای که هر جریان بتواند به نوبت داده ارسال کند و در نتیجه از غرق شدن سایر جریان‌ها توسط یک جریان منفرد جلوگیری شود.

این ویژگی در واقع می‌تواند در تخفیف اثر تلاش‌های مربوط به حمله محروم‌سازی از سرویس (DoS) مؤثر باشد.

انضباط SFQ از نوع حافظ کار (work-conserving) است و بنابراین در صورتی که بسته‌ای در دسترس داشته باشد، همیشه آن را تحویل می‌دهد.

هنگام ورود به صف (enqueueing)، هر بسته بر اساس مقدار درهم‌سازی (هش) خود به یک سطل درهم‌سازی (hash bucket) اختصاص می‌یابد. این مقدار هش یا از یک دسته‌بندی‌کننده خارجی جریان به دست می‌آید (از tc filter برای تنظیم آن‌ها استفاده کنید)، یا در صورت پیکربندی نشدن دسته‌بندی‌کننده خارجی، از یک دسته‌بندی‌کننده پیش‌فرض داخلی به دست می‌آید.

هنگامی که دسته‌بندی‌کننده داخلی استفاده می‌شود، sfq از موارد زیر استفاده می‌کند:

(i)
نشانی مبدأ
(ii)
نشانی مقصد
(iii)
درگاه مبدأ و مقصد

در صورتی که این اطلاعات در دسترس باشند. SFQ از ipv4 و ipv6 و همچنین UDP، TCP و ESP پشتیبانی می‌کند. بسته‌های مربوط به سایر پروتکل‌ها بر اساس نمایش ۳۲ بیتی مبدأ و مقصدشان درهم‌سازی می‌شوند. یک جریان غالباً متناظر با یک اتصال TCP/IP است.

هر یک از این سطل‌ها باید نشان‌دهنده یک جریان یکتا باشند. از آنجا که ممکن است چندین جریان در یک سطل یکسان درهم‌سازی شوند، الگوریتم درهم‌سازی داخلی sfq می‌تواند در فواصل زمانی قابل‌تنظیم دچار آشفتگی (perturbation) شود تا بی‌عدالتی فقط برای مدتی کوتاه ادامه یابد. با این حال، آشفتگی ممکن است باعث جابه‌جایی ناخواسته ترتیب بسته‌ها شود. پس از linux-3.3، مشکل جابه‌جایی ترتیب بسته‌ها وجود ندارد، اما در صورت رسیدن درهم‌سازی مجدد به یک حد مشخص (تعداد جریان‌ها یا بسته‌ها در هر جریان)، امکان افت بسته وجود دارد.

هنگام خروج از صف (dequeuing)، از هر سطل درهم‌سازی حاوی داده به صورت نوبت‌گردشی (round robin) پرس‌وجو می‌شود.

پیش از linux-3.3، حداکثر طول زمان کامپایل SFQ برابر ۱۲۸ بسته بود که می‌توانست حداکثر در ۱۲۸ سطل از میان ۱۰۲۴ سطل موجود پخش شود. در صورت سرریز، انداختن از انتهای صف (tail-drop) روی پرترین سطل انجام می‌شد و به این ترتیب انصاف حفظ می‌گردید.

پس از linux-3.3، حداکثر طول SFQ برابر ۶۵۵۳۵ بسته و حد مقسوم‌علیه (divisor) برابر ۶۵۵۳۶ است. در صورت سرریز، انداختن از انتهای صف (tail-drop) روی پرترین سطل اعمال می‌شود، مگر اینکه headdrop درخواست شده باشد.

می‌تواند برای تنظیم اندازه متفاوتی از جدول درهم‌سازی استفاده شود؛ از هسته 2.6.39 به بعد در دسترس است. مقسوم‌علیه مشخص‌شده باید توانی از دو باشد و نمی‌تواند بزرگتر از ۶۵۵۳۶ باشد. مقدار پیش‌فرض: ۱۰۲۴.
حد بالای SFQ. می‌تواند برای کاهش طول پیش‌فرض ۱۲۷ بسته استفاده شود. پس از linux-3.3، می‌توان این مقدار را افزایش داد.
حد بسته‌ها در هر جریان (پس از linux-3.3). پیش‌فرض آن ۱۲۷ است و می‌توان آن را کاهش داد.
بازه زمانی به ثانیه برای آشفتگی (تغییر جایگشت دوره‌ای) الگوریتم صف. پیش‌فرض 0 است، به این معنی که هیچ آشفتگی رخ نمی‌دهد. آن را بیش از حد کم تنظیم نکنید، زیرا هر آشفتگی ممکن است باعث به‌هم‌ریختگی ترتیب یا افت بسته‌ها شود. مقدار توصیه‌شده: 60. این مقدار هنگام استفاده از دسته‌بندی خارجی جریان هیچ تأثیری ندارد. بهتر است مقدار divisor را برای کاهش خطر برخورد هش افزایش دهید.
میزان بایتی که یک جریان مجاز است در طول یک دور از فرآیند نوبت‌گردشی از صف خارج کند. مقدار پیش‌فرض برابر MTU رابط شبکه است که مقدار توصیه‌شده و همچنین حداقل مقدار مجاز نیز می‌باشد.
پس از linux-3.3، امکان تغییر حد پیش‌فرض جریان‌ها وجود دارد. مقدار پیش‌فرض ۱۲۷ است.
رفتار پیش‌فرض SFQ حذف بسته‌ها از انتهای یک جریان (tail-drop) است. می‌توانید در عوض headdrop (حذف از ابتدا) را درخواست کنید، زیرا این کار بازخورد بهتری برای جریان‌های TCP فراهم می‌کند.
ماژول اختیاری RED را بر روی هر جریان SFQ پیکربندی می‌کند. اصل تشخیص زودهنگام تصادفی (Random Early Detection) بر علامت‌گذاری یا انداختن بسته‌ها به صورت احتمالاتی استوار است. (برای جزئیات درباره RED، به tc-red(8) مراجعه کنید).
گزینه redflowlimit حد سخت اندازه واقعی (نه میانگین) صف را به ازای هر جریان SFQ بر حسب بایت پیکربندی می‌کند.
اندازه میانگین صف که در آن علامت‌گذاری به یک احتمال تبدیل می‌شود. پیش‌فرض برابر با max /3 است.
در این اندازه میانگین صف، احتمال علامت‌گذاری حداکثر است. پیش‌فرض برابر با redflowlimit /4 است.
حداکثر احتمال برای علامت‌گذاری، که به صورت یک عدد اعشاری از 0.0 تا 1.0 مشخص می‌شود. مقدار پیش‌فرض 0.02 است.
بر حسب بایت مشخص می‌شود. همراه با burst برای تعیین ثابت زمانی در محاسبات اندازه میانگین صف استفاده می‌شود. مقدار پیش‌فرض 1000 است.
برای تعیین سرعت تأثیرپذیری اندازه میانگین صف از اندازه واقعی صف استفاده می‌شود.
مقدار پیش‌فرض برابر است با:
(2 * min + max) / (3 * avpkt)
الگوریتم RED می‌تواند بسته‌ها را «علامت‌گذاری» (mark) یا «حذف» (drop) کند. اعلان صریح ازدحام (Explicit Congestion Notification یا ECN) به RED اجازه می‌دهد به میزبان‌های راه دور اطلاع دهد که نرخ ارسال آن‌ها از پهنای باند موجود فراتر رفته است. به میزبان‌های فاقد پشتیبانی از ECN تنها می‌توان از طریق انداختن بسته اطلاع داد. اگر این پارامتر مشخص شود، بسته‌هایی که نشان می‌دهند میزبان آن‌ها از ECN پشتیبانی می‌کند، تنها علامت‌گذاری می‌شوند و حذف نخواهند شد، مگر اینکه اندازه صف به depth بسته برسد.
اگر میانگین اندازه صف جریان بالاتر از max بایت باشد، این پارامتر به جای علامت‌گذاری ecn، حذف بسته (drop) را تحمیل می‌کند.

برای اتصال به دستگاه ppp0:

# tc qdisc add dev ppp0 root sfq

لطفاً توجه داشته باشید که SFQ، مانند تمامی qdiscهای بدون شکل‌دهی (حافظ کار یا work-conserving)، تنها در صورتی سودمند است که مالک صف باشد. این حالت زمانی است که سرعت پیوند با پهنای باند واقعاً موجود برابر باشد؛ این امر در مورد مودم‌های تلفنی معمولی، اتصالات ISDN و پیوندهای اترنت مستقیم و بدون سوییچ برقرار است.

در بیشتر موارد، مودم‌های کابلی و دستگاه‌های DSL در این دسته قرار نمی‌گیرند. همین موضوع در هنگام اتصال به یک سوییچ و تلاش برای ارسال داده به یک بخش دچار ازدحام که آن هم به سوییچ متصل است صدق می‌کند.

در این حالت، صف مؤثر در لینوکس قرار ندارد و بنابراین برای زمان‌بندی در دسترس نیست.

انضباط SFQ را در یک qdisc دارای کلاس جاسازی کنید تا اطمینان حاصل شود که مالک صف است.

امکان استفاده از دسته‌بندی‌کننده‌های خارجی با sfq وجود دارد؛ به عنوان مثال برای درهم‌سازی ترافیک تنها بر اساس نشانی‌های IP مبدأ/مقصد:

# tc filter add ... flow hash keys src,dst perturb 30 divisor 1024

توجه داشته باشید که divisor ارائه‌شده باید با مقسوم‌علیه استفاده‌شده توسط sfq مطابقت داشته باشد. اگر مقدار پیش‌فرض ۱۰۲۴ در sfq را تغییر داده‌اید، از همان مقدار برای فیلتر flow hash نیز استفاده کنید.

نمونه‌ای از sfq همراه با حالت اختیاری RED:

# tc qdisc add dev eth0 parent 1:1 handle 10: sfq limit 3000 flows 512 divisor 16384
redflowlimit 100000 min 8000 max 60000 probability 0.20 ecn headdrop

Paul E. McKenney "Stochastic Fairness Queuing", IEEE INFOCOMM'90 Proceedings, San Francisco, 1990.
Paul E. McKenney "Stochastic Fairness Queuing", "Interworking: Research and Experience", v.2, 1991, p.113-131.
همچنین ببینید: M. Shreedhar and George Varghese "Efficient Fair Queuing using Deficit Round Robin", Proc. SIGCOMM 95.

tc(8), tc-red(8)

Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, Eric Dumazet <eric.dumazet@gmail.com>.

این صفحه راهنما توسط bert hubert <ahu@ds9a.nl> نگهداری می‌شود.

24 January 2012 iproute2