Monitoring CPU time
Francois Tigeot
ftigeot at wolfpond.org
Thu Apr 8 13:34:04 PDT 2010
On Mon, Apr 05, 2010 at 07:00:06PM +0200, Francois Tigeot wrote:
> On Mon, Apr 05, 2010 at 09:21:41AM -0700, Matthew Dillon wrote:
> >
> > systat -pv 1
> >
> > In terms of extracting it in a script... I dunno about that.
>
> I'm beginning to think I will need to write a C program for that. top(1)
> uses a kinfo_proc structure to get its data and AFAIK there's no easy-to-use
> sysctl.
>
> systat and vmstat give only an instant snapshot of the system state with
> 1 second precision or so. An average on 5 minutes would be much better for my
> purposes.
I have written a small C program to obtain the same sort of results
sysctl kern.cp_time returns on Free, Open and possibly NetBSD.
The actual values are a sum of the relevant fields on all CPUs. You just have
to be careful to adjust N_CPUS.
--
Francois Tigeot
/*
* cp_time.c
* returns user,nice,system,intr and idle values from cputime counters
* similar to some BSDs kern.cp_time sysctl
*/
#include <stdio.h>
#include <kinfo.h>
#define N_CPUS 2
int main( void ) {
int cpu, len;
struct kinfo_cputime cp_t[N_CPUS];
uint64_t user, nice, sys, intr, idle;
bzero( cp_t, sizeof(struct kinfo_cputime)*N_CPUS );
len = sizeof( cp_t[0]) * N_CPUS;
if (sysctlbyname("kern.cputime", &cp_t, &len, NULL, 0))
err(1, "kern.cputime");
user = nice = sys = intr = idle = 0;
/* Sum up cp_time for all cpus */
for (cpu = 0; cpu < N_CPUS; cpu++) {
user += cp_t[cpu].cp_user;
nice += cp_t[cpu].cp_nice;
sys += cp_t[cpu].cp_sys;
intr += cp_t[cpu].cp_intr;
idle += cp_t[cpu].cp_idle;
}
printf("%llu %llu %llu %llu %llu\n", user, nice, sys, intr, idle );
return 0;
}
More information about the Users
mailing list