一、打印说明
1. 打印文件 kernel/sched/stats.c
// SPDX-License-Identifier: GPL-2.0 /* * /proc/schedstat implementation, kernel/sched/stats.c */ #include "sched.h" /* * Current schedstat API version. * * Bump this up when changing the output format or the meaning of an existing * format, so that tools can adapt (or abort) */ #define SCHEDSTAT_VERSION 15 static int show_schedstat(struct seq_file *seq, void *v) { int cpu; if (v == (void *)1) { seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION); seq_printf(seq, "timestamp %lu\n", jiffies); } else { struct rq *rq; #ifdef CONFIG_SMP struct sched_domain *sd; int dcount = 0; #endif cpu = (unsigned long)(v - 2); rq = cpu_rq(cpu); /* runqueue-specific stats */ seq_printf(seq, "cpu%d %u 0 %u %u %u %u %llu %llu %lu", cpu, rq->yld_count, rq->sched_count, rq->sched_goidle, rq->ttwu_count, rq->ttwu_local, rq->rq_cpu_time, rq->rq_sched_info.run_delay, rq->rq_sched_info.pcount); seq_printf(seq, "\n"); #ifdef CONFIG_SMP /* domain-specific stats */ rcu_read_lock(); for_each_domain(cpu, sd) { enum cpu_idle_type itype; seq_printf(seq, "domain%d %*pb", dcount++, cpumask_pr_args(sched_domain_span(sd))); for (itype = CPU_IDLE; itype < CPU_MAX_IDLE_TYPES; itype++) { seq_printf(seq, " %u %u %u %u %u %u %u %u", sd->lb_count[itype], sd->lb_balanced[itype], sd->lb_failed[itype], sd->lb_imbalance[itype], sd->lb_gained[itype], sd->lb_hot_gained[itype], sd->lb_nobusyq[itype], sd->lb_nobusyg[itype]); } seq_printf(seq, " %u %u %u %u %u %u %u %u %u %u %u %u\n", sd->alb_count, sd->alb_failed, sd->alb_pushed, sd->sbe_count, sd->sbe_balanced, sd->sbe_pushed, sd->sbf_count, sd->sbf_balanced, sd->sbf_pushed, sd->ttwu_wake_remote, sd->ttwu_move_affine, sd->ttwu_move_balance); } rcu_read_unlock(); #endif } return 0; } /* * This itererator needs some explanation. * It returns 1 for the header position. * This means 2 is cpu 0. * In a hotplugged system some CPUs, including cpu 0, may be missing so we have * to use cpumask_* to iterate over the CPUs. */ static void *schedstat_start(struct seq_file *file, loff_t *offset) { unsigned long n = *offset; if (n == 0) return (void *) 1; n--; if (n > 0) n = cpumask_next(n - 1, cpu_online_mask); else n = cpumask_first(cpu_online_mask); *offset = n + 1; if (n < nr_cpu_ids) return (void *)(unsigned long)(n + 2); return NULL; } static void *schedstat_next(struct seq_file *file, void *data, loff_t *offset) { (*offset)++; return schedstat_start(file, offset); } static void schedstat_stop(struct seq_file *file, void *data) { } static const struct seq_operations schedstat_sops = { .start = schedstat_start, .next = schedstat_next, .stop = schedstat_stop, .show = show_schedstat, }; static int __init proc_schedstat_init(void) { proc_create_seq("schedstat", 0, NULL, &schedstat_sops); return 0; } subsys_initcall(proc_schedstat_init);
2. 打印格式
# cat /proc/schedstat version 15 timestamp 4299704439 cpu0 45138 0 542397 168341 2109253 149554 211881422606 111767530843 330385 domain0 0f 227641 224888 1633 422336 1219 17 3 224887 2153 1760 268 388564 233 4 0 1760 73662 62207 2826 16446 8629 0 3 62204 19 0 19 0 0 0 0 0 0 152749 6486 0 domain1 ff 173232 172862 297 152593 116 3 17 143952 1005 1000 0 25484 7 0 1 261 64513 62039 1620 692752 854 6 192 61847 1 0 1 0 0 0 0 0 0 1806952 8003 0 cpu1 45841 0 624737 207959 238253 89621 324903926519 116922840103 373278 domain0 0f 173648 170909 1025 413908 1784 22 1 170941 9388 8952 273 464751 273 6 1 8951 81913 70676 2878 41542 8359 4 3 70673 21 0 21 0 0 0 0 0 0 72591 5884 0 domain1 ff 133941 133783 104 38284 59 1 9 4621 3319 3319 0 0 0 0 0 0 73117 70478 1762 858868 877 0 178 70300 0 0 0 0 0 0 0 0 0 76041 7324 0 cpu2 51178 0 321468 71432 126760 48041 161480944503 94681870241 202908 domain0 0f 189232 184881 2163 490574 2324 33 2 184881 1263 820 289 403211 246 5 0 820 42119 32517 2393 15705 7209 2 2 32515 33 1 32 0 0 0 0 0 0 40358 6456 0 domain1 ff 143982 143908 43 24175 49 0 5 1340 532 532 0 0 0 0 0 0 34564 32329 1406 638964 829 0 180 32149 0 0 0 0 0 0 0 0 0 38361 7785 0 cpu3 35501 0 565446 192840 273957 83773 337833473407 121948859432 340993 domain0 0f 177897 175874 1149 167989 974 20 0 175873 8620 8170 289 327360 288 5 0 8170 71849 61682 2271 13143 7896 2 5 61677 22 0 22 0 0 0 0 0 0 79642 5715 0 domain1 ff 136929 136891 22 6872 35 1 3 482 5531 5531 0 0 0 0 0 0 63573 61254 1590 774906 729 0 119 61135 0 0 0 0 0 0 0 0 0 110542 5091 0 cpu4 27314 0 4131892 1759198 1846940 1410620 492045817989 272120457957 2331643 domain0 70 318277 307849 2580 42250 8712 1 3 307850 6953 6823 25 256628 224 0 1 6822 175848 106984 15687 116797 53177 3 3 106970 0 0 0 0 0 0 0 0 0 336853 7759 0 domain1 ff 82908 80926 1806 2383686 446 255 8 67670 409 335 54 748960 32 0 0 92 121846 100176 20364 14634247 1306 24 339 99837 274 23 251 0 0 0 0 0 0 99467 5856 0 cpu5 28142 0 15038899 7208189 6659568 6139758 1042148156910 266948961272 7783970 domain0 70 559016 550747 2238 42294 6887 2 1 550747 6026 5876 18 265564 308 0 2 5874 192275 122809 17145 119657 52321 3 1 122796 0 0 0 0 0 0 0 0 0 383241 7752 0 domain1 ff 272867 272091 695 792819 299 206 9 15905 430 430 0 0 0 0 0 0 138634 113585 23877 25276253 1172 10 282 113303 231 29 202 0 0 0 0 0 0 136569 6039 0 cpu6 21540 0 5412884 2397119 2410659 1938283 595211270931 269219056980 2977818 domain0 70 385866 377440 2536 68482 6719 0 2 377449 8519 8384 23 285279 262 0 0 8384 180564 110492 18169 116184 51903 2 4 110484 0 0 0 0 0 0 0 0 0 368876 7967 0 domain1 ff 248297 247825 430 619453 295 220 5 6035 696 696 0 0 0 0 0 0 127391 103044 23221 24362600 1126 14 335 102709 247 25 222 0 0 0 0 0 0 103500 6013 0 cpu7 21675 0 379280 116596 213543 101590 116532614349 54500059021 242622 domain0 ff 55862 54336 1446 749920 334 210 17 54319 220 116 71 487137 82 1 1 115 25738 14742 9617 4602503 1379 20 392 14350 232 19 213 0 0 0 0 0 0 111953 324 0
3. 总结:打印每个cpu rq 上的部分信息和 load balance 统计信息。