xdp-bench(8) A simple XDP benchmarking tool xdp-bench(8)

xdp-bench - ابزار سادهٔ محک‌زنی و ارزیابی کارایی XDP

ابزار XDP-bench یک ابزار ارزیابی و محک‌زنی (benchmarking) برای به‌کارگیری و آزمایش حالت‌های عملیاتی مختلف XDP است. این برنامه با هدف ارائهٔ یک ابزار ساده برای نمایش حالت‌های کاری گوناگون طراحی شده است؛ این حالت‌ها شامل دور انداختن بسته‌ها (dropping)، هدایت سنجاق‌سری (hairpin forwarding با استفاده از کد بازگشتی XDP_TX)، و تغییر مسیر با استفاده از امکانات مختلف تغییر مسیر بسته درون هسته لینوکس هستند.

حالت‌های drop و TX از گزینه‌های مختلفی برای کنترل اینکه آیا داده‌های بسته پیش از دور انداخته شدن یا ارسال، لمس و دستکاری (خوانده یا نوشته) شوند یا خیر، پشتیبانی می‌کنند. حالت‌های تغییر مسیر (redirection) از به‌کارگیری تابع کمکی سادهٔ مبتنی بر ifindex به نام bpf_redirect، تابع کمکی bpf_redirect_map با استفاده از یک cpumap به عنوان مقصد، bpf_redirect_map با استفاده از devmap به عنوان مقصد، و حالت پخش همگانی (broadcast) در devmap که امکان تغییر مسیر به چندین دستگاه را فراهم می‌سازد، پشتیبانی می‌کنند.

اطلاعات بیشتر دربارهٔ مفهوم خروجی، در هر دو حالت خروجی پیش‌فرض (مختصر) و گسترده (extended)، در بخش توضیحات قالب خروجی در ادامه آورده شده است.

نحو اجرای xdp-bench به صورت زیر است:

Usage: xdp-bench COMMAND [options]
COMMAND can be one of:
       drop           - Drop all packets on an interface
       pass           - Pass all packets to the network stack
       tx             - Transmit packets back out on an interface (hairpin forwarding)
       redirect       - XDP redirect using the bpf_redirect() helper
       redirect-cpu   - XDP CPU redirect using BPF_MAP_TYPE_CPUMAP
       redirect-map   - XDP redirect using BPF_MAP_TYPE_DEVMAP
       redirect-multi - XDP multi-redirect using BPF_MAP_TYPE_DEVMAP and the BPF_F_BROADCAST flag
       xsk-drop       - AF_XDP socket-based drop
       xsk-tx         - AF_XDP socket-based hairpin forwarding

هر دستور و گزینه‌های آن در ادامه توضیح داده شده‌اند. همچنین می‌توانید از xdp-bench COMMAND --help برای مشاهدهٔ گزینه‌های هر دستور استفاده کنید.

در این حالت، xdp-bench یک برنامهٔ XDP را روی یک رابط شبکه نصب می‌کند که صرفاً تمام بسته‌ها را دور می‌اندازد. گزینه‌هایی برای کنترل نحوهٔ برخورد با بسته پیش از دور انداختن آن (لمس و دستکاری داده‌های بسته یا عدم انجام آن)، و نیز انتخاب آمارهای جمع‌آوری‌شده وجود دارد. این یک محک پایه برای عملکرد سطح مبنا (بهترین حالت ممکن) XDP روی یک رابط شبکه است.

نحو اجرای دستور drop به صورت زیر است:

xdp-bench drop [options] <ifname>

که در آن <ifname> نام رابطی است که برنامهٔ XDP باید روی آن نصب شود.

گزینه‌های پشتیبانی‌شده عبارتند از:

عملیاتی را که باید پیش از دور انداختن روی بسته انجام شود مشخص می‌کند. عملیات‌های زیر در دسترس هستند:

no-touch		- Drop the packet without touching the packet data
read-data		- Read a field in the packet header before dropping
parse-ip		- Parse the IP header field before dropping
swap-macs		- Swap the source and destination MAC addresses before dropping

دستکاری بسته پیش از دور انداختن آن می‌تواند تأثیر قابل‌توجهی بر کارایی داشته باشد، چرا که این کار مستلزم آوردن داده‌های بسته به حافظه نهان (cache) پردازنده (و در صورت نوشتن، تخلیهٔ مجدد آن به بیرون) است.

