Turbostat version 2024.04.10
Use of the CPU MSR driver is now optional. Perf is now preferred for many counters. Non-root users can now execute turbostat, though with limited function. Add counters for some new GFX hardware. Minor fixes. -----BEGIN PGP SIGNATURE----- iQJIBAABCgAyFiEE67dNfPFP+XUaA73mB9BFOha3NhcFAmYWj4MUHGxlbi5icm93 bkBpbnRlbC5jb20ACgkQB9BFOha3NhdH+RAArg3G1VJz2+wQGVyLqjSt4waz7nR4 3wc0BNYCZOnInvLqWRoWjs7w2e8CzfdVHYEAFc9N3mM2FVU+LlSJuEf78if8BWZ4 2ROXCKs2X9I4MMFFvGy4ugOsjSs9jIvYjiWUgaFNL79Fvgi4xZCIPs5cg0j4EOU9 P2N2z3YMiO88wcGwzaH1v/hODSJ2hRhQ38KSmeIzVv64727OqLo/TIWrGMIUedBT sliYrojz202IoArbejfCqP7VtZhnLml6Rln+n8/X3rg3n25RYbaZnwYugkR8WmhZ stC0CmB6Rz9IN9yeucq+BlXDOUUUvLQwat3OHw7oZ6zg0+Uu1yD0aPXoqreiZvC3 iJUr+Qy++NFYmMPRDTWZubdPDAcwuv+PWud2VDfqY8Jgld2GzhucBBmGA+z1NMAl gRXFnaUc9R7c/+ubh+R7mrlQxiRk2Jt4VduJ9wdufEWKIaIGDh/1qyFLFKOP32Ko zviEOV3WAJHbAGYZUUIzlKmhyQFafuyKbb/o0AO3VvqhCO0vGkzA4yauzkSYGpqo 8IlNgJxBs0dQqTXOw5ubgnazfjvHB//kBYfvJL9Sg2nuHdQV8+0X/DfYsxvRNo/i 9khvJF5MPnzb/sgIRXQphWxL6hwZYcx4LfRv6PQD8g7aKwAcs0D/VzcB5fZ+KM+a TViqVjUkJ4LSaJ0= =oucB -----END PGP SIGNATURE----- Merge tag 'turbostat-2024.04.10' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux Pull turbostat updates from Len Brown: - Use of the CPU MSR driver is now optional - Perf is now preferred for many counters - Non-root users can now execute turbostat, though with limited functionality - Add counters for some new GFX hardware - Minor fixes * tag 'turbostat-2024.04.10' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux: (26 commits) tools/power turbostat: v2024.04.10 tools/power/turbostat: Add support for Xe sysfs knobs tools/power/turbostat: Add support for new i915 sysfs knobs tools/power/turbostat: Introduce BIC_SAM_mc6/BIC_SAMMHz/BIC_SAMACTMHz tools/power/turbostat: Fix uncore frequency file string tools/power/turbostat: Unify graphics sysfs snapshots tools/power/turbostat: Cache graphics sysfs path tools/power/turbostat: Enable MSR_CORE_C1_RES support for ICX tools/power turbostat: Add selftests tools/power turbostat: read RAPL counters via perf tools/power turbostat: Add proper re-initialization for perf file descriptors tools/power turbostat: Clear added counters when in no-msr mode tools/power turbostat: add early exits for permission checks tools/power turbostat: detect and disable unavailable BICs at runtime tools/power turbostat: Add reading aperf and mperf via perf API tools/power turbostat: Add --no-perf option tools/power turbostat: Add --no-msr option tools/power turbostat: enhance -D (debug counter dump) output tools/power turbostat: Fix warning upon failed /dev/cpu_dma_latency read tools/power turbostat: Read base_hz and bclk from CPUID.16H if available ...
This commit is contained in:
commit
a6189a7407
|
@ -22577,6 +22577,7 @@ Q: https://patchwork.kernel.org/project/linux-pm/list/
|
||||||
B: https://bugzilla.kernel.org
|
B: https://bugzilla.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux.git turbostat
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux.git turbostat
|
||||||
F: tools/power/x86/turbostat/
|
F: tools/power/x86/turbostat/
|
||||||
|
F: tools/testing/selftests/turbostat/
|
||||||
|
|
||||||
TW5864 VIDEO4LINUX DRIVER
|
TW5864 VIDEO4LINUX DRIVER
|
||||||
M: Bluecherry Maintainers <maintainers@bluecherrydvr.com>
|
M: Bluecherry Maintainers <maintainers@bluecherrydvr.com>
|
||||||
|
|
|
@ -67,6 +67,10 @@ The column name "all" can be used to enable all disabled-by-default built-in cou
|
||||||
.PP
|
.PP
|
||||||
\fB--quiet\fP Do not decode and print the system configuration header information.
|
\fB--quiet\fP Do not decode and print the system configuration header information.
|
||||||
.PP
|
.PP
|
||||||
|
+\fB--no-msr\fP Disable all the uses of the MSR driver.
|
||||||
|
+.PP
|
||||||
|
+\fB--no-perf\fP Disable all the uses of the perf API.
|
||||||
|
+.PP
|
||||||
\fB--interval seconds\fP overrides the default 5.0 second measurement interval.
|
\fB--interval seconds\fP overrides the default 5.0 second measurement interval.
|
||||||
.PP
|
.PP
|
||||||
\fB--num_iterations num\fP number of the measurement iterations.
|
\fB--num_iterations num\fP number of the measurement iterations.
|
||||||
|
@ -125,9 +129,17 @@ The system configuration dump (if --quiet is not used) is followed by statistics
|
||||||
.PP
|
.PP
|
||||||
\fBPkgTmp\fP Degrees Celsius reported by the per-package Package Thermal Monitor.
|
\fBPkgTmp\fP Degrees Celsius reported by the per-package Package Thermal Monitor.
|
||||||
.PP
|
.PP
|
||||||
\fBGFX%rc6\fP The percentage of time the GPU is in the "render C6" state, rc6, during the measurement interval. From /sys/class/drm/card0/power/rc6_residency_ms.
|
\fBGFX%rc6\fP The percentage of time the GPU is in the "render C6" state, rc6, during the measurement interval. From /sys/class/drm/card0/power/rc6_residency_ms or /sys/class/drm/card0/gt/gt0/rc6_residency_ms or /sys/class/drm/card0/device/tile0/gtN/gtidle/idle_residency_ms depending on the graphics driver being used.
|
||||||
.PP
|
.PP
|
||||||
\fBGFXMHz\fP Instantaneous snapshot of what sysfs presents at the end of the measurement interval. From /sys/class/graphics/fb0/device/drm/card0/gt_cur_freq_mhz.
|
\fBGFXMHz\fP Instantaneous snapshot of what sysfs presents at the end of the measurement interval. From /sys/class/graphics/fb0/device/drm/card0/gt_cur_freq_mhz or /sys/class/drm/card0/gt_cur_freq_mhz or /sys/class/drm/card0/gt/gt0/rps_cur_freq_mhz or /sys/class/drm/card0/device/tile0/gtN/freq0/cur_freq depending on the graphics driver being used.
|
||||||
|
.PP
|
||||||
|
\fBGFXAMHz\fP Instantaneous snapshot of what sysfs presents at the end of the measurement interval. From /sys/class/graphics/fb0/device/drm/card0/gt_act_freq_mhz or /sys/class/drm/card0/gt_act_freq_mhz or /sys/class/drm/card0/gt/gt0/rps_act_freq_mhz or /sys/class/drm/card0/device/tile0/gtN/freq0/act_freq depending on the graphics driver being used.
|
||||||
|
.PP
|
||||||
|
\fBSAM%mc6\fP The percentage of time the SA Media is in the "module C6" state, mc6, during the measurement interval. From /sys/class/drm/card0/gt/gt1/rc6_residency_ms or /sys/class/drm/card0/device/tile0/gtN/gtidle/idle_residency_ms depending on the graphics driver being used.
|
||||||
|
.PP
|
||||||
|
\fBSAMMHz\fP Instantaneous snapshot of what sysfs presents at the end of the measurement interval. From /sys/class/drm/card0/gt/gt1/rps_cur_freq_mhz or /sys/class/drm/card0/device/tile0/gtN/freq0/cur_freq depending on the graphics driver being used.
|
||||||
|
.PP
|
||||||
|
\fBSAMAMHz\fP Instantaneous snapshot of what sysfs presents at the end of the measurement interval. From /sys/class/drm/card0/gt/gt1/rps_act_freq_mhz or /sys/class/drm/card0/device/tile0/gtN/freq0/act_freq depending on the graphics driver being used.
|
||||||
.PP
|
.PP
|
||||||
\fBPkg%pc2, Pkg%pc3, Pkg%pc6, Pkg%pc7\fP percentage residency in hardware package idle states. These numbers are from hardware residency counters.
|
\fBPkg%pc2, Pkg%pc3, Pkg%pc6, Pkg%pc7\fP percentage residency in hardware package idle states. These numbers are from hardware residency counters.
|
||||||
.PP
|
.PP
|
||||||
|
@ -370,7 +382,7 @@ below the processor's base frequency.
|
||||||
|
|
||||||
Busy% = MPERF_delta/TSC_delta
|
Busy% = MPERF_delta/TSC_delta
|
||||||
|
|
||||||
Bzy_MHz = TSC_delta/APERF_delta/MPERF_delta/measurement_interval
|
Bzy_MHz = TSC_delta*APERF_delta/MPERF_delta/measurement_interval
|
||||||
|
|
||||||
Note that these calculations depend on TSC_delta, so they
|
Note that these calculations depend on TSC_delta, so they
|
||||||
are not reliable during intervals when TSC_MHz is not running at the base frequency.
|
are not reliable during intervals when TSC_MHz is not running at the base frequency.
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,60 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
from shutil import which
|
||||||
|
|
||||||
|
turbostat = which('turbostat')
|
||||||
|
if turbostat is None:
|
||||||
|
print('Could not find turbostat binary')
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
timeout = which('timeout')
|
||||||
|
if timeout is None:
|
||||||
|
print('Could not find timeout binary')
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
proc_turbostat = subprocess.run([turbostat, '--list'], capture_output = True)
|
||||||
|
if proc_turbostat.returncode != 0:
|
||||||
|
print(f'turbostat failed with {proc_turbostat.returncode}')
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
#
|
||||||
|
# By default --list reports also "usec" and "Time_Of_Day_Seconds" columns
|
||||||
|
# which are only visible when running with --debug.
|
||||||
|
#
|
||||||
|
expected_columns_debug = proc_turbostat.stdout.replace(b',', b'\t').strip()
|
||||||
|
expected_columns = expected_columns_debug.replace(b'usec\t', b'').replace(b'Time_Of_Day_Seconds\t', b'').replace(b'X2APIC\t', b'').replace(b'APIC\t', b'')
|
||||||
|
|
||||||
|
#
|
||||||
|
# Run turbostat with no options for 10 seconds and send SIGINT
|
||||||
|
#
|
||||||
|
timeout_argv = [timeout, '--preserve-status', '-s', 'SIGINT', '-k', '3', '1s']
|
||||||
|
turbostat_argv = [turbostat, '-i', '0.250']
|
||||||
|
|
||||||
|
print(f'Running turbostat with {turbostat_argv=}... ', end = '', flush = True)
|
||||||
|
proc_turbostat = subprocess.run(timeout_argv + turbostat_argv, capture_output = True)
|
||||||
|
if proc_turbostat.returncode != 0:
|
||||||
|
print(f'turbostat failed with {proc_turbostat.returncode}')
|
||||||
|
exit(1)
|
||||||
|
actual_columns = proc_turbostat.stdout.split(b'\n')[0]
|
||||||
|
if expected_columns != actual_columns:
|
||||||
|
print(f'turbostat column check failed\n{expected_columns=}\n{actual_columns=}')
|
||||||
|
exit(1)
|
||||||
|
print('OK')
|
||||||
|
|
||||||
|
#
|
||||||
|
# Same, but with --debug
|
||||||
|
#
|
||||||
|
turbostat_argv.append('--debug')
|
||||||
|
|
||||||
|
print(f'Running turbostat with {turbostat_argv=}... ', end = '', flush = True)
|
||||||
|
proc_turbostat = subprocess.run(timeout_argv + turbostat_argv, capture_output = True)
|
||||||
|
if proc_turbostat.returncode != 0:
|
||||||
|
print(f'turbostat failed with {proc_turbostat.returncode}')
|
||||||
|
exit(1)
|
||||||
|
actual_columns = proc_turbostat.stdout.split(b'\n')[0]
|
||||||
|
if expected_columns_debug != actual_columns:
|
||||||
|
print(f'turbostat column check failed\n{expected_columns_debug=}\n{actual_columns=}')
|
||||||
|
exit(1)
|
||||||
|
print('OK')
|
Loading…
Reference in New Issue