'\" t .\" Title: perf-amd-ibs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 09/04/2026 .\" Manual: perf Manual .\" Source: perf .\" Language: English .\" .TH "PERF\-AMD\-IBS" "1" "09/04/2026" "perf" "perf Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" perf-amd-ibs \- پشتیبانی از نمونه‌برداری مبتنی بر دستورالعمل AMD (IBS) با ابزار perf .SH "خلاصه دستور (SYNOPSIS)" .sp .nf \fIperf record\fR \-e ibs_op// \fIperf record\fR \-e ibs_fetch// .fi .SH "توضیحات (DESCRIPTION)" .sp نمونه‌برداری مبتنی بر دستورالعمل (IBS یا Instruction\-Based Sampling) امکان تحلیل عملکرد (پروفایلینگ) با اشاره‌گر دستورالعمل (IP) دقیق را بر روی پلتفرم‌های AMD فراهم می‌کند\&. ویژگی IBS دارای دو مؤلفه مستقل است: IBS Op و IBS Fetch\&. نمونه‌برداری IBS Op اطلاعاتی را در مورد اجرای دستورالعمل‌ها (دقیق‌تر بگوییم، اجرای ریزدستورها یا micro\-op) همراه با جزئیاتی مانند اصابت/عدم‌اصابت به d\-cache، اصابت/عدم‌اصابت به d\-TLB، تاخیر عدم‌اصابت حافظه نهان، منبع داده بارگذاری/ذخیره‌سازی (load/store)، رفتار انشعاب (branch behavior) و غیره ارائه می‌دهد\&. نمونه‌برداری IBS Fetch اطلاعاتی درباره واکشی دستورالعمل با جزئیاتی چون اصابت/عدم‌اصابت به i\-cache، اصابت/عدم‌اصابت به i\-TLB، تاخیر واکشی و غیره فراهم می‌کند\&. فناوری IBS به ازای هر رشته سخت‌افزاری SMT است (per\-smt\-thread)، به این معنی که هر رشته سخت‌افزاری SMT شامل واحدهای IBS مستقل و مجزا می‌باشد\&. .sp هر دو واحد IBS Op و IBS Fetch توسط لینوکس به عنوان PMU در دسترس قرار می‌گیرند و با استفاده از ابزار perf لینوکس قابل بهره‌برداری هستند\&. در صورتی که سخت‌افزار و هسته از IBS پشتیبانی کنند، فایل‌های زیر در زمان راه‌اندازی (boot) ایجاد خواهند شد\&. .sp .if n \{\ .RS 4 .\} .nf /sys/bus/event_source/devices/ibs_op/ /sys/bus/event_source/devices/ibs_fetch/ .fi .if n \{\ .RE .\} .sp واحد IBS Op PMU از دو رویداد پشتیبانی می‌کند: cycles و micro ops\&. واحد IBS Fetch PMU از یک رویداد پشتیبانی می‌کند: fetch ops\&. .sp واحدهای IBS PMU قابلیت پالایش کاربر/هسته (user/kernel filtering) ندارند و بنابراین نیازمند مجوزهای CAP_SYS_ADMIN یا CAP_PERFMON هستند\&. .SH "مقایسه IBS با PMUهای معمولی هسته (IBS VS. REGULAR CORE PMU)" .sp سامانه IBS نمونه‌هایی با IP دقیق ارائه می‌دهد، به این معنی که IP ثبت‌شده در نمونه IBS هیچ لغزش یا انحرافی (skid) ندارد؛ در حالی که IP ثبت‌شده توسط PMU معمولی هسته مقداری انحراف خواهد داشت (نمونه در IP X تولید شده است، اما perf آن را در IP X+n ثبت می‌کند)\&. از این رو، PMU معمولی هسته ممکن است برای تحلیل عملکرد با دقت در سطح دستورالعمل مناسب نباشد\&. علاوه بر این، IBS اطلاعات تکمیلی بیشتری را درباره نمونه مربوطه فراهم می‌کند\&. از سوی دیگر، PMU معمولی هسته مزایای خاص خود را دارد، از جمله تنوع فراوان رویدادها، حالت شمارش (با تداخل کمتر)، تا ۶ شمارنده موازی، پشتیبانی از گروه‌بندی رویدادها، قابلیت‌های پالایش و فیلترسازی و غیره\&. .sp سه رویداد معمولی core PMU در صورت تنظیم مشخصه precise_ip به‌طور داخلی به IBS Op PMU هدایت می‌شوند: .sp .if n \{\ .RS 4 .\} .nf \-e cpu\-cycles:p تبدیل می‌شود به \-e ibs_op// \-e r076:p تبدیل می‌شود به \-e ibs_op// \-e r0C1:p تبدیل می‌شود به \-e ibs_op/cnt_ctl=1/ .fi .if n \{\ .RE .\} .SH "مثال‌ها (EXAMPLES)" .SS "IBS Op PMU" .sp تحلیل عملکرد در سطح کل سیستم، رویداد cycles، دوره تناوب نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op// \-c 100000 \-a .fi .if n \{\ .RE .\} .sp تحلیل عملکرد به ازای هر پردازنده (cpu10)، رویداد cycles، دوره تناوب نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op// \-c 100000 \-C 10 .fi .if n \{\ .RE .\} .sp فقط فضای کاربری، تحلیل عملکرد به ازای پردازنده (cpu10)، رویداد cycles، دوره تناوب نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf Zen6 به بعد (نکات را ببینید): # perf record \-e ibs_op//u \-c 100000 \-C 10 .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf تا Zen5: # perf record \-e ibs_op/swfilt=1/u \-c 100000 \-C 10 .fi .if n \{\ .RE .\} .sp تحلیل عملکرد به ازای پردازنده (cpu10)، رویداد cycles، بسامد نمونه‌برداری: 1000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op// \-F 1000 \-C 10 .fi .if n \{\ .RE .\} .sp تحلیل عملکرد در سطح کل سیستم، رویداد uOps، دوره تناوب نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/cnt_ctl=1/ \-c 100000 \-a .fi .if n \{\ .RE .\} .sp همان دستور، اما همراه با ثبت رونوشت خام رجیسترهای IBS در کنار نمونه‌های perf: .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/cnt_ctl=1/ \-c 100000 \-a \-\-raw\-samples .fi .if n \{\ .RE .\} .sp تحلیل عملکرد در سطح کل سیستم، رویداد uOps، دوره تناوب نمونه‌برداری: 100000، حالت L3MissOnly (از Zen4 به بعد) .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/cnt_ctl=1,l3missonly=1/ \-c 100000 \-a .fi .if n \{\ .RE .\} .sp تحلیل عملکرد در سطح کل سیستم، رویداد cycles، دوره تناوب نمونه‌برداری: 100000، پالایش LdLat (از Zen5 به بعد) .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/ldlat=128/ \-c 100000 \-a .fi .if n \{\ .RE .\}.sp .if n \{\ .RS 4 .\} .nf مقادیر پشتیبانی‌شده برای آستانه تاخیر بارگذاری (load latency) بین 128 تا 2048 (شامل هر دو) است\&. مقدار تاخیری که مضربی از 128 باشد، در مقایسه با سایر مقادیر بار اضافی (overhead) پروفایل‌سازی اندکی کمتری به همراه دارد\&. .fi .if n \{\ .RE .\} .sp پروفایل‌سازی سراسری سیستم، رویداد cycles، دوره نمونه‌برداری: 100000، فیلتر streaming store (از Zen6 به بعد) .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/strmst=1/ \-c 100000 \-a .fi .if n \{\ .RE .\} .sp به ازای هر فرایند (upstream از v6\&.2 به بعد)، رویداد uOps، دوره نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/cnt_ctl=1/ \-c 100000 \-p 1234 .fi .if n \{\ .RE .\} .sp به ازای هر فرایند (upstream از v6\&.2 به بعد)، رویداد uOps، دوره نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_op/cnt_ctl=1/ \-c 100000 \-\- ls .fi .if n \{\ .RE .\} .sp برای تحلیل پروفایل ضبط‌شده در حالت تجمیعی .sp .if n \{\ .RS 4 .\} .nf # perf report /* یک سطر را انتخاب کرده و \*(Aqa\*(Aq را برای ورود به جزئیات در سطح دستورالعمل فشار دهید\&. */ .fi .if n \{\ .RE .\} .sp برای بررسی تک‌تک نمونه‌ها .sp .if n \{\ .RS 4 .\} .nf # perf script .fi .if n \{\ .RE .\} .sp تخلیه خام ثبات‌های IBS هنگام پروفایل‌سازی با \-\-raw\-samples .sp .if n \{\ .RS 4 .\} .nf # perf report \-D /* به دنبال PERF_RECORD_SAMPLE بگردید */ .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf نمونه خروجی تخلیه خام ثبات‌ها: .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf ibs_op_ctl: 000002c30006186a MaxCnt 100000 L3MissOnly 0 En 1 Val 1 CntCtl 0=cycles CurCnt 707 IbsOpRip: ffffffff8204aea7 ibs_op_data: 0000010002550001 CompToRetCtr 1 TagToRetCtr 597 BrnRet 0 RipInvalid 0 BrnFuse 0 Microcode 1 ibs_op_data2: 0000000000000013 RmtNode 1 DataSrc 3=DRAM ibs_op_data3: 0000000031960092 LdOp 0 StOp 1 DcL1TlbMiss 0 DcL2TlbMiss 0 DcL1TlbHit2M 1 DcL1TlbHit1G 0 DcL2TlbHit2M 0 DcMiss 1 DcMisAcc 0 DcWcMemAcc 0 DcUcMemAcc 0 DcLockedOp 0 DcMissNoMabAlloc 0 DcLinAddrValid 1 DcPhyAddrValid 1 DcL2TlbHit1G 0 L2Miss 1 SwPf 0 OpMemWidth 32 bytes OpDcMissOpenMemReqs 12 DcMissLat 0 TlbRefillLat 0 IbsDCLinAd: ff110008a5398920 IbsDCPhysAd: 00000008a5398920 .fi .if n \{\ .RE .\} .sp به‌کارگیری IBS در یک سناریوی دنیای واقعی .sp .if n \{\ .RS 4 .\} .nf افت کارایی حدود 90% در tbench با یک scheduler hint خاص مشاهده شد که دور از انتظار بود\&. پروفایل IBS اجراهای خوب و بد که با perf ثبت شد، در شناسایی علت دقیق مشکل کمک کرد: .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf https://lore\&.kernel\&.org/r/20220921063638\&.2489\-1\-kprateek\&.nayak@amd\&.com .fi .if n \{\ .RE .\}.SS "IBS Fetch PMU" .sp دستورهای مشابه را می‌توان برای Fetch PMU نیز به کار برد\&. .sp پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_fetch// \-c 100000 \-a .fi .if n \{\ .RE .\} .sp فقط فضای کاربری، پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 100000 .sp .if n \{\ .RS 4 .\} .nf از Zen6 به بعد (بخش NOTES را ببینید): # perf record \-e ibs_fetch//u \-c 100000 \-a .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf تا Zen5: # perf record \-e ibs_fetch/swfilt=1/u \-c 100000 \-a .fi .if n \{\ .RE .\} .sp پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 100000، قابلیت Random enable .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_fetch/rand_en=1/ \-c 100000 \-a .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf قابلیت Random enable مقداری تغییرپذیری و نوسان به دوره نمونه‌برداری می‌افزاید\&. این ویژگی در مواردی مانند حلقه‌های طولانی‌مدت که در آن‌ها PMU به دلیل دوره نمونه‌برداری ثابت مکرراً همان دستورالعمل را نشانه‌گذاری می‌کند، کمک‌کننده است\&. .fi .if n \{\ .RE .\} .sp پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 10000، فیلتر تاخیر واکشی (از Zen6 به بعد) .sp .if n \{\ .RS 4 .\} .nf # perf record \-e ibs_fetch/fetchlat=128/ \-c 10000 \-a .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf مقادیر آستانه تاخیر واکشی پشتیبانی‌شده از 128 تا 1920 (شامل هر دو مقدار) هستند\&. مقدار تاخیری که مضربی از 128 باشد، در مقایسه با سایر مقادیر سربار پروفایل‌گیری اندکی کمتری تحمیل می‌کند\&. .fi .if n \{\ .RE .\} .sp و غیره\&..SH "PERF MEM و PERF C2C (PERF MEM AND PERF C2C)" .sp ابزار perf mem یک ابزار تحلیل‌گر (پروفایلر) دسترسی به حافظه و perf c2c ابزاری برای تحلیل خط حافظهٔ نهان (cacheline) داده‌های اشتراکی است\&. هر دوی آن‌ها در پردازنده‌های AMD به‌طور داخلی از IBS Op PMU استفاده می‌کنند\&. در زیر یک مثال ساده از ابزار perf mem آورده شده است\&. .sp .if n \{\ .RS 4 .\} .nf # perf mem record \-c 100000 \-\- make # perf mem report .fi .if n \{\ .RE .\} .sp خروجی استاندارد perf mem report یک نمایهٔ دقیق از دسترسی به حافظه ارائه می‌دهد\&. فیلدهای خروجی جدید اطلاعات مرتبط با دسترسی را با یکدیگر نشان می‌دهند\&. برای نمونه: .sp .if n \{\ .RS 4 .\} .nf # perf mem report \-F overhead,cache,snoop,comm \&.\&.\&. # Samples: 92K of event \*(Aqibs_op//\*(Aq # Total weight : 531104 # # \-\-\-\-\-\-\-\-\-\- Cache \-\-\-\-\-\-\-\-\-\-\- \-\-\- Snoop \-\-\-\- # Overhead L1 L2 L1\-buf Other HitM Other Command # \&.\&.\&.\&.\&.\&.\&.\&. \&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&. \&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&. \&.\&.\&.\&.\&.\&.\&.\&.\&.\&. # 76\&.07% 5\&.8% 35\&.7% 0\&.0% 34\&.6% 23\&.3% 52\&.8% cc1 5\&.79% 0\&.2% 0\&.0% 0\&.0% 5\&.6% 0\&.1% 5\&.7% make 5\&.78% 0\&.1% 4\&.4% 0\&.0% 1\&.2% 0\&.5% 5\&.3% gcc 5\&.33% 0\&.3% 3\&.9% 0\&.0% 1\&.1% 0\&.2% 5\&.2% as 5\&.00% 0\&.1% 3\&.8% 0\&.0% 1\&.0% 0\&.3% 4\&.7% sh 1\&.56% 0\&.1% 0\&.1% 0\&.0% 1\&.4% 0\&.6% 0\&.9% ld 0\&.28% 0\&.1% 0\&.0% 0\&.0% 0\&.2% 0\&.1% 0\&.2% pkg\-config 0\&.09% 0\&.0% 0\&.0% 0\&.0% 0\&.1% 0\&.0% 0\&.1% git 0\&.03% 0\&.0% 0\&.0% 0\&.0% 0\&.0% 0\&.0% 0\&.0% rm \&.\&.\&. .fi .if n \{\ .RE .\} .sp همچنین می‌توان با استفاده از کلیدهای مرتب‌سازی، خروجی را بر اساس اطلاعات گوناگون دسترسی به حافظه تجمیع کرد\&. برای نمونه: .sp .if n \{\ .RS 4 .\} .nf # perf mem report \-s mem,snoop \&.\&.\&. # Samples: 92K of event \*(Aqibs_op//\*(Aq # Total weight : 531104 # Sort order : mem,snoop # # Overhead Samples Memory access Snoop # \&.\&.\&.\&.\&.\&.\&.\&. \&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&. \&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&. \&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&. # 47\&.99% 1509 L2 hit N/A 25\&.08% 338 core, same node Any cache hit HitM 10\&.24% 54374 N/A N/A 6\&.77% 35938 L1 hit N/A 6\&.39% 101 core, same node Any cache hit N/A 3\&.50% 69 RAM hit N/A 0\&.03% 158 LFB/MAB hit N/A 0\&.00% 2 Uncached hit N/A .fi .if n \{\ .RE .\} .sp برای جزئیات بیشتر لطفاً به صفحهٔ راهنمای (man page) هر ابزار مراجعه کنید\&. .SH "نکات (NOTES)" .sp فیلتر کردن سطح دسترسی سخت‌افزاری از بیت ۶۳ برای تمایز بین نشانی‌های فضای هسته (kernel) و فضای کاربری (userspace) استفاده می‌کند\&. فیلتر کردن سطح دسترسی سخت‌افزاری در سیستم‌های 32\-bit پشتیبانی نمی‌شود\&. افزون بر این، استاندارد بیت ۶۳ فراگیر نیست و در محیط‌های خاصی ممکن است با خطا مواجه شود؛ مانند استفاده از IBS میزبان (host) 64\-bit برای تحلیل مهمان (guest) 32\-bit، یا استفاده از IBS میزبان 64\-bit برای تحلیل مهمان‌های 64\-bit غیرلینوکسی که از استاندارد سطح دسترسی بیت ۶۳ پیروی نمی‌کنند، و موارد دیگر\&. .SH "همچنین ببینید (SEE ALSO)" .sp \fBperf-record\fR(1), \fBperf-script\fR(1), \fBperf-report\fR(1), \fBperf-mem\fR(1), \fBperf-c2c\fR(1)