مقدار پیش‌فرض برای این گزینه no-touch است.

سازوکاری را که xdp-bench باید برای بارگذاری (و ذخیره‌سازی) داده‌های بسته استفاده کند مشخص می‌کند. حالت‌های زیر در دسترس هستند:

dpa		- Use traditional Direct Packet Access from the XDP program
load-bytes	- Use the xdp_load_bytes() and xdp_store_bytes() helper functions

این گزینه می‌تواند برای ارزیابی کارایی حالت‌های مختلف دسترسی به بسته که توسط هسته پشتیبانی می‌شوند، به کار رود.

مقدار پیش‌فرض برای این گزینه dpa است.

در صورت تنظیم، برنامهٔ XDP همچنین آماری دربارهٔ اینکه هر بسته روی کدام شاخص صف دریافت (receive queue index) تحویل گرفته شده است جمع‌آوری می‌کند. این آمار در حالت خروجی گسترده به همراه داده‌های به ازای هر پردازنده (که بسته به پیکربندی سخت‌افزاری ممکن است معادل باشند یا نباشند) نمایش داده می‌شود.

تنظیم بازهٔ زمانی نظرسنجی (polling interval) برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت، xdp-bench یک برنامهٔ XDP را روی یک رابط شبکه نصب می‌کند که تمام بسته‌ها را پس از پردازش، به پشتهٔ شبکه تحویل می‌دهد (با بازگرداندن XDP_PASS). گزینه‌هایی برای کنترل نحوهٔ برخورد با بسته پیش از عبور دادن آن (دستکاری داده‌های بسته یا عدم انجام آن)، و نیز آمارهایی که باید جمع‌آوری شوند وجود دارد. این یک محک پایه برای سنجش بار پردازشی ناشی از نصب برنامهٔ XDP بر روی رابط شبکه در حین اجرای پشتهٔ عادی شبکه است.

نحو اجرای دستور pass به صورت زیر است:

xdp-bench pass [options] <ifname>

که در آن <ifname> نام رابطی است که برنامهٔ XDP باید روی آن نصب شود.

گزینه‌های پشتیبانی‌شده عبارتند از:

عملیاتی را که باید پیش از عبور دادن روی بسته انجام شود مشخص می‌کند. عملیات‌های زیر در دسترس هستند:

no-touch		- Pass the packet without touching the packet data
read-data		- Read a field in the packet header before passing
parse-ip		- Parse the IP header field before passing
swap-macs		- Swap the source and destination MAC addresses before passing

مقدار پیش‌فرض برای این گزینه no-touch است.

سازوکاری را که xdp-bench باید برای بارگذاری (و ذخیره‌سازی) داده‌های بسته استفاده کند مشخص می‌کند. حالت‌های زیر در دسترس هستند:

dpa		- Use traditional Direct Packet Access from the XDP program
load-bytes	- Use the xdp_load_bytes() and xdp_store_bytes() helper functions

این گزینه می‌تواند برای ارزیابی کارایی حالت‌های مختلف دسترسی به بسته که توسط هسته پشتیبانی می‌شوند، به کار رود.

مقدار پیش‌فرض برای این گزینه dpa است.

در صورت تنظیم، برنامهٔ XDP همچنین آماری دربارهٔ اینکه هر بسته روی کدام شاخص صف دریافت تحویل گرفته شده است جمع‌آوری می‌کند. این آمار در حالت خروجی گسترده به همراه داده‌های به ازای هر پردازنده (که بسته به پیکربندی سخت‌افزاری ممکن است معادل باشند یا نباشند) نمایش داده می‌شود.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت، xdp-bench یک برنامهٔ XDP را روی یک رابط شبکه نصب می‌کند که اصطلاحاً «هدایت سنجاق‌سری» (hairpin forwarding) انجام می‌دهد؛ به این معنا که هر بسته مجدداً از همان رابط به بیرون ارسال می‌شود (با استفاده از کد بازگشتی XDP_TX). گزینه‌هایی برای کنترل اقداماتی که پیش از ارسال روی بسته انجام می‌شود (دستکاری داده‌های بسته یا عدم انجام آن)، و نیز آمارهایی که باید جمع‌آوری شوند وجود دارد.

نحو اجرای دستور tx به صورت زیر است:

xdp-bench tx [options] <ifname>

که در آن <ifname> نام رابطی است که برنامهٔ XDP باید روی آن نصب شود.

