joular / joularjx

JoularJX is a Java-based agent for software power monitoring at the source code level.
https://www.noureddine.org/research/joular/joularjx
GNU General Public License v3.0
71 stars 17 forks source link

No "Combined" value in latest version of powermetrics in macOS #51

Closed adelnoureddine closed 9 months ago

adelnoureddine commented 9 months ago

There is no line with "Combined" in latest version of powermetrics in macOS.

In particular, we tested on a MacBook Air (M2, 2022), and the powermetrics command doesn't have the combined line (which is read in JoularJX).

@metacosm, as you wrote the initial PR, could you have a look please? @olegoaer could help in testing on macOS.

metacosm commented 9 months ago

Hmm, that's weird, I have the "Combined Power" line on my M1 Max on 14.1.1. @olegoarer, could you please send me the output of running sudo powermetrics --samplers cpu_power -i 1000 -n 1 to see how different it is?

olegoaer commented 9 months ago

hi @metacosm I just run the command:

Machine model: Mac14,2
OS version: 21G72
Boot arguments: 
Boot time: Mon Oct  2 10:37:21 2023

*** Sampled system activity (Tue Nov 28 11:28:55 2023 +0100) (1002.80ms elapsed) ***

**** Processor usage ****

E-Cluster Power: 6 mW
E-Cluster HW active frequency: 919 MHz
E-Cluster HW active residency:   5.37% (600 MHz:   0% 912 MHz: 100% 1284 MHz:   0% 1752 MHz:   0% 2004 MHz:   0% 2256 MHz:   0% 2424 MHz: .44%)
E-Cluster idle residency:  94.63%
E-Cluster instructions retired: 5.66564e+07
E-Cluster instructions per clock: 0.996462
CPU 0 frequency: 920 MHz
CPU 0 idle residency:  97.09%
CPU 0 active residency:   2.91% (600 MHz:   0% 912 MHz: 2.9% 1284 MHz:   0% 1752 MHz:   0% 2004 MHz:   0% 2256 MHz:   0% 2424 MHz: .02%)
CPU 1 frequency: 922 MHz
CPU 1 idle residency:  98.03%
CPU 1 active residency:   1.97% (600 MHz:   0% 912 MHz: 2.0% 1284 MHz:   0% 1752 MHz:   0% 2004 MHz:   0% 2256 MHz:   0% 2424 MHz: .01%)
CPU 2 frequency: 943 MHz
CPU 2 idle residency:  98.82%
CPU 2 active residency:   1.18% (600 MHz:   0% 912 MHz: 1.2% 1284 MHz:   0% 1752 MHz:   0% 2004 MHz:   0% 2256 MHz:   0% 2424 MHz: .02%)
CPU 3 frequency: 913 MHz
CPU 3 idle residency:  99.04%
CPU 3 active residency:   0.96% (600 MHz:   0% 912 MHz: .96% 1284 MHz:   0% 1752 MHz:   0% 2004 MHz:   0% 2256 MHz:   0% 2424 MHz: .00%)

P-Cluster Power: 4 mW
P-Cluster HW active frequency: 667 MHz
P-Cluster HW active residency:   0.00% (660 MHz: 100% 924 MHz:   0% 1188 MHz:   0% 1452 MHz:   0% 1704 MHz:   0% 1968 MHz:   0% 2208 MHz:   0% 2400 MHz:   0% 2568 MHz:   0% 2724 MHz:   0% 2868 MHz:   0% 2988 MHz:   0% 3096 MHz:   0% 3204 MHz: .03% 3324 MHz: .25% 3408 MHz:   0% 3504 MHz:   0%)
P-Cluster idle residency: 100.00%
P-Cluster instructions retired: 6.11748e+07
P-Cluster instructions per clock: 2.88735
CPU 4 frequency: 3079 MHz
CPU 4 idle residency:  99.81%
CPU 4 active residency:   0.19% (660 MHz: .03% 924 MHz:   0% 1188 MHz:   0% 1452 MHz:   0% 1704 MHz:   0% 1968 MHz:   0% 2208 MHz:   0% 2400 MHz:   0% 2568 MHz:   0% 2724 MHz:   0% 2868 MHz:   0% 2988 MHz:   0% 3096 MHz:   0% 3204 MHz:   0% 3324 MHz: .04% 3408 MHz:   0% 3504 MHz: .12%)
CPU 5 frequency: 1814 MHz
CPU 5 idle residency:  99.99%
CPU 5 active residency:   0.01% (660 MHz: .00% 924 MHz:   0% 1188 MHz:   0% 1452 MHz:   0% 1704 MHz:   0% 1968 MHz:   0% 2208 MHz:   0% 2400 MHz:   0% 2568 MHz:   0% 2724 MHz:   0% 2868 MHz:   0% 2988 MHz:   0% 3096 MHz:   0% 3204 MHz:   0% 3324 MHz: .00% 3408 MHz:   0% 3504 MHz:   0%)
CPU 6 frequency: 660 MHz
CPU 6 idle residency: 100.00%
CPU 6 active residency:   0.00% (660 MHz: .00% 924 MHz:   0% 1188 MHz:   0% 1452 MHz:   0% 1704 MHz:   0% 1968 MHz:   0% 2208 MHz:   0% 2400 MHz:   0% 2568 MHz:   0% 2724 MHz:   0% 2868 MHz:   0% 2988 MHz:   0% 3096 MHz:   0% 3204 MHz:   0% 3324 MHz:   0% 3408 MHz:   0% 3504 MHz:   0%)
CPU 7 frequency: 660 MHz
CPU 7 idle residency: 100.00%
CPU 7 active residency:   0.00% (660 MHz: .00% 924 MHz:   0% 1188 MHz:   0% 1452 MHz:   0% 1704 MHz:   0% 1968 MHz:   0% 2208 MHz:   0% 2400 MHz:   0% 2568 MHz:   0% 2724 MHz:   0% 2868 MHz:   0% 2988 MHz:   0% 3096 MHz:   0% 3204 MHz:   0% 3324 MHz:   0% 3408 MHz:   0% 3504 MHz:   0%)

