| PERF-STAT(1) | perf Manual | PERF-STAT(1) |
نام (NAME)
perf-stat - اجرای یک دستور و جمعآوری آمار شمارندههای کارایی
خلاصه دستور (SYNOPSIS)
perf stat [-e <EVENT> | --event=EVENT] [-a] <command> perf stat [-e <EVENT> | --event=EVENT] [-a] -- <command> [<options>] perf stat [-e <EVENT> | --event=EVENT] [-a] record [-o file] -- <command> [<options>] perf stat report [-i file]
توضیحات (DESCRIPTION)
این دستور یک فرمان را اجرا کرده و آمار شمارندههای کارایی را از آن جمعآوری میکند.
گزینهها (OPTIONS)
<command>...
record
report
-e, --event=
عبارت 'percore' یک توصیفگر رویداد است که شمارش رویدادها را برای هر دو رشته سختافزاری درون یک هسته جمع میزند. برای مثال: perf stat -A -a -e cpu/event,percore=1/,otherevent ...
توجه داشته باشید که دو نحو آخر از تطبیق پیشوند و glob در نام PMU پشتیبانی میکنند تا ایجاد رویدادها را در چندین نمونه از یک نوع PMU در سیستمهای بزرگ (مانند PMUهای کنترلکننده حافظه) ساده کنند. چندین نمونه PMU برای PMUهای uncore معمول است، بنابراین پیشوند 'uncore_' نیز هنگام انجام این تطبیق نادیده گرفته میشود.
-i, --no-inherit
-p, --pid=<pid>
-t, --tid=<tid>
-b, --bpf-prog
# bpftool prog | head -n 1 17247: tracepoint name sys_enter tag 192d548b9d754067 gpl
# perf stat -e cycles,instructions --bpf-prog 17247 --timeout 1000
Performance counter stats for 'BPF program(s) 17247':
85,967 cycles 28,982 instructions # 0.34 insn per cycle
1.102235068 seconds time elapsed
--bpf-attr-map
--pfm-events events
-a, --all-cpus
--no-scale
-d, --detailed
-d: detailed events, L1 and LLC data cache -d -d: more detailed events, dTLB and iTLB events -d -d -d: very detailed events, adding prefetch events
-r, --repeat=<n>
-B, --big-num
-C, --cpu=
-A, --no-aggr
-n, --null
این گزینه میتواند برای سنجش صرف زمان سپریشده واقعی (wall-clock time) - یا ارزیابی سربار خام خود perf stat بدون اجرای هیچ شمارندهای مفید باشد.
-v, --verbose
-x SEP, --field-separator SEP
--table
$ perf stat --null -r 5 --table perf bench sched pipe
Performance counter stats for 'perf bench sched pipe' (5 runs):
# Table of individual measurements: 5.189 (-0.293) # 5.189 (-0.294) # 5.186 (-0.296) # 5.663 (+0.181) ## 6.186 (+0.703) ####
# Final result: 5.483 +- 0.198 seconds time elapsed ( +- 3.62% )
-G name, --cgroup name
اگر بخواهید برای مثال cycles را برای یک cgroup و همچنین در سطح کل سیستم پایش کنید، میتوان از این خط فرمان استفاده کرد: perf stat -e cycles -G cgroup_name -a -e cycles.
--for-each-cgroup name
-o file, --output file
--append
--log-fd
--control=fifo:ctl-fifo[,ack-fifo], --control=fd:ctl-fd[,ack-fd]
#!/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 stat -D -1 -e cpu-cycles -a -I 1000 \
--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 $?
perf stat --repeat 10 --null --sync --pre make -s O=defconfig-build/clean -- make -s -j64 O=defconfig-build/ bzImage
-I msecs, --interval-print msecs
اگر معیار (metric) وجود داشته باشد، با شمارشهای ایجادشده در این بازه محاسبه شده و پس از علامت # چاپ میشود.
--interval-count times
--interval-clear
--timeout msecs
--metric-only
--per-socket
--per-die
--per-cluster
--per-cache
--per-core
--per-thread
--per-node
-D msecs, --delay msecs
-T, --transaction
--metric-no-group
--metric-no-merge
--metric-no-threshold
--quiet
--no-affinity
ثبت آمار (STAT RECORD)
دادههای stat را درون فایل دادهٔ perf ذخیره میکند.
-o file, --output file
گزارش آمار (STAT REPORT)
دادههای stat را از فایل دادهٔ perf خوانده و گزارش میدهد.
-i file, --input file
--per-socket
--per-die
--per-cluster
--per-cache
--per-core
-M, --metrics
هنگامی که اطلاعات آستانه برای یک معیار موجود باشد، رنگ قرمز برای نشان دادن اینکه معیار از آستانه فراتر رفته به کار میرود در حالی که رنگ سبز نشان میدهد فراتر نرفته است. رنگ پیشفرض به این معناست که هیچ اطلاعات آستانهای در دسترس نبوده یا آستانه قابل محاسبه نبوده است.
-A, --no-aggr, --no-merge
هنگامی که چندین رویداد از یک مشخصهٔ رویداد واحد ایجاد میشوند، stat به طور پیشفرض شمارشهای رویداد را تجمیع کرده و نتیجه را در یک سطر نمایش میدهد. این گزینه این رفتار را غیرفعال کرده و هر رویداد و شمارشهای آن را به صورت جداگانه نمایش میدهد.
رویدادهای چندگانه زمانی از یک مشخصهٔ رویدادِ واحد ایجاد میشوند که:
--hybrid-merge
--topdown
مفهوم Frontend bound بدین معناست که CPU نمیتواند دستورالعملها را با سرعت کافی واکشی (fetch) و رمزگشایی (decode) کند. مفهوم Backend bound بدین معناست که محاسبات یا دسترسی به حافظه گلوگاه اصلی است. عبارت Bad Speculation نشاندهنده هدر رفتن چرخههای پردازنده به دلیل پیشبینیهای نادرست انشعاب (branch mispredictions) و مشکلات مشابه است. مفهوم Retiring یعنی پردازنده بدون گلوگاه مشهودی محاسبات را انجام داده است. گلوگاه تنها زمانی یک گلوگاه واقعی است که بار کاری واقعاً محدود به CPU باشد و نه چیز دیگر.
برای دریافت بهترین نتایج، معمولاً ایده خوبی است که از آن همراه با حالت بازهای مانند -I 1000 استفاده شود، چرا که گلوگاه بارهای کاری میتواند مکرراً تغییر کند.
این گزینه --metric-only را فعال میکند، مگر اینکه با --no-metric-only لغو شود.
محدودیتهای زیر تنها برای پردازندههای قدیمیتر Intel و Atom اعمال میشوند؛ در پردازندههای جدیدتر (IceLake و پس از آن)، معیارهای TopDown میتوانند برای هر رشتهای (thread) جمعآوری شوند:
معیارهای بالا به پایین بهجای هر رشته پردازنده، به ازای هر هسته جمعآوری میشوند. حالت per core بهطور خودکار فعال میشود و گزینه -a (پایش سراسری) مورد نیاز است که مستلزم دسترسی ریشه (root) یا تنظیم perf.perf_event_paranoid=-1 میباشد.
تحلیل Topdown از کل Performance Monitoring Unit استفاده میکند و برای کسب بهترین نتیجه، نیازمند غیرفعال کردن NMI watchdog (به عنوان کاربر ریشه) است: echo 0 > /proc/sys/kernel/nmi_watchdog. در غیر این صورت، ممکن است گلوگاهها در بارهای کاری با فازهای متغیر، متناقض و ناپایدار باشند.
برای تفسیر نتایج، معمولاً لازم است بدانیم بار کاری روی کدام CPUها اجرا میشود. در صورت نیاز میتوان با استفاده از taskset، اجرای آن روی پردازندههای خاص را اجباری کرد.
--record-tpebs
--tpebs-mode=[mean|min|max|last]
--td-level
از آنجا که سطوح بالاتر معیارهای بیشتری را گردآوری کرده و از شمارندههای بیشتری استفاده میکنند، دقت کمتری خواهند داشت. طبق یک قرارداد، میتوان یک معیار را با افزودن _group به آن بررسی کرد و این کار دقت را نسبت به گردآوری تمام معیارها برای یک سطح افزایش میدهد. برای نمونه، تحلیل سطح ۱ ممکن است tma_frontend_bound را برجسته کند. این معیار را میتوان با tma_frontend_bound_group و اجرای perf stat -M tma_frontend_bound_group... به شکل دقیقتر و عمیقتر کاوش کرد.
در صورتی که ورودی بالاتر از حداکثر سطح پشتیبانیشده باشد، با خطا متوقف میشود.
--smi-cost
در طول اندازهگیری، مقدار /sys/device/cpu/freeze_on_smi به منظور متوقف کردن (freeze) شمارندههای هسته هنگام بروز SMI تنظیم میشود. شمارنده aperf تحت تأثیر این تنظیم قرار نخواهد گرفت. هزینه SMI را میتوان با (aperf - unhalted core cycles) اندازه گرفت.
در عمل، درصد چرخههای SMI برای تحلیلهای متمرکز بر کارایی بسیار مفید است. گزینه --metric_only بهطور پیشفرض اعمال خواهد شد. خروجی درصد چرخههای SMI است که برابر است با: (aperf - unhalted core cycles) / aperf
کاربرانی که مایل به دریافت مقدار واقعی هستند میتوانند گزینه --no-metric-only را اعمال کنند.
--all-kernel
--all-user
--percore-show-thread
این گزینه همراه با فعال بودن اصلاحکننده رویداد "percore"، شمارش رویدادها را برای تمام رشتههای سختافزاری در یک هسته جمع میزند اما مجموع شمارشها را به ازای هر رشته سختافزاری نمایش میدهد. این گزینه اساساً جایگزینی برای بیت any بوده و برای پسپردازش مناسب است.
--summary
--no-csv-summary
این گزینه را میتوان در پیکربندی perf با تنظیم متغیر stat.no-csv-summary فعال کرد.
$ perf config stat.no-csv-summary=true
--cputype
--pmu-filter
مثالها (EXAMPLES)
$ perf stat -- make
Performance counter stats for 'make':
83723.452481 task-clock:u (msec) # 1.004 CPUs utilized
0 context-switches:u # 0.000 K/sec
0 cpu-migrations:u # 0.000 K/sec
3,228,188 page-faults:u # 0.039 M/sec
229,570,665,834 cycles:u # 2.742 GHz
313,163,853,778 instructions:u # 1.36 insn per cycle
69,704,684,856 branches:u # 832.559 M/sec
2,078,861,393 branch-misses:u # 2.98% of all branches
83.409183620 seconds time elapsed
74.684747000 seconds user 8.739217000 seconds sys
همانطور که در مثال بالا نشان داده شده است، میتوانیم ۳ نوع زمانبندی را نمایش دهیم. ما همیشه مدت زمانی را که شمارندهها فعال/زنده بودهاند نمایش میدهیم:
83.409183620 seconds time elapsed
برای نشستهای بار کاری، همچنین زمانی را که بار کاری در فضای کاربری/سیستمی سپری کرده است نمایش میدهیم:
74.684747000 seconds user 8.739217000 seconds sys
این زمانها دقیقاً همان زمانهایی هستند که توسط ابزار time نمایش داده میشوند.
قالب CSV (CSV FORMAT)
با -x، دستور perf stat میتواند خروجیای با قالبی نهچندان استانداردِ CSV تولید کند؛ ویرگولها در خروجی درون "" قرار نمیگیرند. برای اینکه تجزیهٔ آن آسانتر شود، توصیه میشود از نویسهٔ متفاوتی مانند -x \; استفاده کنید.
فیلدها به این ترتیب هستند:
ممکن است سنجههای اضافی چاپ شوند در حالی که تمام فیلدهای قبلی خالی هستند..SH "پشتیبانی از ساختار هایبرید اینتل (INTEL HYBRID SUPPORT)"
پشتیبانی از رویدادهای هایبرید اینتل در ابزارهای perf.
برای برخی از پلتفرمهای اینتل، مانند AlderLake، که پلتفرمی هایبرید است و از پردازندههای atom و core تشکیل شده است. هر پردازنده فهرست رویدادهای اختصاصی خود را دارد. بخشی از رویدادها روی پردازنده core در دسترس هستند، بخشی روی پردازنده atom و حتی بخشی روی هر دو.
کرنل دو PMU جدید پردازنده را از طریق sysfs ارائه میدهد: /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: شناسه رویداد سختافزاری EEEEEEEE: شناسه نوع PMU
رویداد cache نیز مشابه است. نوع PERF_TYPE_HW_CACHE برای آگاهی از PMU ارتقا یافته است. شناسه نوع PMU در attr.config[63:32] ذخیره میشود.
طرحبندی جدید attr.config برای PERF_TYPE_HW_CACHE:
PERF_TYPE_HW_CACHE: 0xEEEEEEEE00DDCCBB BB: شناسه cache سختافزاری CC: شناسه عملیات cache سختافزاری DD: شناسه نتیجه عملیات cache سختافزاری EEEEEEEE: شناسه نوع PMU
هنگام فعالسازی یک رویداد سختافزاری بدون تعیین 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 ------------------------------------------------------------
نوع 0 برابر با PERF_TYPE_HARDWARE است. مقدار 0x4 در 0x400000000 نشاندهنده PMU پردازندههای cpu_core است. مقدار 0x8 در 0x800000000 نشاندهنده PMU پردازندههای cpu_atom است (شناسه نوع PMU برای atom تصادفی است).
کرنل 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 شمارشهای مقیاسبندیشده را برای رویداد هایبرید گزارش کرده و درصدی را نیز نمایش میدهد. این درصد برابر است با نسبت زمان اجرای رویداد به زمان فعال بودن آن (running time/enabling time).
به عنوان یک مثال، 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 مشخص نشده باشد، در پلتفرم هایبرید دو رویداد پیشفرض 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)..SH "قالب JSON (JSON FORMAT)"
با -j، ابزار perf stat قادر است خروجی را در قالب JSON تولید کند که برای تجزیه قابل استفاده است.
| 09/04/2026 | perf |