گزینه‌های پشتیبانی‌شده عبارتند از:

عملیاتی را که باید پیش از ارسال روی بسته انجام شود مشخص می‌کند. عملیات‌های زیر در دسترس هستند:

no-touch		- Transmit the packet without touching the packet data
read-data		- Read a field in the packet header before transmitting
parse-ip		- Parse the IP header field before transmitting
swap-macs		- Swap the source and destination MAC addresses before transmitting

برای اینکه بسته بتواند با موفقیت به سمت فرستنده بازگردانده شود، نشانی‌های MAC باید جابه‌جا (swap) شوند تا MAC مبدأ با دستگاه شبکه مطابقت داشته باشد. با این حال، جابه‌جایی دارای بار پردازشی است، بنابراین این گزینه امکان غیرفعال کردن این تابع را فراهم می‌سازد.

مقدار پیش‌فرض برای این گزینه swap-macs است.

سازوکاری را که xdp-bench باید برای بارگذاری (و ذخیره‌سازی) داده‌های بسته استفاده کند مشخص می‌کند. حالت‌های زیر در دسترس هستند:

dpa		- Use traditional Direct Packet Access from the XDP program
load-bytes	- Use the xdp_load_bytes() and xdp_store_bytes() helper functions

این گزینه می‌تواند برای ارزیابی کارایی حالت‌های مختلف دسترسی به بسته که توسط هسته پشتیبانی می‌شوند، به کار رود.

مقدار پیش‌فرض برای این گزینه dpa است.

در صورت تنظیم، برنامهٔ XDP همچنین آماری دربارهٔ اینکه هر بسته روی کدام شاخص صف دریافت تحویل گرفته شده است جمع‌آوری می‌کند. این آمار در حالت خروجی گسترده به همراه داده‌های به ازای هر پردازنده (که بسته به پیکربندی سخت‌افزاری ممکن است معادل باشند یا نباشند) نمایش داده می‌شود.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت، xdp-bench تغییر مسیر بسته را بین دو رابط ارائه شده در خط فرمان، با استفاده از تابع کمکی BPF به نام bpf_redirect که هنگام دریافت بسته روی رابط ورودی (ingress) فعال می‌شود، تنظیم می‌کند.

نحو اجرای دستور redirect به صورت زیر است:

xdp-bench redirect [options] <ifname_in> <ifname_out>

که در آن <ifname_in> نام رابط ورودی است که بسته‌ها از آن به سمت رابط خروجی <ifname_out> تغییر مسیر داده می‌شوند.

گزینه‌های پشتیبانی‌شده عبارتند از:

سازوکاری را که xdp-bench باید برای بارگذاری (و ذخیره‌سازی) داده‌های بسته استفاده کند مشخص می‌کند. حالت‌های زیر در دسترس هستند:

dpa		- Use traditional Direct Packet Access from the XDP program
load-bytes	- Use the xdp_load_bytes() and xdp_store_bytes() helper functions

این گزینه می‌تواند برای ارزیابی کارایی حالت‌های مختلف دسترسی به بسته که توسط هسته پشتیبانی می‌شوند، به کار رود.

مقدار پیش‌فرض برای این گزینه dpa است.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

فعال‌سازی آمار برای تغییر مسیرهای موفق. این گزینه برای ثبت تمام تغییر مسیرهای موفق، بار پردازشی ردگیری به ازای هر بسته به همراه دارد.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت، xdp-bench تغییر مسیر بسته را با استفاده از تابع کمکی BPF به نام bpf_redirect_map که هنگام دریافت بسته روی رابط ورودی فعال می‌شود و یک cpumap را به عنوان مقصد به کار می‌گیرد، تنظیم می‌کند. بدین ترتیب، این ابزار می‌تواند برای تغییر مسیر بسته‌ها روی یک رابط از یک پردازنده (CPU) به پردازنده‌ای دیگر استفاده شود. علاوه بر این، این ابزار از تغییر مسیر بسته به یک دستگاه خروجی دیگر، پس از پردازش روی پردازندهٔ مقصد نیز پشتیبانی می‌کند.

نحو اجرای دستور redirect-cpu به صورت زیر است:

xdp-bench redirect-cpu [options] <ifname> -c 0 ... -c N

که در آن <ifname> نام رابط ورودی است که بسته‌ها از آن به فهرست پردازنده‌های مقصد مشخص‌شده با -c تغییر مسیر داده می‌شوند.