System instructions retired: 1.17831e+08
System instructions per clock: 1.50979
ANE Power: 0 mW
DRAM Power: 19 mW
DCS Power: 36 mW
CPU Power: 10 mW
GPU Power: 0 mW
Package Power: 25 mW
metacosm commented 9 months ago

Interesting that you get such a different output for a processor that should be fairly similar to mine…

For reference, this is what I get:

Machine model: MacBookPro18,4
OS version: 23B81
Boot arguments: 
Boot time: Wed Nov  8 16:44:22 2023

*** Sampled system activity (Tue Nov 28 14:37:01 2023 +0100) (1006.50ms elapsed) ***

**** Processor usage ****

E-Cluster Online: 100%
E-Cluster HW active frequency: 1578 MHz
E-Cluster HW active residency:  68.75% (600 MHz:   0% 972 MHz:  19% 1332 MHz:  24% 1704 MHz:  28% 2064 MHz:  28%)
E-Cluster idle residency:  31.25%
CPU 0 frequency: 1608 MHz
CPU 0 active residency:  55.98% (600 MHz:   0% 972 MHz: 9.6% 1332 MHz:  13% 1704 MHz:  16% 2064 MHz:  18%)
CPU 0 idle residency:  44.02%
CPU 1 frequency: 1590 MHz
CPU 1 active residency:  51.46% (600 MHz:   0% 972 MHz: 9.7% 1332 MHz:  12% 1704 MHz:  14% 2064 MHz:  16%)
CPU 1 idle residency:  48.54%

P0-Cluster Online: 100%
P0-Cluster HW active frequency: 3077 MHz
P0-Cluster HW active residency:  98.60% (600 MHz:   0% 828 MHz:   0% 1056 MHz: .79% 1296 MHz: .03% 1524 MHz:   0% 1752 MHz:   0% 1980 MHz:   0% 2208 MHz:   0% 2448 MHz:   0% 2676 MHz: .03% 2904 MHz: .74% 3036 MHz:  43% 3132 MHz:  51% 3168 MHz: .23% 3228 MHz: 4.6%)
P0-Cluster idle residency:   1.40%
CPU 2 frequency: 3216 MHz
CPU 2 active residency:  93.87% (600 MHz:   0% 828 MHz:   0% 1056 MHz: .41% 1296 MHz: .00% 1524 MHz:   0% 1752 MHz:   0% 1980 MHz:   0% 2208 MHz:   0% 2448 MHz:   0% 2676 MHz:   0% 2904 MHz: .49% 3036 MHz: .11% 3132 MHz:   0% 3168 MHz: 1.0% 3228 MHz:  92%)
CPU 2 idle residency:   6.13%
CPU 3 frequency: 3214 MHz
CPU 3 active residency:  97.05% (600 MHz:   0% 828 MHz:   0% 1056 MHz: .45% 1296 MHz: .03% 1524 MHz:   0% 1752 MHz:   0% 1980 MHz:   0% 2208 MHz:   0% 2448 MHz:   0% 2676 MHz:   0% 2904 MHz: .66% 3036 MHz: .08% 3132 MHz:   0% 3168 MHz: .96% 3228 MHz:  95%)
CPU 3 idle residency:   2.95%
CPU 4 frequency: 3215 MHz
CPU 4 active residency:  41.05% (600 MHz:   0% 828 MHz:   0% 1056 MHz: .17% 1296 MHz: .00% 1524 MHz:   0% 1752 MHz:   0% 1980 MHz:   0% 2208 MHz:   0% 2448 MHz:   0% 2676 MHz:   0% 2904 MHz: .31% 3036 MHz: .00% 3132 MHz:   0% 3168 MHz: .87% 3228 MHz:  40%)
CPU 4 idle residency:  58.95%
CPU 5 frequency: 3213 MHz
CPU 5 active residency:  18.84% (600 MHz:   0% 828 MHz:   0% 1056 MHz: .09% 1296 MHz: .00% 1524 MHz:   0% 1752 MHz:   0% 1980 MHz:   0% 2208 MHz:   0% 2448 MHz:   0% 2676 MHz:   0% 2904 MHz: .21% 3036 MHz: .01% 3132 MHz:   0% 3168 MHz: .40% 3228 MHz:  18%)
CPU 5 idle residency:  81.16%

