PERF-AMD-IBS(1) perf Manual PERF-AMD-IBS(1)

perf-amd-ibs - پشتیبانی از نمونه‌برداری مبتنی بر دستورالعمل AMD (IBS) با ابزار perf

perf record -e ibs_op//
perf record -e ibs_fetch//

نمونه‌برداری مبتنی بر دستورالعمل (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 مستقل و مجزا می‌باشد.

هر دو واحد IBS Op و IBS Fetch توسط لینوکس به عنوان PMU در دسترس قرار می‌گیرند و با استفاده از ابزار perf لینوکس قابل بهره‌برداری هستند. در صورتی که سخت‌افزار و هسته از IBS پشتیبانی کنند، فایل‌های زیر در زمان راه‌اندازی (boot) ایجاد خواهند شد.

/sys/bus/event_source/devices/ibs_op/
/sys/bus/event_source/devices/ibs_fetch/

واحد IBS Op PMU از دو رویداد پشتیبانی می‌کند: cycles و micro ops. واحد IBS Fetch PMU از یک رویداد پشتیبانی می‌کند: fetch ops.

واحدهای IBS PMU قابلیت پالایش کاربر/هسته (user/kernel filtering) ندارند و بنابراین نیازمند مجوزهای CAP_SYS_ADMIN یا CAP_PERFMON هستند.

سامانه IBS نمونه‌هایی با IP دقیق ارائه می‌دهد، به این معنی که IP ثبت‌شده در نمونه IBS هیچ لغزش یا انحرافی (skid) ندارد؛ در حالی که IP ثبت‌شده توسط PMU معمولی هسته مقداری انحراف خواهد داشت (نمونه در IP X تولید شده است، اما perf آن را در IP X+n ثبت می‌کند). از این رو، PMU معمولی هسته ممکن است برای تحلیل عملکرد با دقت در سطح دستورالعمل مناسب نباشد. علاوه بر این، IBS اطلاعات تکمیلی بیشتری را درباره نمونه مربوطه فراهم می‌کند. از سوی دیگر، PMU معمولی هسته مزایای خاص خود را دارد، از جمله تنوع فراوان رویدادها، حالت شمارش (با تداخل کمتر)، تا ۶ شمارنده موازی، پشتیبانی از گروه‌بندی رویدادها، قابلیت‌های پالایش و فیلترسازی و غیره.

سه رویداد معمولی core PMU در صورت تنظیم مشخصه precise_ip به‌طور داخلی به IBS Op PMU هدایت می‌شوند:

-e cpu-cycles:p تبدیل می‌شود به -e ibs_op//
-e r076:p تبدیل می‌شود به -e ibs_op//
-e r0C1:p تبدیل می‌شود به -e ibs_op/cnt_ctl=1/

تحلیل عملکرد در سطح کل سیستم، رویداد cycles، دوره تناوب نمونه‌برداری: 100000

# perf record -e ibs_op// -c 100000 -a

تحلیل عملکرد به ازای هر پردازنده (cpu10)، رویداد cycles، دوره تناوب نمونه‌برداری: 100000

# perf record -e ibs_op// -c 100000 -C 10

فقط فضای کاربری، تحلیل عملکرد به ازای پردازنده (cpu10)، رویداد cycles، دوره تناوب نمونه‌برداری: 100000

Zen6 به بعد (نکات را ببینید):
# perf record -e ibs_op//u -c 100000 -C 10
تا Zen5:
# perf record -e ibs_op/swfilt=1/u -c 100000 -C 10

تحلیل عملکرد به ازای پردازنده (cpu10)، رویداد cycles، بسامد نمونه‌برداری: 1000

# perf record -e ibs_op// -F 1000 -C 10

تحلیل عملکرد در سطح کل سیستم، رویداد uOps، دوره تناوب نمونه‌برداری: 100000

# perf record -e ibs_op/cnt_ctl=1/ -c 100000 -a

همان دستور، اما همراه با ثبت رونوشت خام رجیسترهای IBS در کنار نمونه‌های perf:

# perf record -e ibs_op/cnt_ctl=1/ -c 100000 -a --raw-samples

تحلیل عملکرد در سطح کل سیستم، رویداد uOps، دوره تناوب نمونه‌برداری: 100000، حالت L3MissOnly (از Zen4 به بعد)

# perf record -e ibs_op/cnt_ctl=1,l3missonly=1/ -c 100000 -a

تحلیل عملکرد در سطح کل سیستم، رویداد cycles، دوره تناوب نمونه‌برداری: 100000، پالایش LdLat (از Zen5 به بعد)

# perf record -e ibs_op/ldlat=128/ -c 100000 -a
مقادیر پشتیبانی‌شده برای آستانه تاخیر بارگذاری (load latency) بین 128 تا 2048 (شامل هر دو) است.
مقدار تاخیری که مضربی از 128 باشد، در مقایسه با سایر مقادیر بار اضافی (overhead)
پروفایل‌سازی اندکی کمتری به همراه دارد.

پروفایل‌سازی سراسری سیستم، رویداد cycles، دوره نمونه‌برداری: 100000، فیلتر streaming store (از Zen6 به بعد)

# perf record -e ibs_op/strmst=1/ -c 100000 -a

به ازای هر فرایند (upstream از v6.2 به بعد)، رویداد uOps، دوره نمونه‌برداری: 100000

# perf record -e ibs_op/cnt_ctl=1/ -c 100000 -p 1234

به ازای هر فرایند (upstream از v6.2 به بعد)، رویداد uOps، دوره نمونه‌برداری: 100000

# perf record -e ibs_op/cnt_ctl=1/ -c 100000 -- ls

برای تحلیل پروفایل ضبط‌شده در حالت تجمیعی

# perf report
/* یک سطر را انتخاب کرده و 'a' را برای ورود به جزئیات در سطح دستورالعمل فشار دهید. */

برای بررسی تک‌تک نمونه‌ها

# perf script

تخلیه خام ثبات‌های IBS هنگام پروفایل‌سازی با --raw-samples

# perf report -D
/* به دنبال PERF_RECORD_SAMPLE بگردید */
نمونه خروجی تخلیه خام ثبات‌ها:
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

به‌کارگیری IBS در یک سناریوی دنیای واقعی

افت کارایی حدود 90% در tbench با یک scheduler hint خاص مشاهده شد
که دور از انتظار بود. پروفایل IBS اجراهای خوب و بد که با perf ثبت
شد، در شناسایی علت دقیق مشکل کمک کرد:

دستورهای مشابه را می‌توان برای Fetch PMU نیز به کار برد.

پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 100000

# perf record -e ibs_fetch// -c 100000 -a

فقط فضای کاربری، پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 100000

از Zen6 به بعد (بخش NOTES را ببینید):
# perf record -e ibs_fetch//u -c 100000 -a
تا Zen5:
# perf record -e ibs_fetch/swfilt=1/u -c 100000 -a

پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 100000، قابلیت Random enable

# perf record -e ibs_fetch/rand_en=1/ -c 100000 -a
قابلیت Random enable مقداری تغییرپذیری و نوسان به دوره نمونه‌برداری می‌افزاید. این ویژگی
در مواردی مانند حلقه‌های طولانی‌مدت که در آن‌ها PMU به دلیل دوره نمونه‌برداری
ثابت مکرراً همان دستورالعمل را نشانه‌گذاری می‌کند، کمک‌کننده است.

پروفایل‌گیری در سطح کل سیستم، رویداد fetch ops، دوره نمونه‌برداری: 10000، فیلتر تاخیر واکشی (از Zen6 به بعد)

# perf record -e ibs_fetch/fetchlat=128/ -c 10000 -a
مقادیر آستانه تاخیر واکشی پشتیبانی‌شده از 128 تا 1920 (شامل هر دو مقدار) هستند.
مقدار تاخیری که مضربی از 128 باشد، در مقایسه با سایر مقادیر سربار پروفایل‌گیری
اندکی کمتری تحمیل می‌کند.

و غیره..SH "PERF MEM و PERF C2C (PERF MEM AND PERF C2C)"

ابزار perf mem یک ابزار تحلیل‌گر (پروفایلر) دسترسی به حافظه و perf c2c ابزاری برای تحلیل خط حافظهٔ نهان (cacheline) داده‌های اشتراکی است. هر دوی آن‌ها در پردازنده‌های AMD به‌طور داخلی از IBS Op PMU استفاده می‌کنند. در زیر یک مثال ساده از ابزار perf mem آورده شده است.

# perf mem record -c 100000 -- make
# perf mem report

خروجی استاندارد perf mem report یک نمایهٔ دقیق از دسترسی به حافظه ارائه می‌دهد. فیلدهای خروجی جدید اطلاعات مرتبط با دسترسی را با یکدیگر نشان می‌دهند. برای نمونه:

# perf mem report -F overhead,cache,snoop,comm
...
# Samples: 92K of event 'ibs_op//'
# 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
     ...

همچنین می‌توان با استفاده از کلیدهای مرتب‌سازی، خروجی را بر اساس اطلاعات گوناگون دسترسی به حافظه تجمیع کرد. برای نمونه:

# perf mem report -s mem,snoop
...
# Samples: 92K of event 'ibs_op//'
# 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

برای جزئیات بیشتر لطفاً به صفحهٔ راهنمای (man page) هر ابزار مراجعه کنید.

فیلتر کردن سطح دسترسی سخت‌افزاری از بیت ۶۳ برای تمایز بین نشانی‌های فضای هسته (kernel) و فضای کاربری (userspace) استفاده می‌کند. فیلتر کردن سطح دسترسی سخت‌افزاری در سیستم‌های 32-bit پشتیبانی نمی‌شود. افزون بر این، استاندارد بیت ۶۳ فراگیر نیست و در محیط‌های خاصی ممکن است با خطا مواجه شود؛ مانند استفاده از IBS میزبان (host) 64-bit برای تحلیل مهمان (guest) 32-bit، یا استفاده از IBS میزبان 64-bit برای تحلیل مهمان‌های 64-bit غیرلینوکسی که از استاندارد سطح دسترسی بیت ۶۳ پیروی نمی‌کنند، و موارد دیگر.

perf-record(1), perf-script(1), perf-report(1), perf-mem(1), perf-c2c(1)

09/04/2026 perf