| PERF-RECORD(1) | perf Manual | PERF-RECORD(1) |
نام (NAME)
perf-record - اجرای یک دستور و ضبط پروفایل عملکرد آن در perf.data
خلاصه دستور (SYNOPSIS)
perf record [-e <EVENT> | --event=EVENT] [-a] <command> perf record [-e <EVENT> | --event=EVENT] [-a] -- <command> [<options>]
توضیحات (DESCRIPTION)
این دستور یک فرمان را اجرا کرده و پروفایل شمارندههای عملکردی آن را بدون نمایش هیچ خروجی، در perf.data ذخیره و گردآوری میکند.
سپس این فایل را میتوان بعداً با استفاده از perf report بررسی کرد.
گزینهها (OPTIONS)
<command>...
-e, --event=
که در آن 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 درک و پشتیبانی شود.
--filter=<filter>
در مورد 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 نیازمند دسترسی ریشه (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
--latency
-a, --all-cpus
-p, --pid=
-t, --tid=
-u, --uid=
-r, --realtime=
--no-buffering
-c, --count=
-o, --output=
-i, --no-inherit
-F, --freq=
--strict-freq
-m, --mmap-pages=
-g
--call-graph
روش بازپیچی (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
-d, --data
--phys-data
--data-page-size
--code-page-size
-T, --timestamp
-P, --period
--sample-cpu
--sample-identifier
--sample-mem-info
-n, --no-samples
-R, --raw-samples
-C, --cpu
وظایف فضای کاربر میتوانند بین پردازندهها جابهجا شوند، بنابراین هنگام ردیابی پردازندههای انتخابشده، یک رویداد صوری (dummy event) برای دنبال کردن رویدادهای جانبی (sideband) برای تمام پردازندهها ایجاد میشود.
-B, --no-buildid
-N, --no-buildid-cache
-G name,..., --cgroup name,...
اگر بخواهید برای مثال cycles را هم برای یک cgroup و هم در سطح کل سیستم نظارت کنید، این خط فرمان میتواند استفاده شود: perf stat -e cycles -G cgroup_name -a -e cycles.
-b, --branch-any
-j, --branch-filter
این گزینه حداقل به یکی از انواع انشعاب از میان any، any_call، any_ret، ind_call، cond نیاز دارد. سطوح دسترسی میتوانند نادیده گرفته شوند، که در این حالت، سطوح دسترسی رویداد مرتبط روی فیلتر انشعاب اعمال میشوند. هر دو سطح دسترسی هسته (k) و هایپروایزر (hv) مشروط به داشتن مجوزها هستند. هنگام نمونهبرداری روی چندین رویداد، نمونهبرداری پشته انشعاب برای همه رویدادهای نمونهبرداری فعال میشود. نوع انشعاب نمونهبرداریشده برای همه رویدادها یکسان است. فیلترهای مختلف باید بهصورت یک فهرست جداشده با کاما مشخص شوند: --branch-filter any_ret,u,k توجه داشته باشید که این ویژگی ممکن است روی همه پردازندهها موجود نباشد.
-W, --weight
--namespaces
--transaction
--per-thread
-D, --delay=
-I, --intr-regs
--user-regs
--running-time
-k, --clockid
-S, --snapshot
در Snapshot Mode دادههای ردگیری تنها زمانی ثبت میشوند که سیگنال SIGUSR2 دریافت شود و در صورت تعیین گزینه e فوق، هنگام خروج نیز ثبت صورت میگیرد.
--aux-sample[=OPTIONS]
--proc-map-timeout
--switch-events
--vmlinux=PATH
--buildid-all
--buildid-mmap
--aio[=n]
--affinity=mode
--mmap-flush=number
حداکثر مقدار مجاز، یکچهارم اندازه صفحات داده mmap شده است.
مقدار پیشفرض این گزینه ۱ بایت است، به این معنی که هر بار رشته نویسنده خروجی دادههای جدیدی در بافر mmap شده پیدا کند، دادهها استخراج شده، احتمالاً فشرده میشوند (-z) و در خروجی، perf.data یا لوله (pipe) نوشته میشوند.
تکههای داده بزرگتر در مقایسه با تکههای کوچکتر بهطور موثرتری فشرده میشوند، بنابراین استخراج تکههای بزرگتر از صفحات داده mmap از دیدگاه کاهش اندازه خروجی ترجیح داده میشود.
همچنین در برخی موارد اجرای تعداد کمتری فراخوان سیستمی (syscall) نوشتن خروجی با اندازه داده بزرگتر میتواند زمان کمتری نسبت به اجرای تعداد بیشتری فراخوان سیستمی نوشتن با اندازه داده کوچکتر ببرد و در نتیجه بار اضافی (overhead) پروفایلسازی در زمان اجرا را کاهش دهد.
-z, --compression-level[=n]
--all-kernel
--all-user
--kernel-callchains
--user-callchains
از هر دو گزینه --kernel-callchains و --user-callchains بهطور همزمان استفاده نکنید، در غیر این صورت هیچ زنجیره فراخوانی جمعآوری نخواهد شد.
--timestamp-filename برچسب زمان (timestamp) را به نام فایل خروجی اضافه میکند.
--timestamp-boundary
نکته: دقت آستانه اندازه تا حد زیادی به پیکربندی شما بستگی دارد - تعداد و اندازه بافرهای حلقهای شما (-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
از همان نحو --event استفاده میکند؛ این رویداد ضبط نخواهد شد و صرفاً به منظور جابهجایی فایل perf.data به محض پردازش رویداد --switch-output توسط یک ریسه جانبی مجزا به کار میرود.
این ریسه جانبی برای اهداف دیگری نیز استفاده میشود، مانند پردازش رکوردهای PERF_RECORD_BPF_EVENT به محض وقوع، استعلام اطلاعات تکمیلی BPF از هسته و غیره.
--switch-max-files=N
--dry-run
دستور perf record --dry-run -e در صورتی که llvm.dump-obj در فایل پیکربندی روی true تنظیم شده باشد، میتواند مانند یک کامپایلر اسکریپت BPF عمل کند.
--synth=TYPE
رویدادهای هسته (و برخی موارد دیگر) صرفنظر از انتخاب این گزینه ثبت میشوند. برای مثال، --synth=no رویدادهای MMAP را برای هسته و ماژولها در بر خواهد داشت.
انواع موجود عبارتند از:
--tail-synthesize
--overwrite
هنگامی که --overwrite و --switch-output استفاده شوند، perf رویدادها را ضبط کرده و دور میریزد تا زمانی که سیگنالی دریافت کند؛ به این معنی که رویدادی غیرعادی شناسایی شده که گرفتن یک تصویر لحظهای (snapshot) از جدیدترین رویدادها — رویدادهایی که در آن لحظه در بافر حلقهای جای میگیرند — را توجیه میکند.
ویژگی overwrite همچنین میتواند برای یک رویداد با استفاده از عبارات پیکربندی تنظیم یا لغو شود. برای مثال: cycles/overwrite/ و instructions/no-overwrite/.
مستلزم --tail-synthesize است.
--kcore
--max-size=<size>
--pfm-events events
--control=fifo:ctl-fifo[,ack-fifo], --control=fd:ctl-fd[,ack-fd]
دستورهای موجود:
-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}
--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>
<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، همچنان از بروز رویدادهای از دست رفته (LOST events) در فایلهای دایرکتوری داده جلوگیری شود. مشخص کردن این گزینه بدون مقدار یا با مقدار خالی، بهطور پیشفرض از طرحبندی CPU استفاده میکند. ماسکهای تعریفشده یا مشخصشده توسط مقدار گزینه، از طریق ماسک ارائهشده با گزینهٔ -C فیلتر میشوند.
--debuginfod[=URLs]
اگر URLs مشخص نشود، از مقدار متغیر محیطی سامانهای DEBUGINFOD_URLS استفاده میشود.
--off-cpu
توجه داشته باشید که در حال حاضر BPF فقط میتواند با استفاده از
اشارهگر فریم ("fp") رد پشته را جمعآوری کند. بنابراین برنامههای ساختهشده
بدون اشارهگر فریم ممکن است نشانیهای ساختگی ببینند.
پروفایلسازی off-cpu از دو نوع نمونه تشکیل شده است: نمونههای مستقیم، که رفتار یکسانی با نمونههای عادی دارند، و نمونههای انباشتهشده، ذخیرهشده در نگاشت رد پشتهٔ BPF، که پس از تمام نمونههای عادی ارائه میشوند.
--setup-filter=<action>
--data-mmap
پشتیبانی ترکیبی اینتل (INTEL HYBRID SUPPORT)
پشتیبانی از رویدادهای ترکیبی 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).
همچنین ببینید (SEE ALSO)
| 09/04/2026 | perf |