hi, so.. I failed to make work reliably the exclude_idle bit for cpu-clock event using the idle's process sum_exec_runtime as Peter outlined in his patch [1]. The time jumped up and down and I couldn't make it stable.
But I noticed we actually have IDLE stats (and many more) available for each CPU (enum cpu_usage_stat), we just can't reach them by perf yet. This patchset adds 'cputime' perf software PMU, that provides CPUTIME_* stats via events that mirrors their names: # perf list | grep cputime cputime/guest/ [Kernel PMU event] cputime/guest_nice/ [Kernel PMU event] cputime/idle/ [Kernel PMU event] cputime/iowait/ [Kernel PMU event] cputime/irq/ [Kernel PMU event] cputime/nice/ [Kernel PMU event] cputime/softirq/ [Kernel PMU event] cputime/steal/ [Kernel PMU event] cputime/system/ [Kernel PMU event] cputime/user/ [Kernel PMU event] v2 changes: - all of the support patches are already in - new way of 'fixing' of idle counts when tick is disabled (patch 2) Examples: # perf stat --top -I 1000 # time Idle System User Irq Softirq IO wait 1.001692690 100.0% 0.0% 0.0% 0.7% 0.2% 0.0% 2.002994039 98.9% 0.0% 0.0% 0.9% 0.2% 0.0% 3.004164038 98.5% 0.2% 0.2% 0.9% 0.2% 0.0% 4.005312773 98.9% 0.0% 0.0% 0.9% 0.2% 0.0% # perf stat --top-full -I 1000 # time Idle System User Irq Softirq IO wait Guest Guest nice Nice Steal 1.001750803 100.0% 0.0% 0.0% 0.7% 0.2% 0.0% 0.0% 0.0% 0.0% 0.0% 2.003159490 99.0% 0.0% 0.0% 0.9% 0.2% 0.0% 0.0% 0.0% 0.0% 0.0% 3.004358366 99.0% 0.0% 0.0% 0.9% 0.2% 0.0% 0.0% 0.0% 0.0% 0.0% 4.005592436 98.9% 0.0% 0.0% 0.9% 0.2% 0.0% 0.0% 0.0% 0.0% 0.0% # perf stat -e cpu-clock,cputime/system/,cputime/user/,cputime/idle/ -a sleep 10 Performance counter stats for 'system wide': 240070.828221 cpu-clock (msec) # 23.999 CPUs utilized 208,910,979,120 ns cputime/system/ # 87.0% System 20,589,603,359 ns cputime/user/ # 8.6% User 8,813,416,821 ns cputime/idle/ # 3.7% Idle 10.003261054 seconds time elapsed # perf stat -e cpu-clock,cputime/system/,cputime/user/ yes > /dev/null ^Cyes: Interrupt Performance counter stats for 'yes': 3483.824364 cpu-clock (msec) # 1.000 CPUs utilized 2,460,117,205 ns cputime/system/ # 70.6% System 1,018,360,669 ns cputime/user/ # 29.2% User 3.484554149 seconds time elapsed 1.018525000 seconds user 2.460515000 seconds sys # perf stat --top -I 1000 --interval-clear # perf stat --top -I 1000 --interval-clear --per-core # perf stat --top -I 1000 --interval-clear --per-socket # perf stat --top -I 1000 --interval-clear -A It's also available in here: git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git perf/fixes thanks, jirka [1] https://marc.info/?l=linux-kernel&m=152397251027433&w=2 --- Jiri Olsa (3): perf/cputime: Add cputime pmu perf/cputime: Fix idle time on NO_HZ config perf stat: Add cputime metric support include/linux/perf_event.h | 2 ++ include/linux/tick.h | 1 + kernel/events/Makefile | 2 +- kernel/events/core.c | 1 + kernel/events/cputime.c | 221 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ kernel/time/tick-sched.c | 11 ++++++ tools/perf/Documentation/perf-stat.txt | 65 +++++++++++++++++++++++++++++++++ tools/perf/builtin-stat.c | 47 ++++++++++++++++++++++++ tools/perf/util/stat-shadow.c | 72 +++++++++++++++++++++++++++++++++++++ tools/perf/util/stat.c | 10 ++++++ tools/perf/util/stat.h | 10 ++++++ 11 files changed, 441 insertions(+), 1 deletion(-) create mode 100644 kernel/events/cputime.c