From e23f63b019a7dd72afd9eebe124797e410df39e3 Mon Sep 17 00:00:00 2001 From: Christian Goettsche Date: Sun, 18 Apr 2021 16:41:49 +0200 Subject: [PATCH] FreeBSD: scale CPU% usage on swap time See https://forums.freebsd.org/threads/how-does-cpu-utilization-is-calculates.12108/ and https://iris.cs.tu-dortmund.de/freebsd-lockdoc/lockdoc-v13.0-0.7/source/bin/ps/print.c#L650 --- freebsd/FreeBSDProcessTable.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/freebsd/FreeBSDProcessTable.c b/freebsd/FreeBSDProcessTable.c index ce8472594..68969c1d7 100644 --- a/freebsd/FreeBSDProcessTable.c +++ b/freebsd/FreeBSDProcessTable.c @@ -165,6 +165,13 @@ void ProcessTable_goThroughEntries(ProcessTable* super) { int count = 0; const struct kinfo_proc* kprocs = kvm_getprocs(fhost->kd, KERN_PROC_PROC, 0, &count); + int ccpu; + size_t size = sizeof(ccpu); + if (sysctlbyname("kern.ccpu", &ccpu, &size, NULL, 0) == -1) { + ccpu = 0; + } + const double decayfactor = log(ccpu / fhost->kernelFScale); + for (int i = 0; i < count; i++) { const struct kinfo_proc* kproc = &kprocs[i]; bool preExisting = false; @@ -234,7 +241,7 @@ void ProcessTable_goThroughEntries(ProcessTable* super) { proc->nlwp = kproc->ki_numthreads; proc->time = (kproc->ki_runtime + 5000) / 10000; - proc->percent_cpu = 100.0 * ((double)kproc->ki_pctcpu / (double)fhost->kernelFScale); + proc->percent_cpu = 100.0 * ((double)kproc->ki_pctcpu / (double)fhost->kernelFScale) / (1.0 - exp(kproc->ki_swtime * decayfactor)); proc->percent_mem = 100.0 * proc->m_resident / (double)(host->totalMem); Process_updateCPUFieldWidths(proc->percent_cpu);