P1-Cluster Online: 100%
P1-Cluster HW active frequency: 1266 MHz
P1-Cluster HW active residency:   9.59% (600 MHz:  45% 828 MHz: 4.0% 1056 MHz:  14% 1296 MHz: 7.2% 1524 MHz: 6.2% 1752 MHz: 5.1% 1980 MHz: 2.3% 2208 MHz: .97% 2448 MHz: 1.6% 2676 MHz: .79% 2904 MHz: .32% 3036 MHz: .16% 3132 MHz: .42% 3168 MHz: .85% 3228 MHz:  11%)
P1-Cluster idle residency:  90.41%
CPU 6 frequency: 1813 MHz
CPU 6 active residency:   8.17% (600 MHz: .23% 828 MHz: .01% 1056 MHz: 2.1% 1296 MHz: 1.4% 1524 MHz: 1.5% 1752 MHz: .37% 1980 MHz: .29% 2208 MHz: .04% 2448 MHz: .06% 2676 MHz:   0% 2904 MHz: .28% 3036 MHz:   0% 3132 MHz: .03% 3168 MHz: .12% 3228 MHz: 1.7%)
CPU 6 idle residency:  91.83%
CPU 7 frequency: 2196 MHz
CPU 7 active residency:   1.03% (600 MHz: .03% 828 MHz: .00% 1056 MHz: .11% 1296 MHz: .20% 1524 MHz: .08% 1752 MHz: .02% 1980 MHz: .10% 2208 MHz: .00% 2448 MHz: .01% 2676 MHz:   0% 2904 MHz: .18% 3036 MHz:   0% 3132 MHz:   0% 3168 MHz: .00% 3228 MHz: .29%)
CPU 7 idle residency:  98.97%
CPU 8 frequency: 1775 MHz
CPU 8 active residency:   0.58% (600 MHz: .04% 828 MHz: .00% 1056 MHz: .19% 1296 MHz: .07% 1524 MHz: .06% 1752 MHz: .00% 1980 MHz: .05% 2208 MHz:   0% 2448 MHz: .00% 2676 MHz:   0% 2904 MHz: .03% 3036 MHz:   0% 3132 MHz:   0% 3168 MHz: .00% 3228 MHz: .13%)
CPU 8 idle residency:  99.42%
CPU 9 frequency: 2346 MHz
CPU 9 active residency:   1.49% (600 MHz: .01% 828 MHz: .00% 1056 MHz: .10% 1296 MHz: .05% 1524 MHz: .05% 1752 MHz: .52% 1980 MHz: .09% 2208 MHz:   0% 2448 MHz: .00% 2676 MHz:   0% 2904 MHz: .01% 3036 MHz:   0% 3132 MHz:   0% 3168 MHz:   0% 3228 MHz: .66%)
CPU 9 idle residency:  98.51%

CPU Power: 5128 mW
GPU Power: 68 mW
ANE Power: 0 mW
Combined Power (CPU + GPU + ANE): 5195 mW
olegoaer commented 9 months ago

Indeed. I see that "combined" is just the addition of 3 values.

metacosm commented 9 months ago

Could you add the output of powermetrics -h as well, please?

olegoaer commented 9 months ago

powermetrics -h

Usage: powermetrics [-i sample_interval] [-r order] [-t wakeup_cost]

  Gather and display CPU usage statistics (divided into time spent in
  user mode and supervisor mode), timer and interrupt wakeup frequency
  (total and, for near-idle workloads, those that resulted in package
  C-state exits), and on supported platforms, interrupt frequencies
  (categorized by CPU number), package C-state statistics (an indication
  of the time the core complex + integrated graphics, if any, were in
  low-power idle states), as well as the average execution frequency for
  each CPU when not idle.

