ETF(8) Linux ETF(8)

tc-etf - انضباط صف نخستین زمان ارسال مقدم (ETF)

tc qdisc ... dev dev parent classid [ handle major: ] etf clockid clockid [ delta delta_nsecs ] [ deadline_mode ] [ offload ]

انضباط صف ETF (مخفف Earliest TxTime First یا نخستین زمان ارسال مقدم) به برنامه‌ها اجازه می‌دهد تا لحظه‌ای که یک بسته باید از لایه کنترل ترافیک خارج شده و وارد دستگاه شبکه (netdevice) شود را کنترل کنند. اگر offload پیکربندی شده و توسط کارت رابط شبکه پشتیبانی شود، همچنین زمان خروج بسته‌ها از کنترل‌کننده شبکه را نیز مدیریت خواهد کرد.

انضباط صف ETF این کار را با بافر کردن بسته‌ها تا یک زمان قابل‌پیکربندی پیش از زمان ارسال آن‌ها (یعنی txtime یا ضرب‌الاجل) انجام می‌دهد، که این زمان از طریق گزینه delta قابل‌تنظیم است.

این انضباط صف در ساختار داخلی خود از یک درخت سرخ-سیاه (rb-tree) استفاده می‌کند تا بسته‌ها همیشه بر اساس txtime خود مرتب شده باشند و به ترتیب نخستین زمان ارسال (زودترین txtime) از صف خارج شوند.

این ابزار به گزینه سوکت SO_TXTIME و پیام کنترلی SCM_TXTIME CMSG در فیلد هر بسته متکی است تا رفتار سوکت‌های وابسته به زمان را پیکربندی کند: شناسه ساعت (clockid) که به عنوان مرجع استفاده می‌شود، اینکه آیا حالت مورد انتظار txtime برای آن سوکت حالت ضرب‌الاجل (deadline) است یا حالت اکید (strict)، و اینکه آیا بسته‌های دور انداخته‌شده باید در صف خطای سوکت گزارش شوند یا خیر. برای اطلاعات بیشتر، socket(7) را ببینید.

انضباط صف etf هر بسته‌ای را که دارای txtime در گذشته باشد، یا اگر بسته‌ای در زمان انتظار برای خروج از صف منقضی شود، دور می‌اندازد (drop می‌کند).

این انضباط صف برای استفاده توسط برنامه‌های TSN (شبکه‌های حساس به زمان یا Time Sensitive Networking) در نظر گرفته شده است و قابلیت شکل‌دهی ترافیکی را ارائه می‌دهد که معمولاً در مستندات سازندگان و کنترل‌کننده‌های رابط شبکه به عنوان «Launch Time» (زمان پرتاب) یا «Time-Based Scheduling» (زمان‌بندی مبتنی بر زمان) نامیده می‌شود.

انضباط صف ETF به گونه‌ای طراحی شده است که در زیرمجموعه یک انضباط صف دیگر نصب شود که جریان بسته‌ها را به کلاس‌های ترافیکی نگاشت می‌کند؛ یک نمونه از آن mqprio(8) است.


ساعتی را مشخص می‌کند که باید توسط تایمر داخلی qdisc برای اندازه‌گیری زمان و زمان‌بندی رویدادها استفاده شود. این انضباط صف انتظار دارد بسته‌هایی که از آن عبور می‌کنند از همین clockid به عنوان مرجع برچسب‌های زمانی txtime خود استفاده کنند. این qdisc بسته‌های دریافتی از سوکت‌هایی را که از این قانون پیروی نکنند دور می‌اندازد.

برای اطلاعات بیشتر درباره زمان و ساعت‌ها در لینوکس، لطفاً به time(7) و clock_gettime(3) مراجعه کنید.


پس از صف‌بندی یا خروج یک بسته از صف، انضباط صف زمان بیدارباش بعدی خود را برای txtime بعدی منهای این مقدار delta زمان‌بندی می‌کند. این بدان معناست که delta می‌تواند به عنوان یک ضریب تعدیل (fudge factor) برای جبران تأخیر زمان‌بند سیستم استفاده شود. این مقدار باید بر حسب نانوثانیه مشخص شود. مقدار پیش‌فرض 0 نانوثانیه است.

هنگامی که deadline_mode تنظیم شود، این انضباط صف مفهوم txtime را با معنایی متفاوت مدیریت می‌کند که از زمان ارسال «اکید» (strict) به یک ضرب‌الاجل (deadline) تغییر می‌یابد. در عمل، این بدان معناست که در طول فرآیند خروج از صف، etf(8) مقدار txtime بسته‌ای را که در حال خارج شدن از صف است به «now» (اکنون) تنظیم می‌کند. حالت پیش‌فرض برای این گزینه، غیرفعال است.

هنگامی که offload تنظیم شود، etf(8) تلاش می‌کند تا رابط شبکه را به گونه‌ای پیکربندی کند که داوری ارسال مبتنی بر زمان در کنترل‌کننده فعال شود. این ویژگی معمولاً در مستندات کنترل‌کننده‌های رابط شبکه با نام‌های «Launch Time» یا «Time-Based Scheduling» شناخته می‌شود. حالت پیش‌فرض برای این گزینه، غیرفعال است.

در حال حاضر etf(8) هر بسته‌ای را که سوکتی به آن متصل نباشد یا اگر سوکت گزینه SO_TXTIME را تنظیم نکرده باشد، دور می‌اندازد. اما اگر launchtime توسط نهاد دیگری در داخل هسته (مانند یک Qdisc دیگر) تنظیم شده باشد، این رفتار کار نخواهد کرد. تنظیم skip_sock_check بررسی وجود سوکت مرتبط با بسته را نادیده می‌گیرد.

انضباط صف ETF برای اعمال کیفیت خدمات (QoS) استفاده می‌شود. این انضباط زمان خروج بسته‌ها از صف و ارسال آن‌ها را کنترل می‌کند و می‌تواند برای محدود کردن نرخ داده در یک کلاس ترافیکی به کار رود. برای تفکیک بسته‌ها به کلاس‌های ترافیکی، کاربر می‌تواند mqprio(8) را انتخاب کرده و آن را به این صورت پیکربندی کند:

# tc qdisc add dev eth0 handle 100: parent root mqprio 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 	hw 0

برای جایگزینی انضباط صف فعلی با ETF در کلاس ترافیکی شماره 0، دستور زیر را اجرا کنید:

# tc qdisc replace dev eth0 parent 100:1 etf 	clockid CLOCK_TAI delta 300000 offload

با گزینه‌های بالا، etf پیکربندی می‌شود تا از CLOCK_TAI به عنوان clockid_t استفاده کند، بسته‌ها را ۳۰۰ میکروثانیه پیش از txtime آن‌ها زمان‌بندی نماید و قابلیت مربوطه را روی کارت رابط شبکه فعال کند. حالت ضرب‌الاجل (deadline mode) برای این حالت پیکربندی نخواهد شد.

Jesus Sanchez-Palencia <jesus.sanchez-palencia@intel.com>
Vinicius Costa Gomes <vinicius.gomes@intel.com>

05 Jul 2018 iproute2