گزینه‌های پشتیبانی‌شده عبارتند از:

مشخص کردن شاخص یک پردازندهٔ مقصد احتمالی. این گزینه باید حداقل یک بار مشخص شود، و می‌توان آن را چندین بار برای تعیین فهرستی از پردازنده‌ها به کار برد. اینکه کدام پردازنده برای یک بستهٔ معین انتخاب می‌شود به مقدار گزینهٔ --program-mode که در ادامه شرح داده شده بستگی دارد.

مشخص کردن برنامه‌ای که یک سیاست از پیش تعریف‌شده برای تصمیم‌گیری دربارهٔ چگونگی تغییر مسیر بسته‌ها به پردازنده‌های مختلف را در خود جای داده است. گزینه‌های زیر در دسترس هستند:

no-touch		- Redirect without touching packet data
touch		- Read packet data before redirecting
round-robin	- Cycle between target CPUs in a round-robin fashion (for each packet)
l4-proto		- Choose the target CPU based on the layer-4 protocol of packet
l4-filter		- Like l4-proto, but drop UDP packets with destination port 9 (used by pktgen)
l4-hash		- Use source and destination IP hashing to pick target CPU
l4-sport		- Use modulo of source port to pick target CPU
l4-dport		- Use modulo of destination port to pick target CPU

حالت‌های no-touch و touch همیشه بسته‌ها را به همان یک پردازنده (نخستین مقدار داده‌شده به --cpu) تغییر مسیر می‌دهند. حالت‌های round-robin و l4-hash بسته‌ها را میان تمام پردازنده‌های ارائه‌شده در آرگومان‌های --cpu توزیع می‌کنند، در حالی که l4-proto و l4-filter بسته‌های TCP و بسته‌های ناشناخته را به پردازنده با شاخص 0، بسته‌های UDP را به پردازنده با شاخص 1 و بسته‌های ICMP را به پردازنده با شاخص 2 می‌فرستند (که در آن شاخص به ترتیب ارائهٔ پردازنده‌های واقعی در خط فرمان اشاره دارد).

مقدار پیش‌فرض برای این گزینه l4-hash است.

در صورت تنظیم این گزینه، یک برنامهٔ مجزا در cpumap نصب می‌شود که پس از پردازش بسته در پردازندهٔ راه دور، بر روی آن فراخوانی خواهد شد. این اقدام می‌تواند drop یا pass باشد که به ترتیب بسته را دور می‌اندازد یا آن را به پشتهٔ معمول شبکه تحویل می‌دهد. یا می‌تواند redirect باشد که باعث می‌شود بسته به یک رابط دیگر تغییر مسیر داده شده و روی آن رابط در پردازندهٔ راه دور ارسال شود. در صورت تنظیم این گزینه روی redirect، دستگاه مقصد باید با استفاده از --redirect-device مشخص شود.

مقدار پیش‌فرض برای این گزینه disabled (غیرفعال) است.

مشخص کردن دستگاهی که بسته پس از دریافت در پردازندهٔ مقصد باید به آن تغییر مسیر یابد. توجه داشته باشید که این گزینه تنها همراه با --remote-action redirect قابل استفاده است.

تنظیم اندازهٔ صف برای بافر حلقوی cpumap به ازای هر پردازنده که برای تغییر مسیر بسته‌ها از چندین پردازنده به یک پردازنده به کار می‌رود. مقدار پیش‌فرض 2048 بسته است.

آزمون فشار (stress) بر پیاده‌سازی cpumap با آزادسازی و تخصیص مجدد بافر حلقوی cpumap در هر بازهٔ نظرسنجی.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

فعال‌سازی آمار برای تغییر مسیرهای موفق. این گزینه برای ثبت تمام تغییر مسیرهای موفق، بار پردازشی ردگیری به ازای هر بسته به همراه دارد.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت، xdp-bench تغییر مسیر بسته را بین دو رابط ارائه شده در خط فرمان، با استفاده از تابع کمکی BPF به نام bpf_redirect_map() که هنگام دریافت بسته روی رابط ورودی فعال می‌شود و یک devmap را به عنوان مقصد به کار می‌گیرد، تنظیم می‌کند.

نحو اجرای دستور redirect-map به صورت زیر است:

xdp-bench redirect-map [options] <ifname_in> <ifname_out>

که در آن <ifname_in> نام رابط ورودی است که بسته‌ها از آن به سمت رابط خروجی <ifname_out> تغییر مسیر داده می‌شوند.

