PERF-RECORD(1) perf Manual PERF-RECORD(1)

perf-record - اجرای یک دستور و ضبط پروفایل عملکرد آن در perf.data

perf record [-e <EVENT> | --event=EVENT] [-a] <command>
perf record [-e <EVENT> | --event=EVENT] [-a] -- <command> [<options>]

این دستور یک فرمان را اجرا کرده و پروفایل شمارنده‌های عملکردی آن را بدون نمایش هیچ خروجی، در perf.data ذخیره و گردآوری می‌کند.

سپس این فایل را می‌توان بعداً با استفاده از perf report بررسی کرد.

<command>...

هر دستوری که بتوانید در یک پوسته مشخص کنید.

-e, --event=

انتخاب رویداد PMU. انتخاب می‌تواند شامل موارد زیر باشد:
•یک نام نمادین رویداد (برای مشاهده فهرست تمام رویدادها از perf list استفاده کنید)
•یک رویداد خام PMU در قالب rN که در آن N یک مقدار در مبنای ۱۶ (هگزادسیمال) است که کدگذاری خام ثبات را با ساختار ثبات‌های کنترل رویداد نمایش می‌دهد، همان‌گونه که توسط مدخل‌ها در /sys/bus/event_source/devices/cpu/format/* شرح داده شده است.
•یک رویداد PMU نمادین یا خام به همراه یک دونقطه اختیاری و فهرستی از اصلاح‌کننده‌های رویداد، مانند cpu-cycles:p. برای جزئیات در مورد اصلاح‌کننده‌های رویداد، صفحه راهنمای perf-list(1) را ببینید.
•یک رویداد PMU که به صورت نمادین شکل گرفته است مانند pmu/param1=0x3,param2/ که در آن param1، param2 و غیره به عنوان قالب‌هایی برای PMU در /sys/bus/event_source/devices/<pmu>/format/* تعریف شده‌اند.
•یک رویداد با ساختار نمادین مانند pmu/config=M,config1=N,config3=K/
که در آن M، N و K اعدادی (در قالب دهدهی، هگز یا اوکتال) هستند. مقادیر
مجاز برای هر یک از 'config'، 'config1' و 'config2' توسط مدخل‌های
متناظر در /sys/bus/event_source/devices/<pmu>/format/* مشخص می‌شوند.
پارامترهای param1 و param2 به عنوان قالب‌هایی برای PMU در این مسیر تعریف شده‌اند:
/sys/bus/event_source/devices/<pmu>/format/*
همچنین برخی پارامترها وجود دارند که در .../<pmu>/format/* تعریف نشده‌اند.
این پارامترها می‌توانند برای بازنویسی مقادیر پیکربندی پیش‌فرض برای هر رویداد استفاده شوند.
در اینجا برخی از پارامترهای رایج آورده شده است:
- 'period': تنظیم دوره نمونه‌برداری رویداد
- 'freq': تنظیم فرکانس نمونه‌برداری رویداد
- 'time': غیرفعال/فعال‌سازی برچسب زمانی. مقادیر مجاز عبارتند از ۱ برای
          فعال کردن برچسب زمانی و ۰ برای غیرفعال کردن آن.
          مقدار پیش‌فرض ۱ است.
- 'call-graph': غیرفعال/فعال‌سازی گراف فراخوانی. رشته‌های مجاز عبارتند از "fp" برای
               حالت FP،‏ "dwarf" برای حالت DWARF،‏ "lbr" برای حالت LBR و
               "no" برای غیرفعال کردن گراف فراخوانی.
- 'stack-size': اندازه پشته کاربر برای حالت dwarf
- 'name' : نام رویداد تعریف‌شده توسط کاربر. نقل‌قول تکی (') می‌تواند برای
          نادیده‌گیری نمادها در نام جهت جلوگیری از تجزیه توسط پوسته و ابزار استفاده شود
          مانند این: name=\'CPU_CLK_UNHALTED.THREAD:cmask=0x1\'.
- 'aux-output': تولید رکوردهای AUX به جای رویدادها. این مورد نیازمند این است
                که یک رویداد ناحیه AUX نیز مشخص شده باشد.
- 'aux-action': مقدار "pause" یا "resume" برای متوقف ساختن یا ازسرگیری یک رویداد
                ناحیه AUX (سرگروه) هنگام وقوع این رویداد.
                مقدار "start-paused" روی خود رویداد ناحیه AUX، آن را
                در وضعیت متوقف‌شده آغاز می‌کند.
- 'aux-sample-size': تنظیم اندازه نمونه برای نمونه‌برداری ناحیه AUX. اگر گزینه
'--aux-sample' استفاده شده باشد، مقدار aux-sample-size=0 را برای غیرفعال کردن
نمونه‌برداری ناحیه AUX برای این رویداد تنظیم کنید.
برای پارامترهای بیشتر به صفحه راهنمای perf-list(1) مراجعه کنید.
نکته: اگر کاربر به طور صریح گزینه‌هایی را تنظیم کند که با پارامترها در تضاد باشند،
مقدار تنظیم‌شده توسط پارامترها نادیده گرفته شده و بازنویسی خواهد شد.
همچنین پارامترهای پیکربندی ویژهٔ درایور PMU در مسیر
.../<pmu>/format/* تعریف نشده‌اند. هر پارامتر پیکربندی که پیش از
آن حرف '@' بیاید، در فضای کاربری تفسیر نشده و مستقیماً به درایور
PMU فرستاده می‌شود. برای نمونه:
perf record -e some_event/@cfg1,@cfg2=config/ ...
باعث می‌شود 'cfg1' و 'cfg2=config' برای پردازش بیشتر به
درایور PMU مرتبط با رویداد ارسال شوند. هیچ محدودیتی روی چیستی
پارامترهای پیکربندی وجود ندارد، تا زمانی که معنای آن‌ها توسط
درایور PMU درک و پشتیبانی شود.
•یک رویداد نقطه توقف سخت‌افزاری به شکل \mem:addr[/len][:access] که در آن addr نشانی حافظه‌ای است که می‌خواهید در آن توقف ایجاد شود. access نوع دسترسی به حافظه (خواندن، نوشتن، اجرا) است که می‌تواند به این صورت مشخص شود: \mem:addr[:[r][w][x]]. پارامتر len محدوده، یعنی تعداد بایت‌هایی از addr مشخص‌شده است که نقطه توقف پوشش خواهد داد. اگر می‌خواهید دسترسی‌های خواندن-نوشتن را در 0x1000 پروفایل کنید، کافی است مقدار زیر را تنظیم کنید: mem:0x1000:rw. اگر می‌خواهید دسترسی‌های نوشتن را در بازهٔ [0x1000~1008) پروفایل کنید، کافی است مقدار زیر را تنظیم کنید: mem:0x1000/8:w.
•گروهی از رویدادها که با یک جفت آکولاد احاطه شده‌اند ("{event1,event2,...}"). هر رویداد با کاما جدا می‌شود و برای جلوگیری از تفسیر توسط شل (shell) باید کل گروه را درون علامت نقل‌قول قرار داد. همچنین برای مشاهدهٔ رویدادهای گروه به‌صورت هم‌زمان، باید از گزینهٔ --group در دستور "perf report" استفاده کنید.

--filter=<filter>

فیلتر رویداد. این گزینه باید بعد از یک انتخاب‌کنندهٔ رویداد (-e) قرار گیرد. اگر رویداد یک tracepoint باشد، رشتهٔ فیلتر توسط هسته تجزیه خواهد شد. اگر رویداد یک PMU برای ردگیری سخت‌افزاری باشد (مانند Intel PT یا CoreSight)، به عنوان یک فیلتر نشانی پردازش می‌شود. در غیر این صورت به معنای یک فیلتر عمومی با استفاده از BPF خواهد بود که می‌تواند برای هر نوع رویدادی اعمال شود.
•فیلترهای tracepoint
در مورد tracepointها، گزینه‌های چندگانهٔ '--filter' با استفاده
از '&&' با یکدیگر ترکیب می‌شوند.
•فیلترهای نشانی
یک PMU ردگیری سخت‌افزاری، قابلیت خود برای پذیرش تعدادی فیلتر نشانی
را با مشخص کردن یک مقدار غیرصفر در مسیر
/sys/bus/event_source/devices/<pmu>/nr_addr_filters اعلام می‌کند.
فیلترهای نشانی ساختار زیر را دارند:
filter|start|stop|tracestop <start> [/ <size>] [@<file name>]
که در آن:
- 'filter': محدوده‌ای را مشخص می‌کند که ردگیری خواهد شد.
- 'start': نشانی‌ای را مشخص می‌کند که ردگیری از آن آغاز می‌شود.
- 'stop': نشانی‌ای را مشخص می‌کند که ردگیری در آن متوقف می‌شود.
- 'tracestop': محدوده‌ای را مشخص می‌کند که ردگیری درون آن متوقف خواهد شد.
پارامتر <file name> نام فایل شیء (object file)، و <start> آفست کد مورد نظر
برای ردگیری در آن فایل، و <size> اندازهٔ محدوده برای ردگیری است.
فیلترهای 'start' و 'stop' نیازی به تعیین <size> ندارند.
اگر هیچ فایل شیئی مشخص نشده باشد، هسته پیش‌فرض فرض می‌شود، که در این حالت
نشانی شروع باید یک نشانی معتبر از حافظهٔ جاری هسته باشد.
همچنین <start> می‌تواند با مشخص کردن نام یک نماد (symbol) تعیین شود. اگر
نام نماد یکتا نباشد، می‌توان با درج #n رفع ابهام کرد؛ جایی که 'n'
نماد n-اُم را به ترتیب نشانی انتخاب می‌کند. به‌طور متناوب، #0، #g یا #G
فقط یک نماد سراسری (global) را انتخاب می‌کنند. همچنین <size> می‌تواند با
تعیین نام یک نماد مشخص شود، که در این حالت اندازه تا انتهای آن نماد
محاسبه خواهد شد. برای فیلترهای 'filter' و 'tracestop'،
اگر <size> حذف شده باشد و <start> یک نماد باشد، اندازه تا پایان آن
نماد محاسبه می‌گردد.
اگر <size> حذف شود و <start> برابر با '*' باشد، نقطه شروع و اندازه از
اولین و آخرین نمادها محاسبه خواهند شد، یعنی برای ردگیری کل
فایل.
اگر نام نمادها (یا '*') ارائه شوند، باید با نویسه‌های فاصله
احاطه گردند.
فیلتر ارائه‌شده به هسته لزوماً با آنچه وارد شده است یکسان نیست.
برای مشاهده فیلتری که ارسال شده است، از گزینه -v استفاده کنید.
اگر ناحیه ردگیری در یک نگاشت واحد قرار نداشته باشد، هسته ممکن است
قادر به پیکربندی آن نباشد. رویدادهای MMAP (یا /proc/<pid>/maps) را
می‌توان بررسی کرد تا امکان‌پذیر بودن آن مشخص شود.
فیلترهای چندگانه را می‌توان با فاصله یا کاما از یکدیگر جدا کرد.
•فیلترهای bpf
یک فیلتر BPF می‌تواند به داده‌های نمونه دسترسی داشته باشد و بر اساس
داده‌ها تصمیم‌گیری کند. کاربران برای استفاده از فیلتر BPF باید
نوع نمونه مناسبی را تنظیم کنند. فیلترهای BPF نیازمند دسترسی ریشه (root) هستند.
فیلد داده نمونه می‌تواند با حروف کوچک مشخص شود. فیلترهای چندگانه
را می‌توان با کاما از هم جدا کرد. برای نمونه:
  --filter 'period > 1000, cpu == 1'
یا
  --filter 'mem_op == load || mem_op == store, mem_lvl > l1'
فیلتر نخست تنها نمونه‌هایی با period بزرگ‌تر از 1000 و شماره CPU برابر
با 1 را می‌پذیرد. فیلتر دوم هر یک از عملیات‌های حافظه load و store
را می‌پذیرد، اما سطح حافظه آن باید بالاتر از L1 باشد. از آن‌جا که
فیلدهای mem_op و mem_lvl از data_source (حافظه) می‌آیند، فقط با رویدادهایی
کار می‌کنند که فیلد data_source را مقداردهی کرده باشند.
همچنین کاربر باید جمع‌آوری آن اطلاعات را درخواست کند (در حالت بالا با
گزینه -d). در غیر این صورت، پیام زیر نمایش داده خواهد شد.
$ sudo perf record -e cycles --filter 'mem_op == load'
Error: cycles event does not have PERF_SAMPLE_DATA_SRC
 Hint: please add -d option to perf record.
failed to set filter "BPF" on event cycles with 22 (Invalid argument)
در اصل عبارت فیلتر BPF به این صورت است:
<term> <operator> <value> (("," | "||") <term> <operator> <value>)*
عبارت <term> می‌تواند یکی از موارد زیر باشد:
  ip, id, tid, pid, cpu, time, addr, period, txn, weight, phys_addr,
  code_pgsz, data_pgsz, weight1, weight2, weight3, ins_lat, retire_lat,
  p_stage_cyc, mem_op, mem_lvl, mem_snoop, mem_remote, mem_lock,
  mem_dtlb, mem_blk, mem_hops, uid, gid
عملگر <operator> می‌تواند یکی از عملگرهای زیر باشد:
  ==, !=, >, >=, <, <=, &
مقدار <value> می‌تواند یکی از موارد زیر باشد:
  <number> (برای هر عبارت)
  na, load, store, pfetch, exec (برای mem_op)
  l1, l2, l3, l4, cxl, io, any_cache, lfb, ram, pmem (برای mem_lvl)
  na, none, hit, miss, hitm, fwd, peer (برای mem_snoop)
  remote (برای mem_remote)
  na, locked (برای mem_locked)
  na, l1_hit, l1_miss, l2_hit, l2_miss, any_hit, any_miss, walk, fault (برای mem_dtlb)
  na, by_data, by_addr (برای mem_blk)
  hops0, hops1, hops2, hops3 (برای mem_hops)

--exclude-perf

رویدادهای صادرشده توسط خود perf را ضبط نمی‌کند. این گزینه باید بعد از یک انتخاب‌گر رویداد (-e) بیاید که رویداد(های) نقطهٔ ردیابی (tracepoint) را انتخاب می‌کند. این گزینه عبارت فیلتر common_pid != $PERFPID را به فیلترها اضافه می‌کند. اگر --filter دیگری وجود داشته باشد، عبارت فیلتر جدید با استفاده از && با آن‌ها ترکیب خواهد شد.

--latency

جمع‌آوری داده برای پروفایل‌سازی تأخیر (latency) را فعال می‌کند. برای پروفایل مبتنی بر تأخیر از perf report --latency استفاده کنید.

-a, --all-cpus

جمع‌آوری در سطح کل سیستم از تمام CPUها (پیش‌فرض در صورتی که هیچ هدفی مشخص نشده باشد).

-p, --pid=

ضبط رویدادها روی شناسه فرایند (PID) موجود (فهرست جداشده با کاما).

-t, --tid=

ضبط رویدادها روی شناسه نخ (TID) موجود (فهرست جداشده با کاما). این گزینه همچنین توارث را به‌طور پیش‌فرض غیرفعال می‌کند. با افزودن --inherit آن را فعال کنید.

-u, --uid=

ضبط رویدادها در نخ‌های متعلق به uid. نام یا شماره شناسه.

-r, --realtime=

جمع‌آوری داده با این اولویت بیدرنگ (RT) SCHED_FIFO.

--no-buffering

جمع‌آوری داده بدون بافرسازی.

-c, --count=

دوره تناوب رویداد برای نمونه‌برداری.

-o, --output=

نام فایل خروجی.

-i, --no-inherit

تسک‌های فرزند شمارنده‌ها را به ارث نمی‌برند.

-F, --freq=

پروفایل‌سازی در این بسامد (فرکانس). برای استفاده از حداکثر فرکانس مجاز فعلی، یعنی مقداری که در sysctl به نشانی kernel.perf_event_max_sample_rate قرار دارد، از max استفاده کنید. نرخ نمونه‌برداری تا حداکثر فرکانس مجاز فعلی تعدیل (throttle) می‌شود. گزینه --strict-freq را ببینید.

--strict-freq

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

-m, --mmap-pages=

تعداد صفحات داده mmap (باید توانی از دو باشد) یا تعیین اندازه بر حسب بایت به همراه نویسه واحد پیوست‌شده - B/K/M/G. اندازه به نزدیک‌ترین مقدار صفحه از توان‌های دو به بالا گرد می‌شود. با افزودن یک کاما، می‌توان یک پارامتر اضافی با همان معنای به‌کاررفته برای نواحی mmap معمولی را برای ناحیه ردیابی AUX مشخص کرد.

-g

ضبط گراف فراخوانی (زنجیره پشته/backtrace) را هم برای فضای هسته و هم برای فضای کاربر فعال می‌کند.

--call-graph

راه‌اندازی و فعال‌سازی ضبط گراف فراخوانی (زنجیره پشته/backtrace)؛ متضمن گزینه -g است. مقدار پیش‌فرض "fp" است (برای فضای کاربر).
روش بازپیچی (unwinding) مورد استفاده برای فضای هسته وابسته به
unwinder استفاده‌شده در پیکربندی فعال هسته است، یعنی
CONFIG_UNWINDER_FRAME_POINTER (fp) یا CONFIG_UNWINDER_ORC (orc)
هر گزینه‌ای که در اینجا مشخص شود، روش مورد استفاده برای فضای کاربر را تعیین می‌کند.
گزینه‌های معتبر عبارتند از "fp" (اشاره‌گر فریم / frame pointer)، "dwarf" (اطلاعات
فریم فراخوانی DWARF's CFI - Call Frame Information) یا "lbr" (امکان سخت‌افزاری
Last Branch Record).
در برخی سیستم‌ها که باینری‌ها با --fomit-frame-pointer مربوط به gcc کامپایل
شده‌اند، استفاده از روش "fp" گراف‌های فراخوانی نامعتبر تولید می‌کند؛ در این صورت
اگر "dwarf" در دسترس باشد (ابزارهای perf به کتابخانه libunwind یا libdw
پیوند داده شده باشند)، باید از آن استفاده شود.
استفاده از روش "lbr" نیازی به گزینه‌های کامپایلر ندارد. این روش گراف‌های
فراخوانی را از طریق ثبات‌های سخت‌افزاری LBR تولید می‌کند. محدودیت اصلی آن این است
که فقط روی پلتفرم‌های جدیدتر اینتل مانند Haswell در دسترس است. این روش فقط
می‌تواند زنجیره فراخوانی کاربر را به دست آورد و به‌طور همزمان با نمونه‌برداری
پشته شاخه کار نمی‌کند.
هنگامی که ضبط "dwarf" استفاده می‌شود، perf در زمان نمونه‌برداری رونوشت پشته
(کاربر) را نیز ثبت می‌کند. اندازه پیش‌فرض رونوشت پشته ۸۱۹۲ (بایت) است.
کاربر می‌تواند اندازه را با افزودن آن پس از کاما تغییر دهد، مانند
"--call-graph dwarf,4096".
هنگامی که ضبط "fp" استفاده می‌شود، perf به‌طور پیش‌فرض تلاش می‌کند مدخل‌های پشته
را تا سقف تعداد مشخص‌شده در sysctl.kernel.perf_event_max_stack ذخیره کند.
کاربر می‌تواند این تعداد را با ارسال آن پس از کاما تغییر دهد، مانند
"--call-graph fp,32".
همچنین می‌توان از "defer" به همراه "fp" (مانند "--call-graph fp,defer") برای
فعال‌سازی callchain معوق کاربر استفاده کرد که هنگام بازگشت ریسه به
فضای کاربر، callchainهای فضای کاربر را جمع‌آوری خواهد کرد.

-q, --quiet

هیچ هشدار یا پیامی چاپ نمی‌کند؛ برای اسکریپت‌نویسی مفید است.

-v, --verbose

اطلاعات مفصل‌تری نمایش می‌دهد (نمایش خطاهای باز کردن شمارنده، و غیره).

-s, --stat

تعداد رخدادها را به ازای هر ریسه (per-thread) ضبط می‌کند. از آن به همراه perf report -T برای مشاهده مقادیر استفاده کنید.

-d, --data

آدرس‌های مجازی نمونه را ضبط می‌کند. مستلزم --sample-mem-info و --data-mmap است.

--phys-data

آدرس‌های فیزیکی نمونه را ضبط می‌کند.

--data-page-size

اندازهٔ صفحه دادهٔ مربوط به نشانی داده‌های نمونه‌برداری‌شده را ضبط می‌کند.

--code-page-size

اندازهٔ صفحه نشانی کد (ip) نمونه‌برداری‌شده را ضبط می‌کند

-T, --timestamp

برچسب‌های زمانی نمونه را ضبط می‌کند. برای مثال، از آن همراه با perf report -D برای مشاهدهٔ برچسب‌های زمانی استفاده کنید.

-P, --period

دورهٔ تناوب نمونه (sample period) را ضبط می‌کند.

--sample-cpu

پردازندهٔ (CPU) نمونه را ضبط می‌کند.

--sample-identifier

شناسهٔ نمونه را ضبط می‌کند، یعنی بیت PERF_SAMPLE_IDENTIFIER تنظیم‌شده در عضو sample_type از آرگومان struct perf_event_attr در فراخوانی سیستمی perf_event_open.

--sample-mem-info

اطلاعات منبع دادهٔ نمونه را برای عملیات حافظه ضبط می‌کند. این ویژگی نیازمند پشتیبانی سخت‌افزاری است و ممکن است تنها روی رویدادهای خاصی کار کند. اگر مطمئن نیستید، لطفاً استفاده از perf mem record را به جای آن در نظر بگیرید.

-n, --no-samples

نمونه‌برداری انجام نمی‌دهد.

-R, --raw-samples

رکوردهای خام نمونه را از تمام شمارنده‌های بازشده جمع‌آوری می‌کند (پیش‌فرض برای شمارنده‌های tracepoint).

-C, --cpu

نمونه‌ها را فقط روی فهرست پردازنده‌های ارائه‌شده جمع‌آوری می‌کند. چند پردازنده می‌توانند به صورت فهرستی جداشده با کاما و بدون فاصله ارائه شوند: 0,1. بازه‌های پردازنده با - مشخص می‌شوند: 0-2. در حالت per-thread با حالت وراثت فعال (پیش‌فرض)، نمونه‌ها تنها زمانی ثبت می‌شوند که ریسه روی پردازنده‌های تعیین‌شده اجرا شود. حالت پیش‌فرض، نظارت بر تمام پردازنده‌ها است.

وظایف فضای کاربر می‌توانند بین پردازنده‌ها جابه‌جا شوند، بنابراین هنگام ردیابی پردازنده‌های انتخاب‌شده، یک رویداد صوری (dummy event) برای دنبال کردن رویدادهای جانبی (sideband) برای تمام پردازنده‌ها ایجاد می‌شود.

-B, --no-buildid

شناسه‌های ساخت (build id) باینری‌ها را در فایل‌های perf.data ذخیره نمی‌کند. این کار از پس‌پردازش پس از ضبط صرف‌نظر می‌کند، که گاهی اوقات گام نهایی در فرایند ضبط را به دلیل نیاز به پردازش همه رویدادها در جستجوی رکوردهای mmap طولانی می‌کند. نکته منفی این است که در صورت بازسازی محلی یا ارتقای باینری‌های بار کاریِ استفاده‌شده هنگام ضبط، ممکن است نمادها را اشتباه شناسایی کند، زیرا تنها کلید موجود در این حالت مسیر فایل (pathname) است. همچنین می‌توانید متغیر پیکربندی "record.build-id" را روی 'skip تنظیم کنید تا این رفتار به صورت دائمی اعمال شود.

-N, --no-buildid-cache

حافظه نهان buildid را به‌روزرسانی نمی‌کند. این کار در شرایطی که اطلاعات درون فایل perf.data (شامل buildidها) کافی است، مقداری از سربار را کاهش می‌دهد. همچنین می‌توانید متغیر پیکربندی "record.build-id" را روی no-cache تنظیم کنید تا اثر یکسانی داشته باشد.

-G name,..., --cgroup name,...

تنها درون کانتینر (cgroup) با نام "name" نظارت می‌کند. این گزینه تنها در حالت per-cpu در دسترس است. سیستم‌فایل cgroup باید سوار (mount) شده باشد. تمام ریسه‌های متعلق به کانتینر "name" هنگامی که روی پردازنده‌های تحت نظارت اجرا شوند، پایش می‌شوند. می‌توان چندین cgroup مشخص کرد. هر cgroup به رویداد متناظر اعمال می‌شود، یعنی cgroup اول به رویداد اول، cgroup دوم به رویداد دوم و به همین ترتیب. ارائهٔ یک cgroup خالی (نظارت در تمام زمان) با استفاده از مثلاً -G foo,,bar امکان‌پذیر است. ساختارهای cgroup باید رویدادهای متناظر داشته باشند، یعنی همیشه به رویدادهایی که پیش‌تر در خط فرمان تعریف شده‌اند اشاره می‌کنند. اگر کاربر بخواهد چندین رویداد را برای یک cgroup خاص ردیابی کند، می‌تواند از -e e1 -e e2 -G foo,foo یا صرفاً از -e e1 -e e2 -G foo استفاده کند.

اگر بخواهید برای مثال cycles را هم برای یک cgroup و هم در سطح کل سیستم نظارت کنید، این خط فرمان می‌تواند استفاده شود: perf stat -e cycles -G cgroup_name -a -e cycles.

-b, --branch-any

نمونه‌برداری پشتهٔ انشعاب‌های طی‌شده (taken branch stack) را فعال می‌کند. هر نوع انشعاب طی‌شده‌ای ممکن است نمونه‌برداری شود. این یک میانبر برای --branch-filter any است. برای اطلاعات بیشتر --branch-filter را ببینید.

-j, --branch-filter

نمونه‌برداری پشتهٔ انشعاب‌های طی‌شده را فعال می‌کند. هر نمونه یک سری از انشعاب‌های طی‌شدهٔ متوالی را ثبت می‌کند. تعداد انشعاب‌های ثبت‌شده با هر نمونه به سخت‌افزار زیرین، نوع انشعاب‌های مورد نظر و کد اجراشده بستگی دارد. انتخاب انواع انشعاب‌های ثبت‌شده با فعال‌سازی فیلترها امکان‌پذیر است. فیلترهای زیر تعریف شده‌اند:
•any: هر نوع انشعاب
•any_call: هرگونه فراخوانی تابع یا فراخوانی سیستمی
•any_ret: هرگونه بازگشت از تابع یا بازگشت از فراخوانی سیستمی
•ind_call: هرگونه انشعاب غیرمستقیم
•ind_jmp: هرگونه پرش غیرمستقیم
•call: فراخوانی‌های مستقیم، شامل فراخوانی‌های دور (far) (به/از هسته)
•u: فقط زمانی که مقصد انشعاب در سطح کاربر باشد
•k: فقط زمانی که مقصد انشعاب در هسته باشد
•hv: فقط زمانی که مقصد در سطح هایپروایزر باشد
•in_tx: فقط زمانی که مقصد در یک تراکنش سخت‌افزاری باشد
•no_tx: فقط زمانی که مقصد در یک تراکنش سخت‌افزاری نباشد
•abort_tx: فقط زمانی که مقصد، لغو یک تراکنش سخت‌افزاری باشد
•cond: انشعاب‌های شرطی
•stack: ذخیره پشته فراخوانی
•no_flags: عدم ذخیره پرچم‌های انشعاب، مانند پیش‌بینی، پیش‌بینی نادرست و غیره
•no_cycles: عدم ذخیره چرخه‌های انشعاب
•hw_index: ذخیره نمایه سخت‌افزاری انشعاب
•save_type: ذخیره نوع انشعاب در حین نمونه‌برداری در صورتی که فایل باینری بعداً در دسترس نباشد. برای پلتفرم‌های دارای پشتیبانی از Intel Arch LBR (کلاینت‌های 12th-Gen+ یا سرورهای 4th-Gen Xeon+)، هنگامی که نمونه‌برداری پشته انشعاب‌های طی‌شده فعال باشد، ذخیره نوع انشعاب بدون قید و شرط فعال می‌شود.
•priv: ذخیره وضعیت سطح دسترسی در حین نمونه‌برداری در صورتی که فایل باینری بعداً در دسترس نباشد
•counter: ذخیره رخدادهای رویداد از زمان آخرین ورودی انشعاب. در حال حاضر، این ویژگی تنها توسط پردازنده‌های جدیدتر، مانند پلتفرم‌های Intel Sierra Forest و بعد از آن پشتیبانی می‌شود. در صورت استفاده روی هسته یا پردازنده‌های پشتیبانی‌نشده، صدور خطا مورد انتظار است.

این گزینه حداقل به یکی از انواع انشعاب از میان any، any_call، any_ret، ind_call، cond نیاز دارد. سطوح دسترسی می‌توانند نادیده گرفته شوند، که در این حالت، سطوح دسترسی رویداد مرتبط روی فیلتر انشعاب اعمال می‌شوند. هر دو سطح دسترسی هسته (k) و هایپروایزر (hv) مشروط به داشتن مجوزها هستند. هنگام نمونه‌برداری روی چندین رویداد، نمونه‌برداری پشته انشعاب برای همه رویدادهای نمونه‌برداری فعال می‌شود. نوع انشعاب نمونه‌برداری‌شده برای همه رویدادها یکسان است. فیلترهای مختلف باید به‌صورت یک فهرست جداشده با کاما مشخص شوند: --branch-filter any_ret,u,k توجه داشته باشید که این ویژگی ممکن است روی همه پردازنده‌ها موجود نباشد.

-W, --weight

فعال‌سازی نمونه‌برداری وزن‌دار. یک وزن اضافی به ازای هر نمونه ثبت می‌شود و می‌تواند با کلیدهای مرتب‌سازی weight و local_weight نمایش داده شود. این ویژگی در حال حاضر برای رویدادهای لغو TSX و برخی رویدادهای حافظه در حالت دقیق (precise mode) روی پردازنده‌های جدید Intel کار می‌کند.

--namespaces

ثبت رویدادهای از نوع PERF_RECORD_NAMESPACES. این گزینه کلید مرتب‌سازی cgroup_id را فعال می‌کند. --all-cgroups
رویدادهای از نوع PERF_RECORD_CGROUP را ضبط می‌کند. این گزینه کلید مرتب‌سازی cgroup را فعال می‌کند.

--transaction

پرچم‌های تراکنش را برای رویدادهای مرتبط با تراکنش ضبط می‌کند.

--per-thread

از نگاشت‌های حافظه (mmap) به ازای هر رشته (per-thread) استفاده می‌کند. به‌طور پیش‌فرض نگاشت‌های به ازای هر پردازنده (per-cpu) ایجاد می‌شوند. این گزینه آن رفتار را لغو کرده و از نگاشت‌های به ازای هر رشته استفاده می‌کند. یک اثر جانبی این کار این است که توارث به‌طور خودکار غیرفعال می‌شود. در صورت ترکیب با گزینه‌های -a یا -C، گزینه --per-thread نادیده گرفته شده و یک هشدار نمایش داده می‌شود.

-D, --delay=

پس از شروع برنامه، قبل از اندازه‌گیری به اندازه چند میلی‌ثانیه صبر می‌کند (-1: شروع با رویدادهای غیرفعال)، یا رویدادها را فقط برای بازه‌های مشخص‌شده‌ای از میلی‌ثانیه فعال می‌کند (برای مثال -D 10-20,30-40 یعنی ۱۰ میلی‌ثانیه صبر کن، ۱۰ میلی‌ثانیه فعال کن، ۱۰ میلی‌ثانیه صبر کن، ۱۰ میلی‌ثانیه فعال کن و سپس متوقف شو). توجه داشته باشید که به تأخیر انداختن فعال‌سازی رویدادها برای فیلتر کردن فاز راه‌اندازی اولیه برنامه، که اغلب بسیار متفاوت است، مفید می‌باشد.

-I, --intr-regs

وضعیت ماشین (ثبات‌ها) را هنگام وقفه، یعنی در زمان سرریز شمارنده برای هر نمونه، ثبت می‌کند. فهرست ثبات‌های ثبت‌شده به معماری بستگی دارد. این گزینه به‌طور پیش‌فرض غیرفعال است. می‌توان ثبات‌ها را جهت نمونه‌برداری با استفاده از نام‌های نمادین آن‌ها انتخاب کرد، مثلاً در x86،‏ ax،‏ si. برای فهرست کردن ثبات‌های موجود از --intr-regs=\? استفاده کنید. برای مشخص کردن نام ثبات‌ها، یک فهرست جداشده با کاما مانند --intr-regs=ax,bx ارائه دهید. فهرست ثبات‌ها وابسته به معماری است.

--user-regs

مشابه -I است، اما ثبات‌های فضای کاربری را در زمان نمونه‌برداری ثبت می‌کند. برای فهرست کردن ثبات‌های کاربری موجود از --user-regs=\? استفاده کنید.

--running-time

زمان اجرا و زمان فعال بودن را برای رویدادهای خواندن (:S) ضبط می‌کند.

-k, --clockid

شناسه ساعت (clock id) را برای استفاده در فیلدهای زمانی گوناگون در رکوردهای perf_event_type تنظیم می‌کند. به clock_gettime() مراجعه کنید. به‌ویژه CLOCK_MONOTONIC و CLOCK_MONOTONIC_RAW پشتیبانی می‌شوند؛ برخی رویدادها همچنین ممکن است اجازه استفاده از CLOCK_BOOTTIME، CLOCK_REALTIME و CLOCK_TAI را بدهند.

-S, --snapshot

حالت تصویر لحظه‌ای (Snapshot Mode) ردگیری ناحیه AUX را انتخاب می‌کند. این گزینه فقط همراه با یک رویداد ردگیری ناحیه AUX معتبر است. در صورت تمایل، پارامترهای مشخصی برای گرفتن تصویر لحظه‌ای را می‌توان در رشته‌ای که پس از این گزینه می‌آید تعیین کرد:
•e: گرفتن یک تصویر لحظه‌ای نهایی هنگام خروج؛ تضمین می‌کند که حداقل یک تصویر لحظه‌ای در فایل خروجی وجود دارد؛
•<size>: در صورتی که PMU از آن پشتیبانی کند، اندازه تصویر لحظه‌ای مورد نظر را تعیین می‌کند.

در Snapshot Mode داده‌های ردگیری تنها زمانی ثبت می‌شوند که سیگنال SIGUSR2 دریافت شود و در صورت تعیین گزینه e فوق، هنگام خروج نیز ثبت صورت می‌گیرد.

--aux-sample[=OPTIONS]

نمونه‌برداری از ناحیه AUX را انتخاب می‌کند. حداقل یکی از رویدادهای انتخاب‌شده توسط گزینه -e باید یک رویداد ناحیه AUX باشد. نمونه‌هایی روی سایر رویدادها ایجاد خواهند شد که حاوی داده‌های حاصل از ناحیه AUX هستند. اندازه نمونه را می‌توان به‌صورت اختیاری مشخص کرد، در غیر این صورت مقدار پیش‌فرض آن 4KiB است.

--proc-map-timeout

هنگام پردازش /proc/XXX/mmap برای رشته‌های از پیش موجود، ممکن است زمان زیادی طول بکشد، زیرا ممکن است این فایل بسیار حجیم باشد. در چنین مواردی به یک محدودیت زمانی (timeout) نیاز است. این گزینه حد وقفه زمانی را تعیین می‌کند. مقدار پیش‌فرض ۵۰۰ میلی‌ثانیه است.

--switch-events

رویدادهای تعویض زمینه (context switch) را ضبط می‌کند، یعنی رویدادهایی از نوع PERF_RECORD_SWITCH یا PERF_RECORD_SWITCH_CPU_WIDE. در برخی موارد (مانند Intel PT،‏ CoreSight یا Arm SPE) رویدادهای تعویض به‌طور خودکار فعال می‌شوند، که می‌توان با گزینه --no-switch-events از آن جلوگیری کرد.

--vmlinux=PATH

مسیر vmlinux حاوی اطلاعات اشکال‌زدایی (debuginfo) را مشخص می‌کند. (زمانی فعال است که BPF prologue روشن باشد)

--buildid-all

شناسه ساخت (build-id) تمام DSOها را بدون توجه به این‌که واقعاً فراخوانی/استفاده شده‌اند یا خیر ضبط می‌کند.

--buildid-mmap

گزینه موروثی ضبط build-id در رویدادهای نگاشت (map events) که اکنون پیش‌فرض است. رفتاری کاملاً یکسان با --no-buildid دارد. با --no-buildid-mmap غیرفعال می‌شود.

--aio[=n]

از <n> بلوک کنترل در حالت نوشتن ناهمگام ردگیری (Posix AIO) استفاده می‌کند (پیش‌فرض: ۱، حداکثر: ۴). حالت ناهمگام تنها در صورتی پشتیبانی می‌شود که ابزار Perf با کتابخانه libc پیوند داده شده باشد که پیاده‌سازی API مربوط به Posix AIO را ارائه می‌دهد.

--affinity=mode

ماسک وابستگی (affinity mask) رشته خواننده ردگیری را بر اساس سیاست تعیین‌شده توسط مقدار mode تنظیم می‌کند:
•node - ماسک وابستگی رشته روی ماسک پردازنده گره NUMA مربوط به بافر mmap در حال پردازش تنظیم می‌شود
•cpu - ماسک وابستگی رشته روی پردازنده بافر mmap در حال پردازش تنظیم می‌شود

--mmap-flush=number

حداقل تعداد بایت‌هایی را که از صفحات داده mmap استخراج شده و برای خروجی پردازش می‌شوند مشخص می‌کند. می‌توان این تعداد را با پسوندهای B/K/M/G مشخص کرد.

حداکثر مقدار مجاز، یک‌چهارم اندازه صفحات داده mmap شده است.

مقدار پیش‌فرض این گزینه ۱ بایت است، به این معنی که هر بار رشته نویسنده خروجی داده‌های جدیدی در بافر mmap شده پیدا کند، داده‌ها استخراج شده، احتمالاً فشرده می‌شوند (-z) و در خروجی، perf.data یا لوله (pipe) نوشته می‌شوند.

تکه‌های داده بزرگ‌تر در مقایسه با تکه‌های کوچک‌تر به‌طور موثرتری فشرده می‌شوند، بنابراین استخراج تکه‌های بزرگ‌تر از صفحات داده mmap از دیدگاه کاهش اندازه خروجی ترجیح داده می‌شود.

همچنین در برخی موارد اجرای تعداد کمتری فراخوان سیستمی (syscall) نوشتن خروجی با اندازه داده بزرگ‌تر می‌تواند زمان کمتری نسبت به اجرای تعداد بیشتری فراخوان سیستمی نوشتن با اندازه داده کوچک‌تر ببرد و در نتیجه بار اضافی (overhead) پروفایل‌سازی در زمان اجرا را کاهش دهد.

-z, --compression-level[=n]

ردگیری فشرده‌شده را با استفاده از سطح مشخص‌شده n تولید می‌کند (پیش‌فرض: ۱ - سریع‌ترین فشرده‌سازی، ۲۲ - کم‌حجم‌ترین ردگیری)

--all-kernel

تمام رویدادهای استفاده‌شده را برای اجرا در فضای هسته (kernel space) پیکربندی می‌کند.

--all-user

تمام رویدادهای استفاده‌شده را برای اجرا در فضای کاربری (user space) پیکربندی می‌کند.

--kernel-callchains

زنجیره‌های فراخوانی (callchain) را فقط از فضای هسته جمع‌آوری می‌کند؛ یعنی این گزینه perf_event_attr.exclude_callchain_user را روی ۱ قرار می‌دهد.

--user-callchains

زنجیره‌های فراخوانی را فقط از فضای کاربری جمع‌آوری می‌کند؛ یعنی این گزینه perf_event_attr.exclude_callchain_kernel را روی ۱ قرار می‌دهد.

از هر دو گزینه --kernel-callchains و --user-callchains به‌طور هم‌زمان استفاده نکنید، در غیر این صورت هیچ زنجیره فراخوانی جمع‌آوری نخواهد شد.

--timestamp-filename برچسب زمان (timestamp) را به نام فایل خروجی اضافه می‌کند.

--timestamp-boundary

مرز برچسب زمان (زمان اولین/آخرین نمونه‌ها) را ضبط می‌کند. --switch-output[=mode]
تولید چندین فایل perf.data، دارای پیشوند برچسب زمانی، با جابه‌جایی به یک فایل جدید بر اساس مقدار mode:
•"signal" - هنگام دریافت یک SIGUSR2 (مقدار پیش‌فرض) یا
•<size> - هنگام رسیدن به آستانه اندازه؛ انتظار می‌رود اندازه، عددی همراه با نویسه واحد متصل باشد - B/K/M/G
•<time> - هنگام رسیدن به آستانه زمانی؛ انتظار می‌رود مقدار، عددی همراه با نویسه واحد متصل باشد - s/m/h/d
نکته: دقت آستانه اندازه تا حد زیادی به پیکربندی شما بستگی دارد
- تعداد و اندازه بافرهای حلقه‌ای شما (-m). این مقدار معمولاً
برای اندازه‌های بزرگ‌تر (مانند >5M) دقیق‌تر است؛ برای مقادیر
کمتر انتظار اندازه‌های متفاوتی را داشته باشید.

یک کاربرد احتمالی این است که با وقوع یک رویداد بیرونی، فایل perf.data را که سپس احتمالاً از طریق perf script پردازش می‌شود، تکه‌تکه کنید تا تصمیم بگیرید آیا آن تصویر لحظه‌ای (snapshot) خاص از perf.data باید نگه‌داری شود یا خیر.

مستلزم --timestamp-filename، --no-buildid و --no-buildid-cache است. دلیل دو مورد آخر کاهش سربار جابه‌جایی فایل داده است. با این حال می‌توانید آن‌ها را با دستور زیر فعال کنید:

--switch-output --no-no-buildid  --no-no-buildid-cache

--switch-output-event

رویدادهایی که باعث جابه‌جایی فایل perf.data می‌شوند، با انتخاب خودکار --switch-output=signal؛ نتایج مشابه هستند چرا که در درون برنامه نیز ریسه جانبی (sideband thread) یک SIGUSR2 به ریسه اصلی ارسال می‌کند.

از همان نحو --event استفاده می‌کند؛ این رویداد ضبط نخواهد شد و صرفاً به منظور جابه‌جایی فایل perf.data به محض پردازش رویداد --switch-output توسط یک ریسه جانبی مجزا به کار می‌رود.

این ریسه جانبی برای اهداف دیگری نیز استفاده می‌شود، مانند پردازش رکوردهای PERF_RECORD_BPF_EVENT به محض وقوع، استعلام اطلاعات تکمیلی BPF از هسته و غیره.

--switch-max-files=N

هنگام چرخش فایل‌های perf.data با --switch-output، فقط N فایل را نگه‌داری کن.

--dry-run

گزینه‌ها را تجزیه کرده و سپس خارج شو. از --dry-run می‌توان برای شناسایی خطاهای موجود در گزینه‌های خط فرمان استفاده کرد.

دستور perf record --dry-run -e در صورتی که llvm.dump-obj در فایل پیکربندی روی true تنظیم شده باشد، می‌تواند مانند یک کامپایلر اسکریپت BPF عمل کند.

--synth=TYPE

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

رویدادهای هسته (و برخی موارد دیگر) صرف‌نظر از انتخاب این گزینه ثبت می‌شوند. برای مثال، --synth=no رویدادهای MMAP را برای هسته و ماژول‌ها در بر خواهد داشت.

انواع موجود عبارتند از:

•task - سنتز رویدادهای FORK و COMM برای هر وظیفه
•mmap - سنتز رویدادهای MMAP برای هر فرآیند (مستلزم task)
•cgroup - سنتز رویدادهای CGROUP برای هر cgroup
•all - سنتز همه رویدادها (پیش‌فرض)
•no - هیچ‌یک از رویدادهای بالا سنتز نشوند

--tail-synthesize

به جای جمع‌آوری رویدادهای غیرنمونه‌ای (مانند fork، comm، mmap) در ابتدای ضبط، آن‌ها را در حین نهایی‌سازی فایل خروجی جمع‌آوری کن. رویدادهای غیرنمونه‌ای جمع‌آوری‌شده، وضعیت سیستم را در زمان پایان ضبط بازتاب می‌دهند.

--overwrite

باعث می‌شود همه رویدادها از یک بافر حلقه‌ای با قابلیت بازنویسی استفاده کنند. یک بافر حلقه‌ای با قابلیت بازنویسی مانند یک جعبه سیاه پرواز (flight recorder) عمل می‌کند: هنگامی که پر می‌شود، هسته قدیمی‌ترین رکوردها را بازنویسی می‌کند و بدین ترتیب آن‌ها هرگز وارد فایل perf.data نخواهند شد.

هنگامی که --overwrite و --switch-output استفاده شوند، perf رویدادها را ضبط کرده و دور می‌ریزد تا زمانی که سیگنالی دریافت کند؛ به این معنی که رویدادی غیرعادی شناسایی شده که گرفتن یک تصویر لحظه‌ای (snapshot) از جدیدترین رویدادها — رویدادهایی که در آن لحظه در بافر حلقه‌ای جای می‌گیرند — را توجیه می‌کند.

ویژگی overwrite همچنین می‌تواند برای یک رویداد با استفاده از عبارات پیکربندی تنظیم یا لغو شود. برای مثال: cycles/overwrite/ و instructions/no-overwrite/.

مستلزم --tail-synthesize است.

--kcore

یک رونوشت از /proc/kcore تهیه کرده و آن را در پوشه‌ای به همراه فایل داده perf قرار بده.

--max-size=<size>

بیشینه اندازه داده‌های نمونه را محدود کن؛ انتظار می‌رود <size> عددی با نویسه واحد متصل باشد - B/K/M/G --num-thread-synthesize
تعداد نخ‌ها برای اجرا هنگام ترکیب‌سازی رویدادها برای فرایندهای موجود. به‌طور پیش‌فرض، تعداد نخ‌ها برابر با 1 است.

--pfm-events events

انتخاب یک رویداد PMU با استفاده از نحو libpfm4 (ببینید http://perfmon2.sf.net) شامل پشتیبانی از پالایه‌های رویداد. برای مثال --pfm-events inst_retired:any_p:u:c=1:i. با استفاده از جداکننده کاما می‌توان بیش از یک رویداد را به گزینه ارسال کرد. رویدادهای سخت‌افزاری و رویدادهای سخت‌افزاری عمومی را نمی‌توان با هم ترکیب کرد. مورد دوم باید با گزینه -e استفاده شود. گزینه -e و این گزینه می‌توانند با هم ترکیب و استفاده شوند. رویدادها را می‌توان با استفاده از نشانه‌گذاری {} گروه‌بندی کرد.

--control=fifo:ctl-fifo[,ack-fifo], --control=fd:ctl-fd[,ack-fd]

ctl-fifo / ack-fifo باز شده و به عنوان ctl-fd / ack-fd به شرح زیر استفاده می‌شوند. برای فرمان کنترل اندازه‌گیری، روی توصیف‌گر ctl-fd گوش می‌دهد.

دستورهای موجود:

•enable : فعال‌سازی رویدادها
•disable : غیرفعال‌سازی رویدادها
•enable name : فعال‌سازی رویداد name
•disable name : غیرفعال‌سازی رویداد name
•snapshot : تصویر لحظه‌ای ردگیری ناحیه AUX).
•stop : متوقف کردن perf record
•ping : پینگ
•'evlist [-v|-g|-F] : نمایش همه رویدادها
-F  نمایش تنها بسامد نمونه‌برداری استفاده‌شده برای هر رویداد.
-v  نمایش همه فیلدها.
-g  نمایش اطلاعات گروه رویداد.

اندازه‌گیری‌ها را می‌توان با استفاده از گزینه --delay=-1 در وضعیتی که رویدادها غیرفعال هستند آغاز کرد. به عنوان یک امکان اختیاری، تکمیل فرمان کنترل (ack\n) را به توصیف‌گر ack-fd ارسال کنید تا با فرایند کنترل‌کننده همگام‌سازی شود. مثالی از اسکریپت شل bash برای فعال و غیرفعال کردن رویدادها در حین اندازه‌گیری:

#!/bin/bash
ctl_dir=/tmp/
ctl_fifo=${ctl_dir}perf_ctl.fifo
test -p ${ctl_fifo} && unlink ${ctl_fifo}
mkfifo ${ctl_fifo}
exec {ctl_fd}<>${ctl_fifo}
ctl_ack_fifo=${ctl_dir}perf_ctl_ack.fifo
test -p ${ctl_ack_fifo} && unlink ${ctl_ack_fifo}
mkfifo ${ctl_ack_fifo}
exec {ctl_fd_ack}<>${ctl_ack_fifo}
perf record -D -1 -e cpu-cycles -a \
--control fd:${ctl_fd},${ctl_fd_ack} \
-- sleep 30 & perf_pid=$!
sleep 5  && echo 'enable' >&${ctl_fd} && read -u ${ctl_fd_ack} e1 && echo "enabled(${e1})"
sleep 10 && echo 'disable' >&${ctl_fd} && read -u ${ctl_fd_ack} d1 && echo "disabled(${d1})"
exec {ctl_fd_ack}>&-
unlink ${ctl_ack_fifo}
exec {ctl_fd}>&-
unlink ${ctl_fifo}
wait -n ${perf_pid}
exit $?

--threads=<spec>

نوشتن داده‌های ردگیری جمع‌آوری‌شده در چندین فایل داده با استفاده از رشته‌های موازی. مقدار <spec> می‌تواند فهرستی از ماسک‌های تعریف‌شده توسط کاربر باشد. ماسک‌هایی که با دونقطه از یکدیگر جدا شده‌اند پردازنده‌هایی (CPUs) را مشخص می‌کنند که باید توسط یک رشته پایش شوند و ماسک وابستگی (affinity mask) آن رشته با اسلش جدا می‌شود:
<cpus mask 1>/<affinity mask 1>:<cpus mask 2>/<affinity mask 2>:...

پردازنده‌ها (CPUs) یا ماسک‌های وابستگی نباید با دیگر ماسک‌های متناظر همپوشانی داشته باشند. پردازنده‌های نامعتبر نادیده گرفته می‌شوند، اما ماسک‌هایی که فقط شامل پردازنده‌های نامعتبر باشند مجاز نیستند.

برای نمونه، مشخصه‌ای از طرف کاربر مانند زیر:

0,2-4/2-4:1,5-7/5-7

طرح‌بندی رشته‌های موازی متشکل از دو رشته را مشخص می‌کند؛ رشتهٔ نخست پردازنده‌های 0 و 2-4 را با ماسک وابستگی 2-4 پایش می‌کند و رشتهٔ دوم پردازنده‌های 1 و 5-7 را با ماسک وابستگی 5-7 پایش می‌کند.

مقدار <spec> همچنین می‌تواند رشته‌ای به معنای طرح‌بندی رشته‌های موازی از پیش تعریف‌شده باشد:

•cpu - ایجاد رشتهٔ جاری‌سازی دادهٔ جدید برای هر cpu پایش‌شده
•core - ایجاد رشته‌ای جدید برای پایش پردازنده‌های گروه‌بندی‌شده بر مبنای یک هسته
•package - ایجاد رشته‌ای جدید برای پایش پردازنده‌های گروه‌بندی‌شده بر مبنای یک بسته (package)
•numa - ایجاد رشته‌ای جدید برای پایش پردازنده‌های گروه‌بندی‌شده بر مبنای یک دامنهٔ NUMA

می‌توان از طرح‌بندی‌های از پیش‌تعریف‌شده در سامانه‌هایی با تعداد زیادی پردازنده استفاده کرد تا بدون ایجاد چندین رشتهٔ جاری‌سازی به‌ازای هر cpu، همچنان از بروز رویدادهای از دست رفته (LOST events) در فایل‌های دایرکتوری داده جلوگیری شود. مشخص کردن این گزینه بدون مقدار یا با مقدار خالی، به‌طور پیش‌فرض از طرح‌بندی CPU استفاده می‌کند. ماسک‌های تعریف‌شده یا مشخص‌شده توسط مقدار گزینه، از طریق ماسک ارائه‌شده با گزینهٔ -C فیلتر می‌شوند.

--debuginfod[=URLs]

مشخص کردن URL سرور debuginfod جهت استفاده هنگام ذخیره در حافظهٔ پنهان باینری‌های perf.data؛ این مقدار از همان نحو متغیر DEBUGINFOD_URLS پیروی می‌کند، مانند:
اگر URLs مشخص نشود، از مقدار متغیر محیطی سامانه‌ای
DEBUGINFOD_URLS استفاده می‌شود.

--off-cpu

فعال‌سازی پروفایل‌سازی off-cpu با BPF. برنامهٔ BPF اطلاعات زمان‌بندی وظایف را همراه با رد پشتهٔ (user) جمع‌آوری کرده و آن‌ها را به‌عنوان داده‌های نمونه از یک رویداد نرم‌افزاری به نام "offcpu-time" ذخیره می‌کند. دورهٔ نمونه‌برداری شامل مدت‌زمانی خواهد بود که وظیفه به نانوثانیه در خواب بوده است.
توجه داشته باشید که در حال حاضر BPF فقط می‌تواند با استفاده از
اشاره‌گر فریم ("fp") رد پشته را جمع‌آوری کند. بنابراین برنامه‌های ساخته‌شده
بدون اشاره‌گر فریم ممکن است نشانی‌های ساختگی ببینند.
پروفایل‌سازی off-cpu از دو نوع نمونه تشکیل شده است: نمونه‌های مستقیم، که
رفتار یکسانی با نمونه‌های عادی دارند، و نمونه‌های انباشته‌شده، ذخیره‌شده
در نگاشت رد پشتهٔ BPF، که پس از تمام نمونه‌های عادی ارائه می‌شوند.
--off-cpu-thresh
هنگامی که زمان off-cpu یک وظیفه به این آستانه (به میلی‌ثانیه) برسد، یک نمونهٔ مستقیم off-cpu تولید می‌کند. مقدار پیش‌فرض 500ms است.

--setup-filter=<action>

آماده‌سازی فیلتر BPF برای استفاده توسط کاربران عادی. مقدار action باید یا "pin" یا "unpin" باشد. این فیلتر پس از سنجاق شدن (pinned) قابل استفاده خواهد بود.

--data-mmap

فعال‌سازی ضبط رویدادهای MMAP برای نگاشت‌های غیرقابل‌اجرا (non-executable). در اصل perf تنها نگاشت‌های قابل‌اجرا را ضبط می‌کند، اما mmap کردن داده‌ها می‌تواند هنگام تحلیل دسترسی به داده‌ها با آدرس‌های نمونه مفید باشد. بنابراین استفاده از گزینهٔ -d این قابلیت را فعال می‌کند مگر اینکه --no-data-mmap را به‌طور دستی مشخص کنید.

پشتیبانی از رویدادهای ترکیبی Intel در ابزارهای perf.

برای برخی از پلتفرم‌های Intel، مانند AlderLake، که یک پلتفرم ترکیبی (hybrid) است و از پردازنده‌های atom و پردازنده‌های core تشکیل شده است. هر پردازنده دارای فهرست رویدادهای اختصاصی است. بخشی از رویدادها روی پردازندهٔ core، بخشی روی پردازندهٔ atom و حتی بخشی از رویدادها روی هر دو پردازنده در دسترس هستند.

هسته دو cpu pmu جدید را از طریق sysfs صادر (export) می‌کند: /sys/bus/event_source/devices/cpu_core /sys/bus/event_source/devices/cpu_atom

فایل‌های cpus در زیر این دایرکتوری‌ها ایجاد می‌شوند. برای مثال:

cat /sys/bus/event_source/devices/cpu_core/cpus 0-15

cat /sys/bus/event_source/devices/cpu_atom/cpus 16-23

این نشان می‌دهد که cpu0-cpu15 پردازنده‌های core و cpu16-cpu23 پردازنده‌های atom هستند.

همانند گذشته، از perf-list برای فهرست کردن رویدادهای نمادین استفاده کنید.

perf list

inst_retired.any [Fixed Counter: Counts the number of instructions retired. Unit: cpu_atom] inst_retired.any [Number of instructions retired. Fixed Counter - architectural event. Unit: cpu_core]

عبارت Unit: xxx به توضیحات مختصر اضافه شده است تا نشان دهد رویداد متعلق به کدام pmu است. نام رویداد یکسان اما با pmu متفاوت پشتیبانی می‌شود.

فعال‌سازی رویداد ترکیبی با یک pmu مشخص

برای فعال‌سازی رویدادی که صرفاً مربوط به core یا صرفاً مربوط به atom است، نحو زیر پشتیبانی می‌شود:

        cpu_core/<event name>/
or
        cpu_atom/<event name>/

برای مثال، شمارش رویداد cycles روی پردازنده‌های core:

perf stat -e cpu_core/cycles/

ایجاد خودکار دو رویداد برای یک رویداد سخت‌افزاری

هنگام ایجاد یک رویداد، چنانچه آن رویداد هم روی atom و هم روی core موجود باشد، دو رویداد به طور خودکار ایجاد می‌شوند؛ یکی برای atom و دیگری برای core. بیشتر رویدادهای سخت‌افزاری و رویدادهای کَش (cache) روی هر دو cpu_core و cpu_atom در دسترس هستند.

رویدادهای سخت‌افزاری دارای پیکربندی‌های از پیش تعریف‌شده هستند (مثلاً 0 برای cycles). اما در پلتفرم ترکیبی، هسته باید بداند که رویداد از کجا می‌آید (از atom یا از core). نوع اصلی رویداد perf یعنی PERF_TYPE_HARDWARE نمی‌تواند اطلاعات pmu را حمل کند. بنابراین اکنون این نوع گسترش یافته تا به نوع آگاه از PMU تبدیل شود. شناسهٔ نوع PMU در attr.config[63:32] ذخیره می‌شود.

شناسهٔ نوع PMU از sysfs دریافت می‌شود: /sys/bus/event_source/devices/cpu_atom/type /sys/bus/event_source/devices/cpu_core/type

چیدمان جدید attr.config برای PERF_TYPE_HARDWARE:

PERF_TYPE_HARDWARE: 0xEEEEEEEE000000AA AA: hardware event ID EEEEEEEE: PMU type ID

رویداد کَش نیز مشابه است. نوع PERF_TYPE_HW_CACHE به یک نوع آگاه از PMU ارتقا یافته است. شناسهٔ نوع PMU در attr.config[63:32] ذخیره می‌شود.

چیدمان جدید attr.config برای PERF_TYPE_HW_CACHE:

PERF_TYPE_HW_CACHE: 0xEEEEEEEE00DDCCBB BB: hardware cache ID CC: hardware cache op ID DD: hardware cache op result ID EEEEEEEE: PMU type ID

هنگام فعال‌سازی یک رویداد سخت‌افزاری بدون مشخص کردن pmu، مانند perf stat -e cycles -a (در این مثال از حالت سرتاسر سیستم استفاده شده است)، دو رویداد به طور خودکار ایجاد می‌شوند.

------------------------------------------------------------
perf_event_attr:
  size                             120
  config                           0x400000000
  sample_type                      IDENTIFIER
  read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
  disabled                         1
  inherit                          1
  exclude_guest                    1
------------------------------------------------------------

و

------------------------------------------------------------
perf_event_attr:
  size                             120
  config                           0x800000000
  sample_type                      IDENTIFIER
  read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
  disabled                         1
  inherit                          1
  exclude_guest                    1
------------------------------------------------------------

مقدار type 0 برابر با PERF_TYPE_HARDWARE است. مقدار 0x4 در 0x400000000 نشان‌دهندهٔ cpu_core pmu است. مقدار 0x8 در 0x800000000 نشان‌دهندهٔ cpu_atom pmu است (شناسهٔ نوع atom pmu تصادفی است).

هسته رویداد cycles (0x400000000) را روی cpu0-cpu15 (پردازنده‌های core) و رویداد cycles (0x800000000) را روی cpu16-cpu23 (پردازنده‌های atom) ایجاد می‌کند.

برای نتیجهٔ perf-stat، دو رویداد نمایش داده می‌شود:

Performance counter stats for 'system wide':
6,744,979      cpu_core/cycles/
1,965,552      cpu_atom/cycles/

رویداد اول cycles مربوط به core و رویداد دوم cycles مربوط به atom است.

مثال در حالت ریسه (Thread mode):

ابزار perf-stat مقادیر مقیاس‌بندی‌شده (scaled counts) را برای رویدادهای ترکیبی به همراه یک درصد نمایش می‌دهد. این درصد برابر با زمان اجرای رویداد تقسیم بر زمان فعال‌بودن آن است.

یک مثال: triad_loop روی cpu16 (هستهٔ atom) اجرا می‌شود، در حالی که می‌توان دید مقدار مقیاس‌بندی‌شده برای دورهای core برابر با 160,444,092 و درصد آن 0.47% است.

perf stat -e cycles -- taskset -c 16 ./triad_loop

همانند قبل، دو رویداد ایجاد می‌شود.

.ft C
perf_event_attr:
  size                             120
  config                           0x400000000
  sample_type                      IDENTIFIER
  read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
  disabled                         1
  inherit                          1
  enable_on_exec                   1
  exclude_guest                    1
.ft
و
.ft C
perf_event_attr:
  size                             120
  config                           0x800000000
  sample_type                      IDENTIFIER
  read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
  disabled                         1
  inherit                          1
  enable_on_exec                   1
  exclude_guest                    1
.ft
Performance counter stats for 'taskset -c 16 ./triad_loop':
233,066,666      cpu_core/cycles/                                              (0.43%)
604,097,080      cpu_atom/cycles/                                              (99.57%)

perf-record:

اگر -e در perf record مشخص نشده باشد، در پلتفرم‌های ترکیبی (hybrid)، دو رویداد پیش‌فرض cycles ایجاد شده و به فهرست رویدادها افزوده می‌شوند. یکی برای core و دیگری برای atom است.

perf-stat:

اگر -e در perf stat مشخص نشده باشد، در پلتفرم‌های ترکیبی، علاوه بر رویدادهای نرم‌افزاری، رویدادهای زیر به ترتیب ایجاد شده و به فهرست رویدادها افزوده می‌شوند.

cpu_core/cycles/, cpu_atom/cycles/, cpu_core/instructions/, cpu_atom/instructions/, cpu_core/branches/, cpu_atom/branches/, cpu_core/branch-misses/, cpu_atom/branch-misses/

البته، هر دو دستور perf-stat و perf-record از فعال‌سازی رویداد ترکیبی با یک pmu مشخص پشتیبانی می‌کنند.

برای نمونه: perf stat -e cpu_core/cycles/ perf stat -e cpu_atom/cycles/ perf stat -e cpu_core/r1a/ perf stat -e cpu_atom/L1-icache-loads/ perf stat -e cpu_core/cycles/,cpu_atom/instructions/ perf stat -e {cpu_core/cycles/,cpu_core/instructions/}

اما {cpu_core/cycles/,cpu_atom/instructions/} یک هشدار بازمی‌گرداند و گروه‌بندی را غیرفعال می‌کند، زیرا pmuهای موجود در گروه مطابقت ندارند (cpu_core در برابر cpu_atom).

perf-stat(1), perf-list(1), perf-intel-pt(1)

09/04/2026 perf