TC(8) Linux TC(8)

tc-tbf - فیلتر سطل ژتون (Token Bucket Filter) در کنترل ترافیک

tbf - فیلتر سطل ژتون

tc qdisc ... tbf rate rate burst bytes/cell ( latency ms | limit bytes ) [ mpu bytes [ peakrate rate mtu bytes/cell ] ]

پارامتر burst با نام‌های buffer و maxburst نیز شناخته می‌شود. پارامتر mtu نیز با نام minburst شناخته می‌شود.

فیلتر سطل ژتون (Token Bucket Filter یا TBF) یک انضباط صف باکلاس (classful queueing discipline) است که برای کنترل ترافیک با دستور tc(8) به کار می‌رود.

صف TBF یک شکل‌دهنده خالص (pure shaper) است و هرگز ترافیک را زمان‌بندی نمی‌کند. این الگوریتم غیرصرفه‌جو در کار (non-work-conserving) است و حتی اگر بسته‌هایی آماده ارسال باشند، ممکن است خود را مهار (throttle) کند تا اطمینان یابد نرخ ترافیک از حد تعیین‌شده تجاوز نمی‌کند. این صف قادر است ترافیک عادی را تا سقف ۱ مگابیت بر ثانیه با حداقل نوسان جهشی ایده‌آل (minimal burstiness) شکل‌دهی کند و داده‌ها را دقیقاً با نرخ پیکربندی‌شده ارسال نماید.

دستیابی به نرخ‌های بسیار بالاتر نیز امکان‌پذیر است اما به قیمت از دست رفتن حداقل نوسان جهشی تمام می‌شود. در این حالت، خروج داده‌ها از صف به‌طور میانگین با نرخ پیکربندی‌شده انجام می‌شود، اما ممکن است در مقیاس‌های زمانی میلی‌ثانیه‌ای داده‌ها بسیار سریع‌تر ارسال شوند. به دلیل وجود صف‌های بیشتر در کارت‌های شبکه، این مسئله اغلب مشکلی ایجاد نمی‌کند.

همان‌طور که از نام آن برمی‌آید، ترافیک بر اساس مصرف ژتون‌ها (tokens) فیلتر می‌شود. ژتون‌ها تقریباً متناظر با بایت‌ها هستند، با این قید اضافی که هر بسته، صرف‌نظر از این‌که چقدر کوچک باشد، تعدادی ژتون مصرف می‌کند. این موضوع نشان‌دهنده آن است که حتی یک بسته با اندازه صفر نیز خط ارتباطی را برای مدتی اشغال می‌کند.

در زمان ایجاد، TBF با ژتون‌هایی پر می‌شود که معادل حجم ترافیکی است که می‌تواند در یک لحظه به‌صورت جهشی (burst) ارسال گردد. ژتون‌ها با نرخی یکنواخت وارد می‌شوند تا زمانی که سطل پر شود.

اگر ژتونی در دسترس نباشد، بسته‌ها تا سقف محدودیت تعیین‌شده در صف قرار می‌گیرند. در این هنگام، TBF کسری ژتون را محاسبه کرده و جریان را تا زمانی که امکان ارسال اولین بسته موجود در صف فراهم شود، مهار می‌کند.

اگر خروج بسته‌ها با حداکثر سرعت به‌صورت جهشی قابل قبول نباشد، می‌توان یک نرخ اوج (peakrate) را پیکربندی کرد تا سرعت خالی شدن سطل محدود گردد. این نرخ اوج به‌صورت یک TBF دوم با سطلی بسیار کوچک پیاده‌سازی شده است تا از ارسال جهشی جلوگیری کند.

برای دستیابی به دقت کامل، سطل دوم ممکن است تنها حاوی یک بسته باشد که این امر به همان محدودیت ۱ مگابیت بر ثانیه منتهی می‌شود که پیش‌تر ذکر شد.

این محدودیت از آنجا ناشی می‌شود که هسته لینوکس حداقل می‌تواند به مدت ۱ تیک ساعت یا «jiffy» عملیات مهار را انجام دهد که به متغیر HZ به‌صورت 1/HZ وابسته است. برای شکل‌دهی بی‌نقص، در هر jiffy تنها یک بسته می‌تواند ارسال شود؛ به عنوان مثال برای HZ=100، این به معنای ۱۰۰ بسته با میانگین اندازه ۱۰۰۰ بایت است که تقریباً معادل ۱ مگابیت بر ثانیه خواهد بود.

برای آگاهی از نحوه تعیین واحدهای این مقادیر، به tc(8) مراجعه کنید.

