PERF-TOP(1) perf Manual PERF-TOP(1)

perf-top - ابزار پروفایل‌سازی سامانه.

perf top [-e <EVENT> | --event=EVENT] [<options>]

این دستور پروفایلی از شمارنده‌های کارایی را به‌صورت بلادرنگ تولید و نمایش می‌دهد.

-a, --all-cpus

گردآوری در سطح کل سامانه. (پیش‌فرض)

-c <count>, --count=<count>

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

-C <cpu-list>, --cpu=<cpu>

فقط روی فهرست پردازنده‌های مشخص‌شده پایش انجام شود. چندین پردازنده را می‌توان به‌صورت فهرستی با کاما و بدون فاصله مشخص کرد: 0,1. بازه‌های پردازنده با - مشخص می‌شوند: 0-2. مقدار پیش‌فرض پایش تمام پردازنده‌ها است.

-d <seconds>, --delay=<seconds>

تعداد ثانیه‌های تأخیر میان تازه‌سازی‌ها.

-e <event>, --event=<event>

انتخاب رویداد PMU. انتخاب می‌تواند یک نام نمادین رویداد باشد (از perf list برای فهرست کردن تمام رویدادها استفاده کنید) یا یک رویداد خام PMU در قالب rN باشد که در آن N یک مقدار هگزادسیمال است که کدگذاری خام ثبات را مطابق با ساختاربندی ثبات‌های کنترل رویداد که در مدخل‌های /sys/bus/event_source/devices/cpu/format/* شرح داده شده است، نمایش می‌دهد.

--filter=<filter>

فیلتر رویداد. این گزینه باید پس از یک انتخاب‌گر رویداد (-e) قرار گیرد. برای اطلاع از ساختار نحوی به perf-record(1) مراجعه کنید.

-E <entries>, --entries=<entries>

نمایش این تعداد تابع.

-f <count>, --count-filter=<count>

فقط نمایش توابعی با رویدادهایی بیش از این مقدار.

--group-sort-idx

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

-F <freq>, --freq=<freq>

پروفایل‌سازی در این بسامد. برای استفاده از بیشینه بسامد مجاز کنونی، یعنی مقدار موجود در sysctl با عنوان kernel.perf_event_max_sample_rate، از max استفاده کنید.

-i, --inherit

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

-k <path>, --vmlinux=<path>

مسیر به vmlinux. برای قابلیت حاشیه‌نویسی (annotation) الزامی است.

--ignore-vmlinux

نادیده‌گرفتن فایل‌های vmlinux.

--kallsyms=<file>

نام مسیر kallsyms

-m <pages>, --mmap-pages=<pages>

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

-p <pid>, --pid=<pid>

پروفایل‌سازی رویدادها روی شناسهٔ فرایند (PID) موجود (فهرست جداشده با کاما).

-t <tid>, --tid=<tid>

پروفایل‌سازی رویدادها روی شناسهٔ نخ (TID) موجود (فهرست جداشده با کاما).

-u, --uid=

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

-r <priority>, --realtime=<priority>

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

--sym-annotate=<symbol>

حاشیه‌نویسی این نماد.

-K, --hide_kernel_symbols

پنهان‌سازی نمادهای هسته.

-U, --hide_user_symbols

پنهان‌سازی نمادهای کاربر.

--demangle-kernel

خواناسازی نام‌ها (demangle) برای نمادهای هسته.

-D, --dump-symtab

تخلیه جدول نمادهای مورد استفاده در پروفایل‌سازی.

-v, --verbose

پرحرف‌تر بودن (نمایش خطاهای باز کردن شمارنده‌ها و غیره).

-z, --zero

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

-s, --sort

مرتب‌سازی بر اساس کلید(ها): pid, comm, dso, symbol, parent, srcline, weight, local_weight, abort, in_tx, transaction, overhead, sample, period. لطفاً توضیحات --sort را در صفحه راهنمای perf-report مشاهده کنید.

--fields=

مشخص کردن فیلد خروجی - چند کلید می‌توانند در قالب CSV مشخص شوند. فیلدهای زیر در دسترس هستند: overhead, overhead_sys, overhead_us, overhead_children, sample و period. همچنین می‌تواند شامل هر کلید(های) مرتب‌سازی باشد.
به‌طور پیش‌فرض، هر کلید مرتب‌سازی که در --field مشخص نشده باشد به‌طور
خودکار افزوده خواهد شد.

-n, --show-nr-samples

نمایش ستونی با تعداد نمونه‌ها. --show-total-period
نمایش ستونی با مجموع دوره‌ها (periods).

--dsos

تنها نمادهای موجود در این dsoها را در نظر می‌گیرد. این گزینه بر درصد ستون overhead تأثیر خواهد گذاشت. برای اطلاعات بیشتر --percentage را ببینید.

--comms

تنها نمادهای موجود در این commها را در نظر می‌گیرد. این گزینه بر درصد ستون overhead تأثیر خواهد گذاشت. برای اطلاعات بیشتر --percentage را ببینید.

--symbols

تنها این نمادها را در نظر می‌گیرد. این گزینه بر درصد ستون overhead تأثیر خواهد گذاشت. برای اطلاعات بیشتر --percentage را ببینید.

-M, --disassembler-style=

تنظیم سبک دیس‌اسمبلر برای objdump.

--addr2line=<path>

مسیر فایل اجرایی addr2line.

--objdump=<path>

مسیر فایل اجرایی objdump.

--prefix=PREFIX, --prefix-strip=N

حذف N مدخل نخست از نام مسیر فایل‌های سورس در فایل‌های اجرایی و افزودن PREFIX به آن‌ها. این امکان را فراهم می‌سازد تا کد منبع کامپایل‌شده روی سیستم‌هایی با ساختار فایل‌سیستم متفاوت نمایش داده شود.

--source

نمایش درهم‌آمیخته کد منبع با کد اسمبلی. به‌طور پیش‌فرض فعال است؛ با --no-source غیرفعال می‌شود.

--asm-raw

نمایش کدگذاری خام دستورالعمل‌های اسمبلی.

-g

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

--call-graph [mode,type,min[,limit],order[,key][,branch]]

راه‌اندازی و فعال‌سازی ضبط call-graph (زنجیره پشته/backtrace)؛ این گزینه شامل -g نیز می‌شود. برای جزئیات بخش --call-graph را در صفحات راهنمای perf-record و perf-report ببینید.

--children

انباشت زنجیره فراخوانی (callchain) فرزندان در مدخل والد به نحوی که بتوانند در خروجی نمایش داده شوند. خروجی شامل یک ستون جدید «Children» خواهد بود و بر اساس داده‌ها مرتب می‌شود. این گزینه نیازمند فعال بودن گزینه -g/--call-graph است. برای جزئیات بیشتر بخش ‘overhead calculation’ را ببینید. به‌طور پیش‌فرض فعال است؛ با --no-children غیرفعال می‌شود.

--max-stack

تنظیم محدودیت عمق پشته هنگام تجزیه زنجیره فراخوانی؛ هر چیزی فراتر از عمق تعیین‌شده نادیده گرفته خواهد شد. این یک مصالحه میان از دست رفتن اطلاعات و پردازش سریع‌تر است، به‌ویژه برای بارهای کاری که می‌توانند پشته زنجیره فراخوانی بسیار طولانی داشته باشند.
Default: /proc/sys/kernel/perf_event_max_stack when present, 127 otherwise.

--ignore-callees=<regex>

نادیده گرفتن فراخوانده‌شدگان (callees) تابع یا توابعی که با regex داده‌شده مطابقت دارند. این کار موجب جمع‌آوری فراخوانندگان (callers) هر یک از این توابع در یک نقطه از درخت call-graph می‌شود.

--percent-limit

عدم نمایش مدخل‌هایی که سربار (overhead) آن‌ها کمتر از این درصد است. (پیش‌فرض: 0).

--percentage

تعیین نحوه نمایش درصد سربار مدخل‌های فیلترشده. فیلترها می‌توانند از طریق گزینه‌های --comms، --dsos یا --symbols و عملیات بزرگ‌نمایی در رابط TUI (مانند thread، dso و غیره) اعمال شوند.
«relative» بدین معنی است که درصدها تنها نسبت به مدخل‌های فیلترشده محاسبه
می‌شوند تا مجموع مدخل‌های نمایش‌داده‌شده همواره ۱۰۰٪ باشد. «absolute» بدین معنی
است که مقدار اصلی پیش و پس از اعمال فیلتر حفظ می‌شود.

-w, --column-widths=<width[,width...]>

اجبار پهنای هر ستون به فهرست ارائه‌شده، برای خوانایی در ترمینال‌های بزرگ. 0 به معنای نامحدود بودن است (رفتار پیش‌فرض).

--proc-map-timeout

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

-b, --branch-any

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

-j, --branch-filter

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

--branch-history

افزودن آدرس‌های شاخه‌های طی‌شده نمونه‌برداری‌شده به پشته فراخوانی (callstack). این امکان را فراهم می‌سازد تا مسیری که برنامه تا هر نمونه طی کرده است بررسی شود.

--raw-trace

عدم استفاده از print fmt یا پلاگین‌ها هنگام نمایش خروجی traceevent.

-H, --hierarchy

فعال‌سازی خروجی سلسله‌مراتبی. در حالت سلسله‌مراتبی، هر کلید مرتب‌سازی نمونه‌ها را بر اساس معیارها گروه‌بندی کرده و سپس آن‌ها را با استفاده از کلید مرتب‌سازی سطح پایین‌تر تقسیم‌بندی می‌کند.
برای نمونه، در خروجی عادی:
perf report -s dso,sym
#
# Overhead  Shared Object      Symbol
# ........  .................  ...........
    50.00%  [kernel.kallsyms]  [k] kfunc1
    20.00%  perf               [.] foo
    15.00%  [kernel.kallsyms]  [k] kfunc2
    10.00%  perf               [.] bar
     5.00%  libc.so            [.] libcall
در خروجی سلسله‌مراتبی:
perf report -s dso,sym --hierarchy
#
#   Overhead  Shared Object / Symbol
# ..........  ......................
    65.00%    [kernel.kallsyms]
      50.00%    [k] kfunc1
      15.00%    [k] kfunc2
    30.00%    perf
      20.00%    [.] foo
      10.00%    [.] bar
     5.00%    libc.so
       5.00%    [.] libcall
--overwrite
این گزینه را برای استفاده از جدیدترین رکوردها فعال کنید که در ماشین‌هایی با تعداد هسته بالا نظیر Knights Landing/Mill مفید است، اما در حال حاضر به‌طور پیش‌فرض غیرفعال است زیرا توقف‌های به کار رفته در این تکنیک منجر به از دست رفتن رویدادهای فراداده‌ای مانند PERF_RECORD_MMAP می‌شود، که سبب می‌گردد perf top قادر به تفکیک و تحلیل نمونه‌ها نباشد و در نتیجه نمونه‌های ناشناخته بسیاری در رابط کاربری نمایش داده شوند. اگر در چنین ماشین‌هایی هستید و بار کاری‌ای را پروفایل می‌کنید که نخ‌های کوتاه‌عمر ایجاد نمی‌کند و/یا از عملیات اجرایی mmap زیادی استفاده نمی‌کند، این گزینه را فعال کنید. برنامه‌ریزی‌هایی برای برطرف کردن این وضعیت در دست انجام است؛ تا آن زمان، این گزینه به‌طور پیش‌فرض غیرفعال باقی خواهد ماند.

--force

اعتبارسنجی مالکیت انجام نشود.

--num-thread-synthesize

تعداد نخ‌هایی که هنگام ترکیب رویدادها برای فرآیندهای موجود اجرا می‌شوند. به‌طور پیش‌فرض، تعداد نخ‌ها برابر با تعداد پردازنده‌های برخط (online CPUs) است.

--namespaces

ثبت رویدادهایی از نوع PERF_RECORD_NAMESPACES و نمایش آن با کلید مرتب‌سازی cgroup_id.

-G name, --cgroup name

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

--all-cgroups

ثبت رویدادهایی از نوع PERF_RECORD_CGROUP و نمایش آن با کلید مرتب‌سازی cgroup.

--switch-on EVENT_NAME

در نظر گرفتن رویدادها تنها پس از یافتن این رویداد.
برای نمونه:
یافتن محلی که بسته‌های broadcast در آن پردازش می‌شوند:
perf probe -L icmp_rcv
درج یک probe در آن محل:
perf probe icmp_rcv:59
اجرای perf top و درخواست از آن برای در نظر گرفتن رویدادهای cycles تنها هنگامی
که یک بسته broadcast می‌رسد. این کار منویی با دو مدخل نمایش می‌دهد و با رسیدن
یک بسته broadcast شمارش را آغاز می‌کند:
perf top -e cycles,probe:icmp_rcv --switch-on=probe:icmp_rcv
به عنوان روشی دیگر می‌توان یک گروه درخواست کرد تا دو ستون بالاسری (overhead) نمایان
شود؛ اولی برای cycles و دومی برای رویداد switch-on.
perf top -e '{cycles,probe:icmp_rcv}' --switch-on=probe:icmp_rcv
این روش برای اندازه‌گیری بار کاری پس از پایان فاز مقداردهی اولیه مفید است؛
یعنی درج یک perf probe در آن نقطه و استفاده از مثال‌های بالا با جایگزینی
probe:icmp_rcv با probe پس از مقداردهی اولیه.

--switch-off EVENT_NAME

توقف در نظر گرفتن رویدادها پس از یافتن این رویداد.

--show-on-off-events

نمایش رویدادهای --switch-on/off نیز. این گزینه در حال حاضر در perf top تأثیری ندارد، اما احتمالاً در حالت --group پیش‌فرض بر عدم نمایش رویدادهای switch-on/off قرار خواهد گرفت و چنانچه به‌جز رویدادهای off/on تنها یک رویداد دیگر وجود داشته باشد، مستقیماً به مرورگر هیستوگرام منتقل می‌شود؛ دقیقاً همانند عملکرد perf top هنگامی که هیچ رویدادی به‌طور صریح مشخص نشده است.

--stitch-lbr

نمایش نمودار فراخوانی با LBRهای پیوندخورده (stitched LBRs) که ممکن است نمودار فراخوانی کامل‌تری ارائه دهد. این گزینه باید همراه با ضبط --call-graph lbr استفاده شود. به‌طور پیش‌فرض غیرفعال است. در شرایط متداول با سرریز پشته فراخوانی (call stack overflows)، این ویژگی می‌تواند پشته‌های فراخوانی بهتری نسبت به خروجی پیش‌فرض پشته فراخوانی lbr بازسازی کند. با این حال این روش کاملاً بدون خطا نیست. مواردی ممکن است رخ دهد که در اثر تطابق‌های نادرست، پشته‌های فراخوانی اشتباهی ایجاد شوند. محدودیت‌های شناخته‌شده شامل مواردی مانند مدیریت استثناها در setjmp/longjmp است که در آن‌ها فراخوانی‌ها/بازگشت‌ها تطابق نخواهند داشت.

--pfm-events events

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

[d]

تأخیر در بازآوری نمایش.

[e]

تعداد مدخل‌ها برای نمایش.

[E]

رویداد برای نمایش هنگامی که چندین شمارنده فعال هستند.

[f]

فیلتر نمایش پروفایل (تعداد برخورد >=).

[F]

فیلتر نمایش حاشیه‌نویسی (درصد از کل >=).

[s]

حاشیه‌نویسی نماد.

[S]

توقف حاشیه‌نویسی، بازگشت به نمایش کامل پروفایل.

[K]

پنهان‌سازی نمادهای هسته (kernel).

[U]

پنهان‌سازی نمادهای کاربر (user).

[z]

تغییر وضعیت صفر کردن شمارش رویدادها در بازآوری‌های نمایش.

[qQ]

خروج.

فشردن هر کلید نگاشت‌نشده‌ای منویی را نشان داده و منتظر ورودی می‌ماند.

سربار CPU می‌تواند در دو ستون به صورت Children و Self نمایش داده شود، هنگامی که perf زنجیره‌های فراخوانی (callchains) را جمع‌آوری می‌کند (و ستون‌های متناظر Wall برای سربار زمان واقعی (wall-clock)). سربار self به سادگی با جمع مقادیر تمام دوره‌های (period) یک مدخل - معمولاً یک تابع (نماد) - محاسبه می‌شود. این همان مقداری است که perf به‌طور سنتی نمایش می‌دهد و مجموع تمام مقادیر سربار self باید ۱۰۰٪ باشد.

سربار children از طریق جمع مقادیر تمام دوره‌های توابع فرزند محاسبه می‌شود تا بتواند کل سربار توابع سطح بالاتر را نشان دهد، حتی اگر خود آن‌ها مستقیماً کار زیادی انجام ندهند. منظور از Children در اینجا توابعی هستند که از تابعی دیگر (والد) فراخوانی شده‌اند.

ممکن است گیج‌کننده باشد که مجموع تمام مقادیر سربار children از ۱۰۰٪ فراتر می‌رود، زیرا هر یک از آن‌ها خود تجمیعی از سربار self توابع فرزندشان هستند. اما با فعال بودن این ویژگی، کاربران می‌توانند دریابند که کدام تابع بیشترین سربار را دارد، حتی اگر نمونه‌ها میان فرزندان پراکنده شده باشند.

مثال زیر را در نظر بگیرید؛ سه تابع مانند زیر وجود دارد.

.ft C
void foo(void) {
    /* do something */
}
void bar(void) {
    /* do something */
    foo();
}
int main(void) {
    bar()
    return 0;
}
.ft