گزینه‌های پشتیبانی‌شده عبارتند از:

بارگذاری یک برنامه در مدخل devmap مورد استفاده برای تغییر مسیر، به گونه‌ای که پس از تغییر مسیر بسته به دستگاه مقصد و پیش از ارسال آن از رابط خروجی فراخوانی شود. این برنامه را می‌توان از طریق گزینهٔ egress-mode انتخاب کرد.

تنظیم برنامهٔ خروجی (egress) برای بارگذاری:

forward	- Update the packet data so its source MAC address matches the one of the destination interface.
drop		- Drop packet.

مقدار پیش‌فرض برای این گزینه forward است.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

فعال‌سازی آمار برای تغییر مسیرهای موفق. این گزینه برای ثبت تمام تغییر مسیرهای موفق، بار پردازشی ردگیری به ازای هر بسته به همراه دارد.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت، xdp-bench تغییر مسیر یک‌به‌چند بسته را میان رابط‌های ارائه‌شده در خط فرمان، با استفاده از تابع کمکی BPF به نام bpf_redirect_map که هنگام دریافت بسته روی رابط ورودی فعال می‌شود و یک devmap را به عنوان مقصد به کار می‌گیرد، تنظیم می‌کند. بسته با استفاده از قابلیت پخش بسته در devmap، به تمامی رابط‌های خروجی مشخص‌شده در خط فرمان پخش همگانی (broadcast) می‌شود.

نحو اجرای دستور redirect-multi به صورت زیر است:

xdp-bench redirect-multi [options] <ifname_in> <ifname_out1> ... <ifname_outN>

که در آن <ifname_in> نام رابط ورودی است که بسته‌ها از آن به یک یا چند رابط خروجی تغییر مسیر داده می‌شوند.

گزینه‌های پشتیبانی‌شده عبارتند از:

بارگذاری یک برنامه در مدخل devmap مورد استفاده برای تغییر مسیر، به گونه‌ای که پس از تغییر مسیر بسته به دستگاه مقصد و پیش از ارسال آن از رابط خروجی فراخوانی شود. این برنامه را می‌توان از طریق گزینهٔ egress-mode انتخاب کرد.

تنظیم برنامهٔ خروجی برای بارگذاری:

forward	- Update the packet data so its source MAC address matches the one of the destination interface.
drop		- Drop packet.

مقدار پیش‌فرض برای این گزینه forward است.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. واحد این بازه ثانیه است.

فعال‌سازی آمار برای تغییر مسیرهای موفق. این گزینه برای ثبت تمام تغییر مسیرهای موفق، بار پردازشی ردگیری به ازای هر بسته به همراه دارد.

اجرای xdp-bench در حالت خروجی «گسترده» (extended). در صورت عدم تنظیم، xdp-bench در حالت «مختصر» (terse) آغاز به کار می‌کند. حالت خروجی را می‌توان با فشردن کلیدهای ترکیبی C-\ در زمان اجرای برنامه تغییر داد. همچنین به بخش توضیحات قالب خروجی در ادامه مراجعه کنید.

حالت برنامهٔ XDP را انتخاب می‌کند (native یا skb). توجه داشته باشید که حالت native XDP پیش‌فرض است، و بارگذاری برنامهٔ تغییر مسیر به صورت skb نه کارایی مناسبی دارد و نه توصیه می‌شود. با این حال، این گزینه در صورتی که درایور رابط از حالت بومی XDP پشتیبانی نکند، یا هنگام آزمایش سادهٔ ابزار مفید است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار تعیین این گزینه، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخهٔ برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

در این حالت‌ها، xdp-bench بسته‌های ورودی را دور می‌اندازد یا بازتاب می‌دهد (مشابه استفاده از دستورات drop یا tx)، اما با استفاده از یک سوکت AF_XDP که بسته‌ها را مستقیماً از قلاب XDP به فضای کاربر (userspace) انتقال می‌دهد. این حالت‌ها می‌توانند برای آزمایش و ارزیابی سوکت‌های AF_XDP به کار روند. این دو دستور صرفاً در اقدامی که انجام می‌دهند تفاوت دارند - نحو اجرا و گزینه‌ها در هر دو کاملاً یکسان هستند.

