From 81c51b59aacaa66d90d571ee19a2deeda1d45271 Mon Sep 17 00:00:00 2001 From: Shrikanth Hegde Date: Tue, 14 May 2024 20:46:43 +0530 Subject: [PATCH] lparstat: app: Use pic value at boot for accurate boot time reporting When there are no options specified for lparstat, it is expected to give reports since LPAR(Logical Partition) boot. APP(Available Physical Processors) is an indicator for available cores in an Shared Processor LPAR(SPLPAR). APP is derived using pool_idle_time which is obtained using H_PIC call. The interval based reports show correct APP value while since boot report shows very high APP values. This happens because in that case APP is obtained by dividing pool idle time by LPAR uptime. Since pool idle time is reported by the PowerVM hypervisor since its boot, it need not align with LPAR boot. To fix that use the boot pool idle time added newly in the lparcfg as below. APP = (pool idle time - boot pool idle time) / (uptime * timebase) *This depends on "powerpc/pseries: Add pool idle time at LPAR boot" be merged into kernel* Results: (Observe APP values) ======================================================================== lparstat System Configuration type=Shared mode=Uncapped smt=8 lcpu=12 mem=15573440 kB cpus=37 ent=12.00 reboot stress-ng --cpu=$(nproc) -t 600 sleep 600 So in this case app is expected to close to 37-6=31. ====== 6.9-rc1 and lparstat 1.3.10 ============= %user %sys %wait %idle physc %entc lbusy app vcsw phint ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 47.48 0.01 0.00 52.51 0.00 0.00 47.49 69099.72 541547 21 === With this patch and this patch to do the above equation === %user %sys %wait %idle physc %entc lbusy app vcsw phint ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 47.48 0.01 0.00 52.51 5.73 47.75 47.49 31.21 541753 21 Signed-off-by: Shrikanth Hegde Signed-off-by: Tyrel Datwyler --- src/lparstat.c | 3 ++- src/lparstat.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lparstat.c b/src/lparstat.c index 9d9ba1b..30889b2 100644 --- a/src/lparstat.c +++ b/src/lparstat.c @@ -460,7 +460,8 @@ void get_cpu_app(struct sysentry *unused_se, char *buf) se = get_sysentry("pool_idle_time"); new_app = strtoll(se->value, NULL, 0); if (se->old_value[0] == '\0') { - old_app = 0; + se = get_sysentry("boot_pool_idle_time"); + old_app = strtoll(se->value, NULL, 0); } else { old_app = strtoll(se->old_value, NULL, 0); } diff --git a/src/lparstat.h b/src/lparstat.h index b7c88e9..77203e1 100644 --- a/src/lparstat.h +++ b/src/lparstat.h @@ -124,6 +124,8 @@ struct sysentry system_data[] = { .get = &get_percent_entry}, {.name = "pool_idle_time", .descr = "Shared Processor Pool Idle Time"}, + {.name = "boot_pool_idle_time", + .descr = "Shared Processor Pool Idle Time"}, {.name = "pool_num_procs", .descr = "Shared Processor Pool Processors"}, {.name = "unallocated_capacity_weight",