پارامتر limit تعداد بایت‌هایی است که می‌توانند در صف منتظر در دسترس قرار گرفتن ژتون‌ها بمانند. همچنین می‌توانید این مقدار را با تنظیم پارامتر latency به شیوه عکس تعیین کنید که حداکثر مدت‌زمانی را که یک بسته می‌تواند در TBF معطل بماند مشخص می‌کند. محاسبه دومی اندازه سطل، نرخ (rate) و در صورت تنظیم، نرخ اوج (peakrate) را در نظر می‌گیرد. این دو پارامتر مانعة‌الجمع هستند.
با نام‌های buffer یا maxburst نیز شناخته می‌شود. اندازه سطل بر حسب بایت. این مقدار حداکثر بایت‌هایی است که ژتون‌های آن‌ها می‌تواند به‌طور آنی در دسترس قرار گیرد. به‌طور کلی، نرخ‌های شکل‌دهی بزرگ‌تر نیازمند بافر بزرگ‌تری هستند. برای نرخ ۱۰ مگابیت بر ثانیه بر روی اینتل، اگر می‌خواهید به نرخ پیکربندی‌شده خود برسید حداقل به یک بافر ۱۰ کیلوبایتی نیاز دارید!
اگر بافر شما بسیار کوچک باشد، ممکن است بسته‌ها دور ریخته شوند؛ زیرا ژتون‌هایی که در هر تیک تایمر وارد می‌شوند بیشتر از گنجایش سطل خواهد بود. حداقل اندازه بافر را می‌توان از تقسیم rate بر HZ به دست آورد.
محاسبات مصرف ژتون با استفاده از جدولی با دقت تفکیک پیش‌فرض ۸ بسته انجام می‌شود. این دقت را می‌توان با تعیین اندازه cell همراه با burst تغییر داد. به عنوان مثال، برای تعیین یک بافر ۶۰۰۰ بایتی با اندازه سلول ۱۶ بایت، مقدار burst را به‌صورت 6000/16 مشخص کنید. احتمالاً هرگز نیازی به تنظیم این مورد نخواهید داشت. مقدار آن باید یک توان صحیح از ۲ باشد.
یک بسته با اندازه صفر، پهنای باند صفر مصرف نمی‌کند. در شبکه اترنت، هیچ بسته‌ای کمتر از ۶۴ بایت استفاده نمی‌کند. «حداقل واحد بسته» (Minimum Packet Unit) حداقل ژتون مصرفی (بر حسب بایت) را برای هر بسته تعیین می‌کند. مقدار پیش‌فرض آن صفر است.
پیچ تنظیم سرعت. به توضیحات بالا در مورد محدودیت‌ها دقت کنید! برای واحدها به tc(8) مراجعه نمایید.

علاوه بر این، اگر تعیین نرخ اوج (peakrate) مد نظر باشد، پارامترهای زیر در دسترس هستند:

حداکثر نرخ خالی شدن سطل. تنظیم نرخ اوج الزامی نیست و تنها زمانی که شکل‌دهی در مقیاس زمانی میلی‌ثانیه با دقت بی‌نقص مورد نیاز باشد لازم خواهد بود.
اندازه سطل نرخ اوج را مشخص می‌کند. برای دقت کامل، باید برابر با مقدار MTU رابط شبکه تنظیم شود. اگر نرخ اوج نیاز باشد اما مقداری جهش نیز قابل قبول باشد، می‌توان این اندازه را افزایش داد. مقدار minburst برابر با ۳۰۰۰ بایت، با فرض بسته‌های ۱۰۰۰ بایتی، نرخ اوج تقریبی ۳ مگابیت بر ثانیه را فراهم می‌کند.
مشابه اندازه بافر جهش معمولی، در اینجا نیز می‌توانید اندازه یک cell را مشخص کنید.

برای اتصال یک TBF با حداکثر نرخ پایدار 0.5mbit/s، نرخ اوج 1.0mbit/s، یک بافر ۵ کیلوبایتی، و محدودیت صفِ پیش‌سطل محاسبه‌شده به‌گونه‌ای که TBF حداکثر ۷۰ میلی‌ثانیه تأخیر ایجاد کند و رفتار نرخ اوج دقیق داشته باشد، دستور زیر را اجرا کنید:

# tc qdisc add dev eth0 handle 10: root tbf rate 0.5mbit \
  burst 5kb latency 70ms peakrate 1mbit       \
  minburst 1540

برای اتصال یک qdisc درونی، مانند sfq، دستور زیر را اجرا کنید:

# tc qdisc add dev eth0 parent 10:1 handle 100: sfq

بدون qdisc درونی، صف TBF مانند bfifo عمل می‌کند. در صورت تغییر qdisc درونی، پارامترهای limit/latency دیگر مؤثر نخواهند بود.

tc(8)

Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>

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

13 December 2001 iproute2