کد این دستورات از ابزار xdpsock که پیش‌تر بخشی از سورس‌های هسته و اخیراً مخزن bpf-examples بوده، برگرفته شده است. دستور xsk-drop معادل گزینهٔ --rxdrop در xdpsock است، و دستور xsk-tx با دستور --l2fwd در xdpsock مطابقت دارد.

نحو و گزینه‌های این دو دستور یکسان است:

xdp-bench xsk-drop [options] <ifname>

یا

xdp-bench xsk-tx [options] <ifname>

گزینه‌های پشتیبانی‌شده عبارتند از:

انتخاب صف سخت‌افزاری دریافت برای استفاده در آزمایش. سوکت AF_XDP به این صف مقید (bind) می‌شود، که بدین معناست xdp-bench تمام بسته‌های ورودی به آن را پردازش خواهد کرد. پیش‌فرض استفاده از صف 0 است.

تنظیم بازهٔ زمانی نظرسنجی برای جمع‌آوری تمام آمارها و نمایش آن‌ها در خروجی. بازهٔ پیش‌فرض 2 ثانیه است.

تنظیم اندازه فریم‌های حافظه مورد استفاده برای دریافت بسته‌ها. بسته‌های ورودی صرف‌نظر از اندازهٔ واقعی بسته روی بستر شبکه، همواره از یک تکه حافظه به این اندازه استفاده خواهند کرد. اندازه باید توانی از دو باشد، مگر آنکه پرچم --unaligned استفاده شود. مقدار پیش‌فرض 4096 بایت است (که با اندازه صفحه در اکثر سیستم‌ها مطابقت دارد).

تنظیم مدت‌زمان آزمایش بر حسب ثانیه. پیش‌فرض 0 است (اجرای بی‌پایان).

تنظیم اندازه بستهٔ دسته‌ای (batch size) برای حلقهٔ دریافت. این حداکثر تعداد بسته‌هایی است که در هر بار اجرای حلقه به صورت یکجا پردازش می‌شوند. پیش‌فرض 64 بسته است.

فعال‌سازی چاپ آمارهای وقفه برای شماره وقفه مرتبط با irq-string در مسیر /proc/interrupts. این رشته برای یافتن شماره IRQ منطبق از طریق تطبیق سادهٔ زیررشته استفاده می‌شود. پیش‌فرضی ندارد (به این معنی که هیچ آمار IRQ چاپ نمی‌شود).

استفاده از فراخوان سیستمی poll() برای دریافت اعلان بسته‌های جدید، به جای اجرای یک حلقهٔ مداوم و بررسی پیوسته برای بسته‌های جدید.

عدم تنظیم پرچم XDP_USE_NEED_WAKEUP هنگام مقید کردن سوکت AF_XDP. این پرچم به صورت پیش‌فرض تنظیم است و باعث می‌شود درایور هسته گاهی اوقات به خواب برود و هنگام دریافت بسته‌ها، پردازنده را به برنامهٔ فضای کاربر واگذار کند.

پشتیبانی از دریافت بسته‌های ناهم‌تراز (unaligned)، یعنی بسته‌هایی که با ابتدای یک فریم داده تراز نیستند. در صورت تنظیم، xdp-bench صفحات بزرگ (huge pages) را برای بافر حافظه فضای کاربر جهت دریافت بسته‌ها فعال می‌کند. تنظیم این گزینه اندازه‌های فریمی را که توانی از دو نیستند ممکن می‌سازد (گزینهٔ --frame-size را ببینید).

فعال‌سازی حافظهٔ اشتراکی فضای کاربر میان چندین سوکت AF_XDP. هنگامی که این گزینه تنظیم شود، xdp-bench چهار سوکت ایجاد می‌کند که از یک بافر حافظه فضای کاربر مشترک استفاده می‌کنند، و بسته‌ها به صورت نوبتی (round-robin) به هر سوکت ارسال می‌شوند.

چاپ آمارهای اضافی بسته در هر بازهٔ خروجی.

عدم چاپ هرگونه آمار در بازه‌های خروجی.

چاپ آمارهای تکمیلی سطح برنامه در هر بازهٔ خروجی.

تنظیم گزینهٔ سوکت SO_PREFER_BUSY_POLL، که به برنامه اجازه می‌دهد بدون نیاز به فعال بودن وقفه‌ها (IRQs) روی صف سخت‌افزاری در حال پردازش، نظرسنجی فشرده (busy-poll) انجام دهد. برای استفاده از این گزینه، متغیرهای sysctl مربوط به napi_defer_hard_irqs و gro_flush_timeout باید برای رابط مورد نظر تنظیم شوند. برای اطلاعات بیشتر، به https://docs.kernel.org/networking/napi.html#software-irq-coalescing مراجعه کنید.