در این حالت foo فرزند bar است، و bar فرزند بی‌واسطه main می‌باشد، بنابراین foo نیز فرزند main به شمار می‌رود. به عبارت دیگر، main والد foo و bar است، و bar والد foo می‌باشد.

فرض کنید تمامی نمونه‌ها فقط در foo و bar ثبت شده‌اند. هنگامی که با زنجیره فراخوانی ثبت شود، خروجی در حالت معمول (فقط سربار self) در perf report چیزی شبیه به زیر را نشان خواهد داد:

.ft C
Overhead  Symbol
........  .....................
  60.00%  foo
          |
          --- foo
              bar
              main
              __libc_start_main
  40.00%  bar
          |
          --- bar
              main
              __libc_start_main
.ft

هنگامی که گزینه --children فعال باشد، مقادیر سربار self توابع فرزند (یعنی foo و bar) برای محاسبه سربار children به والدین اضافه می‌شوند. در این حالت گزارش ممکن است به صورت زیر نمایش داده شود:

.ft C
Children      Self  Symbol
........  ........  ....................
 100.00%     0.00%  __libc_start_main
          |
          --- __libc_start_main
 100.00%     0.00%  main
          |
          --- main
              __libc_start_main
 100.00%    40.00%  bar
          |
          --- bar
              main
              __libc_start_main
  60.00%    60.00%  foo
          |
          --- foo
              bar
              main
              __libc_start_main
.ft

در خروجی بالا، سربار self تابع foo (۶۰٪) به سربار children مربوط به bar، main و __libc_start_main اضافه شد. به همین ترتیب، سربار self تابع bar (۴۰٪) به سربار children مربوط به main و \_\_libc_start_main افزوده شد.

بنابراین \_\_libc_start_main و main ابتدا نمایش داده می‌شوند، چرا که دارای سربار children یکسانی (۱۰۰٪) هستند (اگرچه دارای سربار self صفر می‌باشند) و والد توابع foo و bar هستند.

از نسخه v3.16 سربار children به‌طور پیش‌فرض نمایش داده می‌شود و خروجی بر اساس مقادیر آن مرتب می‌گردد. سربار children با مشخص کردن گزینه --no-children در خط فرمان یا با افزودن report.children = false یا top.children = false در فایل پیکربندی perf غیرفعال می‌شود..SH "همچنین ببینید (SEE ALSO)"

perf-stat(1), perf-list(1), perf-report(1)

09/04/2026 perf