The following command-line options are supported:

    -h | --help                  show this message

    -A | --show-all              Enables all samplers and displays all the
                                 available information for each sampler.

    -a | --poweravg <N>          display poweravg every N samples (0=disabled) [default: 10]
    -b | --buffer-size <size>    set output buffer size (0=none, 1=line)
    -f | --format <format>       display data in specified format [default: text]
    -i | --sample-rate <N>       sample every N ms (0=disabled) [default: 5000ms]
    -n | --sample-count <N>      obtain N periodic samples (-1=infinite) [default: -1]
    -o | --output-file <file>    output to file [default: stdout]
    -r | --order <method>        order process list using specified method [default: composite]
    -s | --samplers <samplers>   comma separated list of samplers and sampler groups
    -t | --wakeup-cost <N>       assume package idle wakeups have a CPU time
                                 cost of N us when using hybrid sort orders
                                 using idle wakeups with time-based metrics

    --show-initial-usage         print initial sample for entire uptime
    --show-usage-summary         print final usage summary when exiting

    --show-extra-power-info      unsupported power info (may change between releases)

    --show-pstates               show pstate distribution (XCPM only)
    --show-plimits               cpu limiting information
    --show-cpu-qos               show per cpu QOS breakdowns
    --show-cpu-scalability       show per cpu workload scalability
    --show-hwp-capability        show per cpu-thread HWP estimated efficient and guarateed frequencies (instantaneous)
    --show-process-coalition     group processes by coalitions and show per coalition information
    --show-process-wait-times    show per-process sfi wait time info
    --show-process-qos-tiers     show per-process QOS latency and throughput tiers
    --show-process-io            show per-process io information
    --show-process-gpu           show per-process gpu time
    --show-process-netstats      show per-process network information
    --show-process-qos           show QOS times aggregated by process
    --show-process-amp           show per-process AMP information
    --show-process-energy        show per-process energy impact number
                                 This implicitly enables sampling of all the
                                 above per-process statistics.
    --show-process-samp-norm     Show CPU time normailzed by the sample window.
    --handle-invalid-values      powermetrics will output invalid=true rather
                                 than abort when it sees invalid values.
    --hide-cpu-duty-cycle        hide CPU duty cycle data
    --unhide-info <samplers>     comma separated list of samplers to unhide (backwards compatibility)

The following sort orders are supported by --order:

    pid         process identifier
    wakeups     total package idle wakeups         (alias: -W)
    cputime     total CPU time used                (alias: -C)
    composite   weighted hybrid of package idle
                wakeups and CPU time used          (alias: -O)

The following output formats are supported by --format:

    text        human-readable text output
    plist       machine-readable property list, NUL-separated

This tool also implements special behavior upon receipt of certain signals
to aid with the automated collection of data:

    SIGINFO                 take an immediate sample
    SIGIO                   flush any buffered output
    SIGINT/SIGTERM/SIGHUP   stop sampling and exit

The following samplers are supported by --samplers:

    tasks             per task cpu usage and wakeup stats
    battery           battery and backlight info
    network           network usage info
    disk              disk usage info
    int_sources       interrupt sources information
    interrupts        interrupt distribution
    cpu_power         cpu power and frequency info
    thermal           thermal pressure notifications
    sfi               selective forced idle information
    gpu_power         gpu power and frequency info
    bandwidth         amc bandwidth counters
    ane_power         ane power and frequency info

and the following sampler groups are supported by --samplers:

    all           tasks,battery,network,disk,int_sources,interrupts,cpu_power,thermal,sfi,gpu_power,bandwidth,ane_power
    default       tasks,battery,network,disk,interrupts,cpu_power,gpu_power,ane_power
metacosm commented 9 months ago

🤔 OK, most of the information is the same but you have more available samplers than I do: I don't have int_sources or bandwidth. I was hoping to see what the DCS power refers to and how they define Package… maybe in the man page but this won't fit here and I'm not sure if there's a way to find all the different versions of the man page online.

adelnoureddine commented 9 months ago

DCS seems to be related to DRAM : DCS = DRAM Command Scheduler (source here and here).

metacosm commented 9 months ago

Note also that the output is not the latest powermetrics version as the OS version reported by @olegoaer is actually pretty old.

adelnoureddine commented 9 months ago

Thanks for the PR.

@olegoaer, could you check if you can update powemetrics in macOS?

@metacosm Do we know which minimum version we need to have the combined line?

metacosm commented 9 months ago

No idea, there isn't much documentation on powermetrics, unfortunately. The PR should handle both versions adequately now at the expense of a little more processing. If we could find reference documentation, we could base the parsing of the output on the OS version that's mentioned at the top but so far, I haven't been able to find authoritative information on the topic, notably because the output most likely also depend on the CPU type (Intel vs. Apple Silicon) as well.

olegoaer commented 8 months ago

FYI, I updated my OS to the latest version (OS version: 23B92) and the Combined Power value is now there.

adelnoureddine commented 8 months ago

FYI, I updated my OS to the latest version (OS version: 23B92) and the Combined Power value is now there.

Thanks. It's good to know that recent (and I assume future) versions have the combined value.