فعال‌سازی تکه‌تکه‌سازی XDP (fragments). این گزینه دریافت بسته‌هایی بزرگ‌تر از اندازه صفحه سیستم را امکان‌پذیر می‌سازد و نیازمند پشتیبانی هسته و درایور است.

انتخاب حالت کپی برای بسته‌ها. می‌تواند یکی از مقادیر auto، copy، یا zero-copy باشد. مقدار پیش‌فرض auto است که به هسته اجازه می‌دهد انتخاب کند. استفاده از zero-copy نیازمند پشتیبانی هسته و درایور است، و تنها هنگام اتصال برنامه XDP در حالت native قابل استفاده است (--attach-mode را ببینید).

انتخاب ساعتی که برای تمامی رویدادهای زمان‌سنج در برنامه استفاده خواهد شد. مقادیر معتبر عبارتند از MONOTONIC، REALTIME، TAI و BOOTTIME، و مقدار پیش‌فرض MONOTONIC است.

تنظیم سیاست زمان‌بندی (scheduler policy) برای برنامه پیش از اجرا. مقادیر معتبر SCHED_OTHER و SCHED_FIFO هستند و پیش‌فرض SCHED_OTHER است.

تنظیم اولویت زمان‌بندی هنگام استفاده از SCHED_FIFO. مقدار پیش‌فرض 0 است.

تنظیم حالت پیوست برنامه XDP (native یا skb). پیش‌فرض حالت native است. توجه داشته باشید که zero-copy تنها در حالت native قابل استفاده است.

فعال‌سازی گزارش‌دهی پرجزئیات. با دوبار مشخص کردن، گزارش‌دهی پرجزئیات از کتابخانه‌های زیرین libxdp و libbpf فعال می‌شود.

نمایش نسخه برنامه و خروج.

نمایش خلاصه‌ای از گزینه‌های موجود.

به‌طور پیش‌فرض، آمارهای مربوط به موفقیت در تغییر مسیر غیرفعال هستند؛ برای فعال‌سازی از --stats استفاده کنید. حالت خروجی مختصر (terse) پیش‌فرض است، و حالت خروجی گسترده (extended) را می‌توان با گزینهٔ خط فرمان --extended فعال کرد.

می‌توان از سیگنال SIGQUIT (کلیدهای Ctrl + \) برای تغییر پویای حالت خروجی در زمان اجرا استفاده کرد.

حالت مختصر حداکثر فیلدهای زیر را نمایش می‌دهد:

rx/s		تعداد بسته‌های دریافتی در هر ثانیه
redir/s	تعداد بسته‌های با تغییر مسیر موفق در هر ثانیه
err,drop/s	مجموع خطاهای رخ‌داده در هر ثانیه (شامل بسته‌های دور ریخته‌شده در هنگام عدم استفاده از دستور drop)
xmit/s	تعداد بسته‌های ارسال‌شده روی دستگاه خروجی در هر ثانیه

حالت خروجی پرجزئیات حداکثر فیلدهای زیر را نمایش می‌دهد:

FIELD		  DESCRIPTION
receive	       نمایش تعداد بسته‌های دریافتی و خطاهای رخ‌داده
                        هرگاه خطا یا دور ریختن بسته رخ دهد، جزئیات آمار خطا
                        و بسته‌های دور ریخته‌شده به ازای هر پردازنده خطی نمایش می‌یابد.
                                         pkt/s		- بسته‌های دریافتی در هر ثانیه
                                         drop/s		- بسته‌های دور ریخته‌شده در هر ثانیه
                                         error/s		- خطاهای رخ‌داده در هر ثانیه
                                         redirect	- نمایش تعداد بسته‌های با تغییر مسیر موفق
                       خطاهای رخ‌داده ذیل فیلد redirect_err بسط داده می‌شوند
                       توجه کنید ارسال گزینه s- برای فعال‌سازی دارای بار به ازای هر بسته است
                                         redir/s		- بسته‌های موفق در تغییر مسیر در هر ثانیه
