| PERF-SCHED(1) | perf Manual | PERF-SCHED(1) |
نام (NAME)
perf-sched - ابزاری برای ردگیری و سنجش ویژگیهای زمانبند (تاخیرها)
خلاصه دستور (SYNOPSIS)
perf sched {record|latency|map|replay|script|timehist|stats}
توضیحات (DESCRIPTION)
چندین حالت مختلف از perf sched وجود دارد:
دستور 'perf sched record <command>' برای ثبت رویدادهای زمانبندی یک بار کاری دلخواه.
دستور 'perf sched latency' برای گزارش تاخیرهای زمانبندی به ازای هر وظیفه و دیگر ویژگیهای زمانبندی بار کاری.
مثال کاربرد:
perf sched record -- sleep 1
perf sched latency
------------------------------------------------------------------------------------------------------------------------------------- Task | Runtime ms | Count | Avg delay ms | Max delay ms | Max delay start | Max delay end | ------------------------------------------------------------------------------------------------------------------------------------- perf:(2) | 2.804 ms | 66 | avg: 0.524 ms | max: 1.069 ms | max start: 254752.314960 s | max end: 254752.316029 s NetworkManager:1343 | 0.372 ms | 13 | avg: 0.008 ms | max: 0.013 ms | max start: 254751.551153 s | max end: 254751.551166 s kworker/1:2-xfs:4649 | 0.012 ms | 1 | avg: 0.008 ms | max: 0.008 ms | max start: 254751.519807 s | max end: 254751.519815 s kworker/3:1-xfs:388 | 0.011 ms | 1 | avg: 0.006 ms | max: 0.006 ms | max start: 254751.519809 s | max end: 254751.519815 s sleep:147736 | 0.938 ms | 3 | avg: 0.006 ms | max: 0.007 ms | max start: 254751.313817 s | max end: 254751.313824 s
این دستور مقادیر Runtime (مدتزمانی که یک وظیفه واقعاً روی CPU در حال اجرا بوده)، Count (تعداد دفعاتی که تاخیر محاسبه شده) و delay (مدتزمانی که یک وظیفه آماده اجرا بوده اما در انتظار نگه داشته شده) را نمایش میدهد.
وظایفی با نام دستور یکسان ادغام میشوند و تعداد موارد ادغامشده درون () نمایش داده میشود؛ با این حال اگر گزینه -p استفاده شود، pid ذکر میگردد.
دستور 'perf sched script' برای مشاهده ردگیری دقیق بار کاری که ثبت شده است (در حال حاضر نام مستعاری برای 'perf script' است).
دستور 'perf sched replay' برای شبیهسازی بار کاری که از طریق perf sched record ضبط شده است. (این کار با راهاندازی ریسمانهای شبیهسازیشدهای انجام میشود که بار کاری را بر اساس رویدادهای موجود در ردگیری تقلید میکنند. این ریسمانها سپس میتوانند زمانبندیها (مدتزمان اجرای CPU و الگوهای خواب) بار کاری را دقیقاً همانگونه که در زمان ثبت رخ داده بود بازپخش کنند - و میتوانند آن را چندین بار تکرار کرده و کارایی آن را بسنجند.)
دستور 'perf sched map' برای چاپ ساختار متنی تعویض زمینه (context-switching) بار کاری ثبتشده از طریق perf sched record. ستونها نمایانگر تکتک CPUها هستند و شناسههای اختصاری دو حرفی نشاندهنده وظایفی هستند که روی یک CPU در حال اجرا میباشند. یک '*' نشاندهنده CPU دارای رویداد است و یک نقطه نشاندهنده یک CPU بیکار است.
دستور 'perf sched timehist' تحلیلی از رویدادهای زمانبندی ارائه میدهد.
مثال کاربرد:
perf sched record -- sleep 1
perf sched timehist
به طور پیشفرض، رویدادهای زمانبندی به صورت مجزا نمایش داده میشوند، از جمله زمان انتظار (wait time، زمان بین رویدادهای sched-out و sched-in بعدی برای وظیفه)، تاخیر زمانبندی وظیفه (scheduling delay، زمان بین آماده به کار بودن و اجرای واقعی) و مدتزمان اجرای (run time) وظیفه:
time cpu task name wait time sch delay run time
[tid/pid] (msec) (msec) (msec)
-------------- ------ -------------------- --------- --------- ---------
79371.874569 [0011] gcc[31949] 0.014 0.000 1.148
79371.874591 [0010] gcc[31951] 0.000 0.000 0.024
79371.874603 [0010] migration/10[59] 3.350 0.004 0.011
79371.874604 [0011] <idle> 1.148 0.000 0.035
79371.874723 [0005] <idle> 0.016 0.000 1.383
79371.874746 [0005] gcc[31949] 0.153 0.078 0.022
...
زمانها بر حسب msec.usec هستند.
دستور 'perf sched stats {record | report | diff} <command>' بهترتیب برای ثبت،
گزارش تفاوت در شمارندههای schedstat و نمایش اختلاف میان گزارشهای perf sched stats
بهکار میرود. شمارندههای schedstat که در هسته لینوکس وجود دارند، از طریق فایل
``/proc/schedstat`` در دسترس قرار میگیرند. این شمارندهها از طریق sysctl که توسط
فایل ``/proc/sys/kernel/sched_schedstats`` کنترل میشود، فعال یا غیرفعال میشوند.
این شمارندهها رویدادهای متعددی از زمانبند، از جمله فراخوانیهای ``schedule()``،
رویدادهای توازن بار (load-balancing) و فراخوانیهای ``try_to_wakeup()`` را محاسبه
میکنند. این قابلیت برای درک رفتار زمانبند در برابر بار کاری مفید است.
نکته: در صورتی که در فاصله زمانی بین ثبت اسنپشاتهای `/proc/schedstat`، بازآرایی توپولوژیک
یا آنلاین/آفلاین شدن cpuها رخ دهد، این ابزار نتایج درستی ارائه نخواهد داد.
نمونه کاربرد:
perf sched stats record -- sleep 1
perf sched stats report
perf sched stats diff
توضیحات تفصیلی درباره schedstat را میتوان در مستندات هسته یافت: https://www.kernel.org/doc/html/latest/scheduler/sched-stats.html
نتیجه را میتوان بهصورت زیر تفسیر کرد:
دستور `perf sched stats report` با شرح ستونهای موجود در گزارش آغاز میشود. این نامهای ستون پیش از آمار cpu و domain آورده شدهاند تا خوانایی گزارش بهبود یابد.
---------------------------------------------------------------------------------------------------- DESC -> Description of the field COUNT -> Value of the field PCT_CHANGE -> Percent change with corresponding base value AVG_JIFFIES -> Avg time in jiffies between two consecutive occurrence of event ----------------------------------------------------------------------------------------------------
مورد بعدی، کل زمان پروفایلسازی بر حسب jiffies است:
---------------------------------------------------------------------------------------------------- Time elapsed (in jiffies) : 2323 ----------------------------------------------------------------------------------------------------
مورد بعدی، آمار زمانبندی CPU است. این موارد تفاضلهای سادهای از خطوط CPU در /proc/schedstat بههمراه شرح آنها هستند. این گزارش همچنین مقدار % را نسبت به آمار پایه چاپ میکند.
در مثال زیر، schedule() پردازنده CPU0 را در 36.58% از زمان در حالت بیکار رها کرده است. 0.45% از کل فراخوانیهای try_to_wake_up() برای بیدار کردن CPU محلی بوده است. و کل زمان انتظار وظایف روی CPU0 برابر با 48.70% از کل زمان اجرای وظایف روی همان CPU است.
---------------------------------------------------------------------------------------------------- CPU 0 ---------------------------------------------------------------------------------------------------- DESC COUNT PCT_CHANGE ---------------------------------------------------------------------------------------------------- yld_count : 0 array_exp : 0 sched_count : 402267 sched_goidle : 147161 ( 36.58% ) ttwu_count : 236309 ttwu_local : 1062 ( 0.45% ) rq_cpu_time : 7083791148 run_delay : 3449973971 ( 48.70% ) pcount : 255035 ----------------------------------------------------------------------------------------------------
بخش بعدی آمار موازنهسازی بار (load balancing) است. زمانبند برای هر یک از دامنههای زمانبندی (مانند: `SMT`، `MC`، `DIE`...)، آمار را در سه دستهبندی زیر محاسبه میکند:
1) Idle Load Balance: موازنهسازی بار انجامشده توسط یک CPU دیگر به نیابت از
یک CPU که به مدت طولانی بیکار بوده است.
2) Busy Load Balance: موازنهسازی بار انجامشده زمانی که CPU مشغول بوده است.
3) New Idle Balance : موازنهسازی بار انجامشده هنگامی که یک CPU بهتازگی
بیکار شده است.
ذیل هر یک از این سه دستهبندی، گزارش sched stats آمارهای متفاوتی از موازنهسازی بار را ارائه میدهد. در کنار آمارهای مستقیم، این گزارش حاوی معیارهای مشتقشدهای نیز هست که با * پیشوندگذاری شدهاند. مثال:
---------------------------------------------------------------------------------------------------- CPU 0, DOMAIN SMT CPUS 0,64 ---------------------------------------------------------------------------------------------------- DESC COUNT AVG_JIFFIES ----------------------------------------- <Category busy> ------------------------------------------ busy_lb_count : 136 $ 17.08 $ busy_lb_balanced : 131 $ 17.73 $ busy_lb_failed : 0 $ 0.00 $ busy_lb_imbalance_load : 58 busy_lb_imbalance_util : 0 busy_lb_imbalance_task : 0 busy_lb_imbalance_misfit : 0 busy_lb_gained : 7 busy_lb_hot_gained : 0 busy_lb_nobusyq : 2 $ 1161.50 $ busy_lb_nobusyg : 129 $ 18.01 $ *busy_lb_success_count : 5 *busy_lb_avg_pulled : 1.40 ----------------------------------------- <Category idle> ------------------------------------------ idle_lb_count : 449 $ 5.17 $ idle_lb_balanced : 382 $ 6.08 $ idle_lb_failed : 3 $ 774.33 $ idle_lb_imbalance_load : 0 idle_lb_imbalance_util : 0 idle_lb_imbalance_task : 71 idle_lb_imbalance_misfit : 0 idle_lb_gained : 67 idle_lb_hot_gained : 0 idle_lb_nobusyq : 0 $ 0.00 $ idle_lb_nobusyg : 382 $ 6.08 $ *idle_lb_success_count : 64 *idle_lb_avg_pulled : 1.05 ---------------------------------------- <Category newidle> ---------------------------------------- newidle_lb_count : 30471 $ 0.08 $ newidle_lb_balanced : 28490 $ 0.08 $ newidle_lb_failed : 633 $ 3.67 $ newidle_lb_imbalance_load : 0 newidle_lb_imbalance_util : 0 newidle_lb_imbalance_task : 2040 newidle_lb_imbalance_misfit : 0 newidle_lb_gained : 1348 newidle_lb_hot_gained : 0 newidle_lb_nobusyq : 6 $ 387.17 $ newidle_lb_nobusyg : 26634 $ 0.09 $ *newidle_lb_success_count : 1348 *newidle_lb_avg_pulled : 1.00 ----------------------------------------------------------------------------------------------------
سطر زیر را در نظر بگیرید:
newidle_lb_balanced : 28490 $ 0.08 $
در حالی که پروفایلسازی فعال بود، موازنهساز بار ۲۸۴۹۰ بار تشخیص داد که بار روی CPU 0 که بهتازگی بیکار شده نیاز به موازنهسازی دارد. مقدار درجشده درون علامت $، میانگین jiffies میان دو رویداد است (2323 / 28490 = 0.08).
بخش بعدی آمار active_load_balance() است. در زمان فعال بودن پروفایلسازی، alb فراخوانی نشد، از این رو تمام مقادیر آن 0 هستند.
--------------------------------- <Category active_load_balance()> --------------------------------- alb_count : 0 alb_failed : 0 alb_pushed : 0 ----------------------------------------------------------------------------------------------------
بخش بعدی آمار sched_balance_exec() و sched_balance_fork() است. از آنها استفاده نمیشود اما صرفاً برای سازگاری با نسخههای پیشین در RFC نگه داشته شدهاند. در صورت عدم مخالفت، برنامهریزی شده است که در بازبینی بعدی حذف شوند.
بخش بعدی آمار بیدارباش (wakeup) است. این گزارش برای هر دامنه، آمار بیدار شدن وظایف (task-wakeup) را نیز نمایش میدهد. مثال:
------------------------------------------ <Wakeup Info> ------------------------------------------- ttwu_wake_remote : 1590 ttwu_move_affine : 84 ttwu_move_balance : 0 ----------------------------------------------------------------------------------------------------
مجموعه یکسانی از آمارها برای هر CPU و هر سطح دامنه (domain) گزارش میشود.
نحوه تفسیر diff ~~~~~~~~~~~~~~~
دستور `perf sched stats diff` همچنین با توضیح ستونهای موجود در diff آغاز خواهد شد. سپس اختلاف زمانی را بر حسب jiffies نمایش میدهد. ترتیب مقادیر به ترتیب فایلهای داده ورودی بستگی دارد. این دستور بهطور پیشفرض بهترتیب `perf.data.old` و `perf.data` را برای مقایسه در نظر میگیرد. مثال:
---------------------------------------------------------------------------------------------------- Time elapsed (in jiffies) : 2009, 2001 ----------------------------------------------------------------------------------------
در زیر نمونهای آورده شده است که تفاوت در آمارهای cpu و domain دو اجرا را نشان میدهد. در اینجا ستون سوم یا مقادیر محصور در `|...|` درصد تغییرات بین این دو را نشان میدهد. ستونهای دوم و چهارم نمایش کنار همِ فیلدهای متناظر از `perf sched stats report` هستند.
---------------------------------------------------------------------------------------------------- CPU <ALL CPUS SUMMARY> ---------------------------------------------------------------------------------------------------- DESC COUNT1 COUNT2 PCT_CHANG> ---------------------------------------------------------------------------------------------------- yld_count : 0, 0 | 0.00> array_exp : 0, 0 | 0.00> sched_count : 528533, 412573 | -21.94> sched_goidle : 193426, 146082 | -24.48> ttwu_count : 313134, 385975 | 23.26> ttwu_local : 1126, 1282 | 13.85> rq_cpu_time : 8257200244, 8301250047 | 0.53> run_delay : 4728347053, 3997100703 | -15.47> pcount : 335031, 266396 | -20.49> ----------------------------------------------------------------------------------------------------
در زیر نمونهای از diff آمارهای domain آورده شده است:
---------------------------------------------------------------------------------------------------- CPU <ALL CPUS SUMMARY>, DOMAIN SMT ---------------------------------------------------------------------------------------------------- DESC COUNT1 COUNT2 PCT_CHANG> ----------------------------------------- <Category busy> ------------------------------------------ busy_lb_count : 122, 80 | -34.43> busy_lb_balanced : 115, 76 | -33.91> busy_lb_failed : 1, 3 | 200.00> busy_lb_imbalance_load : 35, 49 | 40.00> busy_lb_imbalance_util : 0, 0 | 0.00> busy_lb_imbalance_task : 0, 0 | 0.00> busy_lb_imbalance_misfit : 0, 0 | 0.00> busy_lb_gained : 7, 2 | -71.43> busy_lb_hot_gained : 0, 0 | 0.00> busy_lb_nobusyq : 0, 0 | 0.00> busy_lb_nobusyg : 115, 76 | -33.91> *busy_lb_success_count : 6, 1 | -83.33> *busy_lb_avg_pulled : 1.17, 2.00 | 71.43> ----------------------------------------- <Category idle> ------------------------------------------ idle_lb_count : 568, 620 | 9.15> idle_lb_balanced : 462, 449 | -2.81> idle_lb_failed : 11, 21 | 90.91> idle_lb_imbalance_load : 0, 0 | 0.00> idle_lb_imbalance_util : 0, 0 | 0.00> idle_lb_imbalance_task : 115, 189 | 64.35> idle_lb_imbalance_misfit : 0, 0 | 0.00> idle_lb_gained : 103, 169 | 64.08> idle_lb_hot_gained : 0, 0 | 0.00> idle_lb_nobusyq : 0, 0 | 0.00> idle_lb_nobusyg : 462, 449 | -2.81> *idle_lb_success_count : 95, 150 | 57.89> *idle_lb_avg_pulled : 1.08, 1.13 | 3.92> ---------------------------------------- <Category newidle> ---------------------------------------- newidle_lb_count : 16961, 3155 | -81.40> newidle_lb_balanced : 15646, 2556 | -83.66> newidle_lb_failed : 397, 142 | -64.23> newidle_lb_imbalance_load : 0, 0 | 0.00> newidle_lb_imbalance_util : 0, 0 | 0.00> newidle_lb_imbalance_task : 1376, 655 | -52.40> newidle_lb_imbalance_misfit : 0, 0 | 0.00> newidle_lb_gained : 917, 457 | -50.16> newidle_lb_hot_gained : 0, 0 | 0.00> newidle_lb_nobusyq : 3, 1 | -66.67> newidle_lb_nobusyg : 14480, 2103 | -85.48> *newidle_lb_success_count : 918, 457 | -50.22> *newidle_lb_avg_pulled : 1.00, 1.00 | 0.11> --------------------------------- <Category active_load_balance()> --------------------------------- alb_count : 0, 1 | 0.00> alb_failed : 0, 0 | 0.00> alb_pushed : 0, 1 | 0.00> --------------------------------- <Category sched_balance_exec()> ---------------------------------- sbe_count : 0, 0 | 0.00> sbe_balanced : 0, 0 | 0.00> sbe_pushed : 0, 0 | 0.00> --------------------------------- <Category sched_balance_fork()> ---------------------------------- sbf_count : 0, 0 | 0.00> sbf_balanced : 0, 0 | 0.00> sbf_pushed : 0, 0 | 0.00> ------------------------------------------ <Wakeup Info> ------------------------------------------- ttwu_wake_remote : 2031, 2914 | 43.48> ttwu_move_affine : 73, 124 | 69.86> ttwu_move_balance : 0, 0 | 0.00> ----------------------------------------------------------------------------------------------------
قابل اعمال بر {record|latency|map|replay|script}
-i, --input=<file>
نام فایل
ورودی.
(پیشفرض: perf.data
مگر اینکه stdin
یک fifo باشد)
-v, --verbose
نمایش
توضیحات
بیشتر.
(نمایش آدرس
نمادها و
غیره)
-D, --dump-raw-trace=
نمایش
خروجی کامل
و پرجزئیات
دادههای sched.
-f, --force
بدون
پرسش یا
اخطار
انجام بده.
گزینهها برای PERF SCHED LATENCY (OPTIONS FOR PERF SCHED LATENCY)
-C, --CPU <n>
پردازندهای
(CPU) که
ارزیابی
عملکرد روی
آن انجام
میشود.
-p, --pids
آمار
تاخیر (latency) بر
حسب pid به جای
نام دستور.
-s, --sort <key[,key2...]>
مرتبسازی
بر اساس
کلید(ها): runtime،
switch، avg، max
بهطور
پیشفرض بر
اساس "avg ,max ,switch ,runtime"
مرتب
میشود.
گزینهها برای PERF SCHED MAP (OPTIONS FOR PERF SCHED MAP)
--compact
فقط
پردازندههای
دارای
فعالیت را
نمایش بده.
به
مصورسازی
در
سامانههای
دارای
تعداد هسته
بالا کمک
میکند.
--cpus
فقط
ورودیهای
دارای
فعالیت
برای CPUهای
مشخصشده
را نمایش
بده.
--color-cpus
برجستهسازی
CPUهای
مشخصشده.
--color-pids
برجستهسازی
pidهای
مشخصشده.
--task-name <task>
نگاشت
خروجی تنها
برای نام
وظیفه(های)
مشخصشده.
نامهای
وظایف را با
کاما (بدون
فاصله) جدا
کنید. زمان sched-out
چاپ شده و با
*- برای نام
وظیفه(های)
دادهشده
نشان داده
میشود. (-
نشاندهنده
سایر وظایف
است، در
حالی که .
حالت بیکار
یا idle است).
--fuzzy-name
نام
وظیفه(های)
دادهشده
میتواند
بهصورت
تقریبی
تطبیق داده
شود (تطبیق
فازی).
گزینهها برای PERF SCHED TIMEHIST (OPTIONS FOR PERF SCHED TIMEHIST)
-k, --vmlinux=<file>
مسیر
فایل vmlinux
--kallsyms=<file>
مسیر
فایل kallsyms
-g, --call-graph
نمایش
زنجیرههای
فراخوانی (call chains)
در صورت
وجود
(بهطور
پیشفرض
فعال است).
--max-stack
حداکثر
تعداد
توابع برای
نمایش در backtrace؛
پیشفرض ۵.
-C=, --cpu=
فقط
رویدادهای
مربوط به
CPU(های)
مشخصشده
را نمایش
بده (فهرست
جداشده با
کاما).
-p=, --pid=
فقط
رویدادهای
مربوط به
شناسه
فرایند (PID)
مشخصشده
را نمایش
بده (فهرست
جداشده با
کاما).
-t=, --tid=
فقط
رویدادهای
مربوط به
شناسه رشته
(TID) مشخصشده
را نمایش
بده (فهرست
جداشده با
کاما).
-s, --summary
فقط
خلاصهای
از
زمانبندی
بر حسب رشته
همراه با
کمینه،
بیشینه و
میانگین
زمانهای
اجرا (به
ثانیه) و
انحراف
معیار نسبی
را نمایش
بده.
-S, --with-summary
نمایش
تمام
رویدادهای
زمانبندی
و به دنبال
آن
خلاصهای
بر حسب رشته
همراه با
کمینه،
بیشینه و
میانگین
زمانهای
اجرا (به
ثانیه) و
انحراف
معیار
نسبی.
--symfs=<directory[,layout]>
جستجوی
فایلهای
حاوی
نمادها
نسبت به این
دایرکتوری.
چیدمان (layout)
اختیاری
میتواند
hierarchy
(پیشفرض،
تطبیق با
مسیر کامل)
یا flat (تنها
تطبیق با
نام پایه)
باشد. این
گزینه
زمانی
کاربرد
دارد که
فایلهای
اشکالزدایی
در یک
ساختار
دایرکتوری
مسطح ذخیره
شده باشند.
-V, --cpu-visual
نمایش
راهنمای
بصری برای
تعویضهای sched
بر پایهٔ CPU: i
زمان
بیکاری (idle) را
نشان
میدهد و s
رویدادهای
زمانبند
هستند.
-w, --wakeups
نمایش
رویدادهای
بیدارباش
(wakeups).
-M, --migrations
نمایش
رویدادهای
مهاجرت (migrations).
-n, --next
نمایش
وظیفهٔ
بعدی (next task).
-I, --idle-hist
تنها
نمایش
رویدادهای
مرتبط با
حالت
بیکاری (idle).
--time
فقط
تحلیل
نمونههای
موجود در
بازهٔ
زمانی
دادهشده:
<start>,<stop>.
زمانها
دارای قالب
ثانیه.میکروثانیه
هستند. اگر
زمان آغاز
داده نشود
(یعنی رشته
زمان
بهصورت ,x.y
باشد)،
تحلیل از
ابتدای
فایل آغاز
میشود. اگر
زمان پایان
داده نشود
(یعنی رشته
زمان
بهصورت x.y,
باشد)،
تحلیل تا
انتهای
فایل ادامه
مییابد.
--state
نمایش
وضعیت
وظیفه
هنگام خارج
شدن از اجرا
(switch out).
--show-prio
نمایش
اولویت
وظیفه.
--prio
فقط
رویدادهای
مربوط به
اولویت(های)
وظیفهٔ
مشخصشده
را نمایش
بده. چندین
اولویت
میتوانند
بهصورت یک
فهرست
جداشده با
کاما و بدون
فاصله
ارائه شوند:
0,120. بازههای
اولویتها
با - مشخص
میشوند: 120-129.
همچنین
میتوان
ترکیبی از
هر دو را
ارائه کرد: 0,120-129.
-P, --pre-migrations
نمایش
زمان
انتظار پیش
از مهاجرت
(pre-migration wait time). زمان
انتظار پیش
از مهاجرت،
مدت زمانی
است که یک
تسک در یک runqueue
منتظر
میماند
اما فرصت
اجرا در
آنجا را به
دست
نمیآورد و
به یک runqueue
متفاوت
مهاجرت
داده
میشود که
در نهایت در
آنجا اجرا
میگردد.
این زمان
بین sched_wakeup و migrate_task
همان زمان
انتظار پیش
از مهاجرت
است.
گزینههای PERF SCHED REPLAY (OPTIONS FOR PERF SCHED REPLAY)
-r, --repeat <n>
تکرار
بار کاری (workload)
به تعداد n
بار (0:
بینهایت).
پیشفرض 10
است.
همچنین ببینید (SEE ALSO)
| 09/04/2026 | perf |