| PERF-SCRIPT(1) | perf Manual | PERF-SCRIPT(1) |
نام (NAME)
perf-script - خواندن perf.data (ایجادشده توسط perf record) و نمایش خروجی ردگیری (trace)
خلاصه دستور (SYNOPSIS)
perf script [<options>] perf script [<options>] record <script> [<record-options>] <command> perf script [<options>] report <script> [script-args] perf script [<options>] <script> <required-script-args> [<record-options>] <command> perf script [<options>] <top-script> [script-args]
توضیحات (DESCRIPTION)
این دستور فایل ورودی را میخواند و ردگیری (trace) ضبطشده را نمایش میدهد.
چندین حالت مختلف برای perf script وجود دارد:
دستور 'perf script' برای مشاهدهٔ ردگیری تفصیلی بار کاری ضبطشده بهکار میرود.
همچنین میتوانید مجموعهای از اسکریپتهای از پیش آماده را اجرا کنید که دادههای خام ردگیری را به روشهای گوناگون تجمیع و خلاصه میکنند (فهرست اسکریپتها از طریق 'perf script -l' در دسترس است). حالتهای زیر به شما امکان ضبط و اجرای این اسکریپتها را میدهند:
دستور 'perf script record <script> <command>' برای ضبط رویدادهای مورد نیاز برای 'perf script report' بهکار میرود. آرگومان <script> نام نمایشدادهشده در خروجی 'perf script --list' است؛ یعنی نام واقعی اسکریپت منهای هرگونه پسوند زبان برنامهنویسی. اگر <command> مشخص نشود، رویدادها با استفاده از گزینهٔ -a (سراسری در سیستم) در 'perf record' ضبط میشوند.
دستور 'perf script report <script> [args]' برای اجرا و نمایش نتایج <script> بهکار میرود. آرگومان <script> نام نمایشدادهشده در خروجی 'perf script --list' است؛ یعنی نام واقعی اسکریپت منهای هرگونه پسوند زبان برنامهنویسی. خروجی perf.data حاصل از اجرای قبلی 'perf script record <script>' استفاده میشود و برای موفقیتآمیز بودن این دستور باید وجود داشته باشد. آرگومان [args] به آرگومانهای (عمدتاً اختیاری) مورد انتظار اسکریپت اشاره دارد.
دستور 'perf script <script> <required-script-args> <command>' هم برای
ضبط رویدادهای مورد نیاز <script> و هم برای اجرای <script> با استفاده از
حالت زنده ('live-mode')، یعنی بدون نوشتن داده روی دیسک، بهکار میرود.
آرگومان <script> نام نمایشدادهشده در خروجی 'perf script --list' است؛
یعنی نام واقعی اسکریپت منهای هرگونه پسوند زبان برنامهنویسی. اگر <command> مشخص
نشود، رویدادها با استفاده از گزینهٔ -a (سراسری در سیستم) در 'perf record'
ضبط میشوند. اگر <script> آرگومانهای اجباری داشته باشد، باید پیش از <command>
مشخص شوند. این حالت اجازهٔ تعیین آرگومانهای اختیاری اسکریپت را نمیدهد؛ اگر
آرگومانهای اختیاری اسکریپت مورد نیاز باشند، میتوان آنها را با استفاده از دستورهای
جداگانهٔ 'perf script record' و 'perf script report' تعیین کرد،
بهطوری که خروجی استاندارد (stdout) مرحلهٔ record با استفاده از گزینههای '-o -'
و '-i -' در دستورهای متناظر، به ورودی استاندارد (stdin) اسکریپت report
هدایت (pipe) شود.
دستور 'perf script <top-script>' هم برای ضبط رویدادهای مورد نیاز برای
<top-script> و هم برای اجرای <top-script> با استفاده از حالت زنده ('live-mode')،
یعنی بدون نوشتن چیزی روی دیسک، استفاده میشود. آرگومان <top-script> نام
نمایشدادهشده در خروجی 'perf script --list' است؛ یعنی نام واقعی اسکریپت
منهای هرگونه پسوند زبان برنامهنویسی؛ یک <top-script> بهصورت هر اسکریپتی که نام آن
به رشتهٔ 'top' ختم شود تعریف میگردد.
میتوان [<record-options>] را به مراحل ضبط دستور 'perf script record' و
حالتهای 'live-mode' ارسال کرد؛ با این حال، این کار برای حالت زندهٔ
<top-script> ('live-mode') یا حالتهای 'perf script report'
امکانپذیر نیست.
برای پیوندهایی به اطلاعات مختص هر زبان دربارهٔ نحوهٔ نوشتن و اجرای اسکریپتهای ردگیری خود، بخش «همچنین ببینید (SEE ALSO)» را مشاهده کنید.
<command>...
-D, --dump-raw-trace=
--dump-unsorted-raw-trace=
-L, --Latency=
-l, --list=
-s [lang], --script=
-g, --gen-script=
--dlfilter=<file>
--dlarg=<arg>
--list-dlfilters
-a
-i, --input=
-d, --debug-mode
-F, --fields
فهرست فیلدها میتواند با نوع، trace، sw یا hw پیشوندگذاری شود تا مشخص کند فهرست فیلدها به کدام نوع رویداد اعمال میشود. برای نمونه، -F sw:comm,tid,time,ip,sym و -F trace:time,cpu,trace
perf script -F <fields>
معادل است با:
perf script -F trace:<fields> -F sw:<fields> -F hw:<fields>
یعنی در صورتی که رشته نوع مشخص نشود، فیلدهای تعیینشده به همه انواع رویداد اعمال میشوند.
علاوه بر بازنویسی فیلدها، افزودن یا حذف فیلدها از مقادیر پیشفرض نیز امکانپذیر است. برای نمونه:
-F -cpu,+insn
فیلد cpu را حذف و فیلد insn را اضافه میکند. افزودن/حذف فیلدها نمیتواند با بازنویسی عادی ترکیب شود.
آرگومانها به ترتیبی که دریافت میشوند پردازش میگردند. استفاده بعدی میتواند درخواست پیشین را بازنشانی کند؛ مانند:
-F trace: -F comm,tid,time,ip,sym
نخستین -F رویدادهای trace را متوقف میکند (فهرست فیلدها "" است)، اما سپس دومین فراخوانی فیلدها را به comm,tid,time,ip,sym تنظیم میکند. در این حالت هشداری به کاربر داده میشود:
"Overriding previous field request for all events."
بهعنوان روشی دیگر، این ترتیب را در نظر بگیرید:
-F comm,tid,time,ip,sym -F trace:
اولین -F فیلدها را برای تمام رویدادها تنظیم کرده و دومین -F رویدادهای trace را متوقف میسازد. پیامی مبنی بر هشدار بازنویسی به کاربر نمایش داده میشود، و نتیجهٔ موارد فوق این است که تنها رویدادهای S/W و H/W با فیلدهای دادهشده نمایش داده میشوند.
امکان افزودن/حذف فیلدها تنها برای یک نوع رویداد خاص وجود دارد:
-Fsw:-cpu,-period
فیلدهای cpu و period را از رویدادهای نرمافزاری حذف میکند.
برای گزینهٔ 'wildcard' اگر فیلد انتخابشده توسط کاربر برای یک نوع رویداد نامعتبر باشد، پیامی به کاربر نمایش داده میشود مبنی بر اینکه آن گزینه برای آن نوع نادیده گرفته شده است. برای نمونه:
$ perf script -F comm,tid,trace 'trace' not valid for hardware events. Ignoring. 'trace' not valid for software events. Ignoring.
در مقابل، اگر نوع رویداد داده شود و یک فیلد نامعتبر مشخص گردد، یک خطا خواهد بود. برای نمونه:
perf script -v -F sw:comm,tid,trace 'trace' not valid for software events.
در این مرحله نحوهٔ استفاده (راهنما) نمایش داده شده و perf-script خارج میشود.
فیلد flags ساختگی (synthesized) است و ممکن است هنگام رمزگشایی Instruction Trace دارای مقدار باشد. پرچمها "bcrosyiABExghDt" هستند که بهترتیب نمایانگر branch (انشعاب)، call (فراخوانی)، return (بازگشت)، conditional (شرطی)، system (سیستم)، asynchronous (ناهمگام)، interrupt (وقفه)، transaction abort (ابطال تراکنش)، trace begin (شروع ردگیری)، trace end (پایان ردگیری)، in transaction (درون تراکنش)، VM-Entry، VM-Exit، interrupt disabled (وقفه غیرفعال) و interrupt disable toggle (تغییر وضعیت غیرفعالسازی وقفه) هستند. ترکیبهای شناختهشدهٔ پرچمها به شکل خواناتری چاپ میشوند؛ مانند: "call" برای "bc"، "return" برای "br"، "jcc" برای "bo"، "jmp" برای "b"، "int" برای "bci"، "iret" برای "bri"، "syscall" برای "bcs"، "sysret" برای "brs"، "async" برای "by"، "hw int" برای "bcyi"، "tx abrt" برای "bA"، "tr strt" برای "bB"، "tr end" برای "bE"، "vmentry" برای "bcg" و "vmexit" برای "bch". با این حال پرچمهای "x" ،"D" و "t" در این موارد بهصورت جداگانه نمایش داده خواهند شد؛ مانند "jcc (xD)" برای یک انشعاب شرطی درون یک تراکنش با وقفههای غیرفعال. توجه داشته باشید که غیرفعال شدن وقفهها با "t" و فعال شدن وقفهها با "Dt" نشان داده میشود.
فیلد callindent ساختگی (synthesized) است و ممکن است هنگام رمزگشایی Instruction Trace دارای مقدار باشد. برای فراخوانیها و بازگشتها، این فیلد نام نماد را با دندانهگذاری با فاصله جهت نمایش عمق پشته (stack depth) نشان میدهد.
فیلد synth توسط رویدادهای سنتزشده (synthesized events) استفاده میشود که ممکن است هنگام رمزگشایی رد دستورالعملها (Instruction Trace decoding) ایجاد شوند.
فیلد ipc (دستورالعمل بر چرخه / instructions per cycle) سنتزشده است و ممکن است هنگام رمزگشایی رد دستورالعملها (Instruction Trace decoding) دارای مقدار باشد.
فیلدهای machine_pid و vcpu از دادههای حاصل از بهکارگیری perf inject برای درج یک فایل perf.data ضبطشده در داخل ماشین مجازی در یک فایل perf.data ضبطشده روی میزبان بهطور همزمان، مشتق میشوند.
فیلدهای cgroup نیازمند نمونهای هستند که شناسه cgroup را داشته باشد؛ شناسهای که هنگام ارسال گزینه "--all-cgroups" به 'perf record' ذخیره میشود.
در نهایت، کاربر نمیتواند فیلدها را برای همه انواع رویدادها روی none تنظیم کند؛ به این معنی که -F "" مجاز نیست.
خروجی brstack شامل اطلاعات مرتبط با انشعاب همراه با آدرسهای خام با استفاده از نحو
FROM/TO/EVENT/INTX/ABORT/CYCLES/TYPE/SPEC به ترتیب زیر است:
FROM : دستورالعمل مبدأ انشعاب
TO : دستورالعمل مقصد انشعاب
EVENT : M=مقصد یا جهت انشعاب به نادرستی پیشبینی شده بود (mispredicted)
P=مقصد یا جهت انشعاب پیشبینی شده بود (predicted)
N=انشعاب محقق نشد (not-taken)
-=بدون رویداد یا پشتیبانینشده
INTX : X=انشعاب در داخل یک ناحیه تراکنشی
-=انشعاب در ناحیه تراکنش نیست یا پشتیبانینشده
ABORT : A=ورودی سقط TSX
-=ناحیه سقطشده نیست یا پشتیبانینشده
CYCLES: تعداد چرخههایی که از زمان ضبط آخرین انشعاب سپری شده است
TYPE : نوع انشعاب: COND/UNCOND/IND/CALL/IND_CALL/RET و غیره.
-=پشتیبانینشده
SPEC : اطلاعات حدس و گمانهزنی انشعاب: SPEC_WRONG_PATH/NON_SPEC_CORRECT_PATH/SPEC_CORRECT_PATH
-=پشتیبانینشده
فیلد brstacksym همانند brstack است، بهجز اینکه آدرسهای FROM و TO در صورت امکان به شکل نمادین چاپ میشوند.
هنگامی که brstackinsn مشخص شود، توالیهای کامل اسمبلیِ توالیهای انشعاب برای هر نمونه چاپ میشود. این مسیر اجرای کاملی است که به نمونه منتهی میشود. این قابلیت تنها زمانی پشتیبانی میشود که نمونه با perf record -b یا -j any ضبط شده باشد.
از brstackinsnlen برای چاپ طول brstackinsn استفاده کنید. برای مثال، شما نمیتوانید از دستورالعمل متوالی بعدی پس از یک انشعاب غیرشرطی مطلع شوید، مگر آنکه آن را بر اساس طول آن محاسبه نمایید.
فیلد brstackdisasm مانند brstackinsn عمل میکند، اما اگر perf با کتابخانه capstone ساخته شده باشد، دستورالعملهای دیساسمبلشده را چاپ خواهد کرد.
فیلد brstackoff آفست را درون یک dso/باینری خاص چاپ خواهد کرد.
با گزینه metric، دستور perf script میتواند معیارهایی را برای دورههای نمونهبرداری، مشابه perf stat محاسبه کند. این امر مستلزم تعیین یک گروه با چندین رویداد است که معیارها را با گزینه :S برای perf record تعریف میکنند. دستور perf بر روی رویداد اول نمونهبرداری انجام میدهد و معیارهای محاسبهشده را برای همه رویدادهای درون گروه چاپ میکند. لطفاً توجه داشته باشید که معیار محاسبهشده در کل دوره نمونهبرداری (از زمان آخرین نمونه) میانگینگیری میشود، نه فقط برای نقطه نمونهبرداری.
برای رویدادهای نمونه، نمایش فیلد misc با گزینه -F +misc امکانپذیر است؛ حروف زیر برای هر بیت نمایش داده میشوند:
PERF_RECORD_MISC_KERNEL K PERF_RECORD_MISC_USER U PERF_RECORD_MISC_HYPERVISOR H PERF_RECORD_MISC_GUEST_KERNEL G PERF_RECORD_MISC_GUEST_USER g PERF_RECORD_MISC_MMAP_DATA* M PERF_RECORD_MISC_COMM_EXEC E PERF_RECORD_MISC_SWITCH_OUT S PERF_RECORD_MISC_SWITCH_OUT_PREEMPT Sp
$ perf script -F +misc ... sched-messaging 1414 K 28690.636582: 4590 cycles ... sched-messaging 1407 U 28690.636600: 325620 cycles ... sched-messaging 1414 K 28690.636608: 19473 cycles ... misc field ___________/
-k, --vmlinux=<file>
--kallsyms=<file>
--symfs=<directory[,layout]>
-G, --hide-call-graph
--stop-bt
-C, --cpu
-c, --comms=
--pid=
--tid=
-I, --show-info
--show-kernel-path
--show-task-events نمایش رویدادهای مرتبط با وظیفه (task) (مانند FORK، COMM، EXIT).
--show-mmap-events نمایش رویدادهای مرتبط با mmap (مانند MMAP، MMAP2).
--show-namespace-events نمایش رویدادهای namespace یعنی رویدادهایی از نوع PERF_RECORD_NAMESPACES.
--show-switch-events نمایش رویدادهای تعویض زمینه (context switch) یعنی رویدادهایی از نوع PERF_RECORD_SWITCH یا PERF_RECORD_SWITCH_CPU_WIDE.
--show-lost-events نمایش رویدادهای ازدسترفته (lost) یعنی رویدادهایی از نوع PERF_RECORD_LOST.
--show-round-events نمایش رویدادهای دورِ پایانیافته یعنی رویدادهایی از نوع PERF_RECORD_FINISHED_ROUND.
--show-bpf-events نمایش رویدادهای bpf یعنی رویدادهایی از نوع PERF_RECORD_KSYMBOL و PERF_RECORD_BPF_EVENT.
--show-cgroup-events نمایش رویدادهای cgroup یعنی رویدادهایی از نوع PERF_RECORD_CGROUP.
--show-text-poke-events نمایش رویدادهای text poke یعنی رویدادهایی از نوع PERF_RECORD_TEXT_POKE و PERF_RECORD_KSYMBOL.
--demangle
--demangle-kernel
--addr2line=<path>
--header نمایش سربرگ perf.data.
--header-only تنها نمایش سربرگ perf.data.
--itrace
i تولید رویدادهای instructions
y تولید رویدادهای cycles
b تولید رویدادهای branches
c تولید رویدادهای branches (فقط calls)
r تولید رویدادهای branches (فقط returns)
x تولید رویدادهای transactions
w تولید رویدادهای ptwrite
p تولید رویدادهای power (شامل رویدادهای PSB برای Intel PT)
o تولید سایر رویدادهای ثبتشده به دلیل استفاده
از aux-output (به perf record مراجعه کنید)
I تولید رویدادهای وقفه (interrupt) یا مشابه (ناهمگام)
(مانند Intel PT Event Trace)
e تولید رویدادهای خطا (error)
d ایجاد لاگ اشکالزدایی (debug)
f تولید رویدادهای حافظه پنهان سطح اول (first level cache)
m تولید رویدادهای حافظه پنهان سطح آخر (last level cache)
M تولید رویدادهای حافظه (memory)
t تولید رویدادهای TLB
a تولید رویدادهای دسترسی از راه دور (remote access)
g تولید یک زنجیره فراخوانی (call chain) (استفاده همراه با i یا x)
G تولید یک زنجیره فراخوانی روی رکوردهای رویداد موجود
l تولید ورودیهای آخرین شاخه (last branch) (استفاده همراه با i یا x)
L تولید ورودیهای آخرین شاخه روی رکوردهای رویداد موجود
s نادیدهگرفتن تعداد اولیهای از رویدادها
q رمزگشایی سریعتر (با جزئیات کمتر)
A محاسبه تقریبی IPC
Z ترجیح بر نادیدهگرفتن برچسبهای زمانی (رمزگشایی اصطلاحاً «بیزمان» یا timeless)
T استفاده از رد برچسب زمانی به عنوان زمان هسته (kernel time)
پیشفرض همه رویدادها است، یعنی همانند --itrace=iybxwpe، بهجز برای perf script که مقدار آن --itrace=ce است
علاوه بر این، دوره زمانی (پیشفرض 100000، بهجز برای perf script که 1 است) برای رویدادهای instructions میتواند در واحدهایی از موارد زیر مشخص شود:
همچنین اندازهٔ زنجیرهٔ فراخوانی (پیشفرض 16، حداکثر 1024) را میتوان برای رویدادهای دستورالعملها یا تراکنشها مشخص کرد.
همچنین تعداد مدخلهای آخرین شاخه (پیشفرض 64، حداکثر 1024) را میتوان برای رویدادهای دستورالعملها یا تراکنشها مشخص کرد.
مشابه گزینههای g و l، اندازه را میتوان برای گزینههای G و L نیز مشخص کرد. در x86، توجه داشته باشید که وقتی دادهها با PEBS بزرگ ثبت شده باشند، G و L عملکرد ضعیفی دارند. برای جزئیات به صفحهٔ راهنمای linkperf:perf-intel-pt[1] مراجعه کنید.
همچنین میتوان رویدادهای تولیدشده در ابتدا (دستورالعملها، شاخهها، تراکنشها، ptwrite و power) را نادیده گرفت. این کار برای نادیده گرفتن کد راهاندازی مفید است.
--itrace=i0nss1000000
یک میلیون دستورالعمل نخست را نادیده میگیرد.
گزینهٔ 'e' میتواند با پرچمهایی دنبال شود که مشخص میکنند چه خطاهایی گزارش
خواهند شد یا نخواهند شد. پیش از هر پرچم باید '+' یا '-' قرار گیرد.
این پرچمها عبارتاند از:
o سرریز (overflow)
l از دست رفتن دادههای ردگیری (trace data lost)
در صورت پشتیبانی، گزینهٔ 'd' میتواند با پرچمهایی دنبال شود که مشخص میکنند چه
پیامهای اشکالزداییای ثبت خواهند شد یا نخواهند شد. پیش از هر پرچم باید
'+' یا '-' قرار گیرد. این پرچمها عبارتاند از:
a همهٔ رویدادهای perf
e خروجی فقط هنگام خطاها (اندازه قابل پیکربندی است - linkperf:perf-config[1] را ببینید)
o خروجی به stdout
در صورت پشتیبانی، گزینهٔ 'q' را میتوان برای افزایش اثر تکرار کرد.
برای غیرفعال کردن کامل رمزگشایی، از --no-itrace استفاده کنید.
--full-source-path
--max-stack
پیشفرض: 127
--ns
-f, --force
--time
همچنین از درصد زمانی با چندین بازهٔ زمانی پشتیبانی میکند. رشتهٔ زمانی بهصورت 'a%/n,b%/m,...' یا 'a%-b%,c%-%d,...' است.
برای نمونه: انتخاب دومین برش زمانی 10٪: perf script --time 10%/2
انتخاب برش زمانی از 0% تا 10%: perf script --time 0%-10%
انتخاب اولین و دومین برش زمانی 10%: perf script --time 10%/1,10%/2
انتخاب برشهای 0% تا 10% و 30% تا 40%: perf script --time 0%-10%,30%-40%
--max-blocks
--reltime
--deltatime
--per-event-dump
--inline
--insn-trace[=<raw|disasm>]
--xed
-S, --symbols=symbol[,symbol...]
نشانی هگزادسیمال میتواند نشانی شروع یک نماد یا هر نشانی دیگری برای فیلتر کردن رکوردهای ردگیری باشد
برای مثال، برای انتخاب نماد noploop یا نشانی 0x4007a0: perf script --symbols=noploop,0x4007a0
از فیلتر کردن رکوردهای ردگیری بر اساس نام نماد، نشانی شروع نماد، هر نشانی هگزادسیمال و بازه نشانی پشتیبانی میکند.
ترتیب مقایسه به این صورت است:
--addr-range
برای مثال، برای فهرست کردن رکوردهای ردگیریشده در بازه نشانی [0x4007a0, 0x0x4007a9]: perf script -S 0x4007a0 --addr-range 10
--call-trace
--call-ret-trace
--graph-function
--switch-on EVENT_NAME
--switch-off EVENT_NAME
--show-on-off-events
--stitch-lbr
--merge-callchains
--guestmount=<path>
$ mkdir ~/guestmount $ cd ~/guestmount $ sshfs -o allow_other,direct_io -p 5551 localhost:/ 8888/ $ sshfs -o allow_other,direct_io -p 5552 localhost:/ 9999/ $ perf script --guestmount=~/guestmount
--guestkallsyms=<path>
--guestmodules=<path>
--guestvmlinux=<path>
--guest-code
perf-record(1), perf-script-perl(1), perf-script-python(1), perf-intel-pt(1), perf-dlfilter(1)
| 09/04/2026 | perf |