redirect_err	  نمایش تعداد بسته‌هایی که تغییر مسیر آن‌ها ناموفق بوده است
                        کد خطا (errno) به تفکیک هر پردازنده ذیل این فیلد نمایش می‌یابد
                       خطاهای شناخته‌شده عبارتند از:
                                         EINVAL:		تغییر مسیر نامعتبر
                                         ENETDOWN:	دستگاه مقصد تغییر مسیر خاموش یا غیرفعال است
                                         EMSGSIZE:	طول بسته برای دستگاه مقصد بسیار بزرگ است
                                         EOPNOTSUPP:	عملیات پشتیبانی نمی‌شود
                                         ENOSPC:		عدم وجود فضا در ptr_ring نخ هسته cpumap
                                         error/s		- بسته‌های ناموفق در تغییر مسیر در هر ثانیه
enqueue to cpu N نمایش تعداد بسته‌های صف‌بندی‌شده در صف تجمیعی پردازنده N
                       برای نمایش آمار صف‌بندی به ازای هر پردازنده به cpu:FROM->N بسط می‌یابد
                       بسته‌های دریافتی می‌توانند به پردازنده‌ای که برنامه تغییر مسیر
                       بسته‌ها را به آن ارسال می‌کند مرتبط شوند.
                                         pkt/s		- بسته‌های صف‌بندی‌شده در ثانیه از سایر پردازنده‌ها به پردازنده N
                                         drop/s		- بسته‌های دور ریخته‌شده هنگام صف‌بندی به پردازنده N
                                         bulk-avg	- میانگین تعداد بسته‌های پردازش‌شده برای هر رویداد
kthread	       نمایش تعداد بسته‌های پردازش‌شده در نخ هسته CPUMAP به ازای هر پردازنده
                       بسته‌های مصرف‌شده از ptr_ring در نخ هسته، و xdp_stats آن (پس از فراخوانی
                       برنامه bpf مربوط به CPUMAP) ذیل این بخش بسط می‌یابند.
                                         pkt/s		- بسته‌های مصرف‌شده در ثانیه از ptr_ring
                                         drop/s		- بسته‌های دور ریخته‌شده در ثانیه در نخ هسته
                                         sched		- تعداد دفعاتی که نخ هسته ()schedule را فراخوانی کرده
                       آمار xdp_stats (به تفکیک هر پردازنده نیز بسط می‌یابد)
                                         pass/s		- شمارش XDP_PASS در اجرای برنامه CPUMAP
                                         drop/s		- شمارش XDP_DROP در اجرای برنامه CPUMAP
                                         redir/s		- شمارش XDP_REDIRECT در اجرای برنامه CPUMAP
xdp_exception	  نمایش رویدادهای نقطه ردگیری xdp_exception
                        این مورد می‌تواند به دلیل خطاهای داخلی درایور، اکشن‌های ناشناخته XDP
                        یا تحریک صریح توسط کاربر با استفاده از XDP_ABORTED رخ دهد
                       هر اکشن به همراه شمارش آن ذیل این فیلد نمایش داده می‌شود
                                         hit/s		- تعداد دفعاتی که نقطه ردگیری در ثانیه فعال شده
devmap_xmit      نمایش رویدادهای نقطه ردگیری devmap_xmit
                        این نقطه ردگیری برای ارسال‌های موفق روی دستگاه خروجی فراخوانی می‌شود
                       اما این آمارها در حالت XDP عمومی در دسترس نیستند، بنابراین در حالت
                       SKB از خروجی حذف خواهند شد
                                         xmit/s		- تعداد بسته‌های ارسال‌شده در هر ثانیه
                                         drop/s		- تعداد بسته‌های ناموفق در ارسال در هر ثانیه
                                         drv_err/s	- تعداد خطاهای داخلی درایور در هر ثانیه
                                         bulk-avg	- میانگین تعداد بسته‌های پردازش‌شده برای هر رویداد

لطفاً هرگونه باگ را در گیت‌هاب گزارش دهید: https://github.com/xdp-project/xdp-tools/issues

ابزارهای اولیه xdp-redirect توسط Jesper Dangaard Brouer و John Fastabend نوشته شدند. سپس برای پشتیبانی از ویژگی‌های بیشتر توسط Kumar Kartikeya Dwivedi بازنویسی شدند، که او همچنین به همراه Toke Høiland-Jørgensen آن‌ها را به xdp-tools پورت کرد. این صفحه راهنما توسط Kumar Kartikeya Dwivedi و Toke Høiland-Jørgensen نوشته شده است.

February 19, 2026 V1.6.3