Thursday, February 5, 2009

Drawing CPU part of boot chart

I'm using kstat for drawing CPU part of boot chart (see my previous posts). I need cpu values for "user","nice","system","idle","iowait" in such order (sample output):
cpu 8 0 141 313 230 0 0 

I've written the small kstat utility and added its call in a bootchartd script (utility writes /var/log/bootchart/proc_stat.log):
#include <kstat.h>
#include <sys/sysinfo.h>
#include <stdio.h>
#include <string.h>

static kstat_ctl_t *kc;
static kstat_t *ksp;

static unsigned int cpu_user, cpu_system, cpu_nice, cpu_idle, cpu_iowait;

int main(int argc, char **argv) {
cpu_stat_t *cpu_stat;

kc = kstat_open();

if (kc != NULL) {

ksp = kstat_lookup(kc, "cpu_stat", 0, "cpu_stat0");
if (ksp != NULL && ksp->ks_type == KSTAT_TYPE_RAW)
{
if (kstat_read(kc, ksp, NULL) != -1 &&  
ksp->ks_data_size == sizeof(cpu_stat_t))
{
  cpu_stat = (cpu_stat_t *)ksp->ks_data;
  cpu_user=cpu_stat->cpu_sysinfo.cpu[CPU_USER];
  cpu_nice=cpu_stat->cpu_sysinfo.cpu[CPU_WAIT];
  cpu_system = cpu_stat->cpu_sysinfo.cpu[CPU_KERNEL] ;
  cpu_iowait=cpu_stat->cpu_syswait.iowait;
  cpu_idle=cpu_stat->cpu_sysinfo.cpu[CPU_IDLE];

 printf("cpu  %d %d %d %d %d 0 0\n",
 cpu_user,cpu_nice,cpu_system,cpu_idle,cpu_iowait);
        }
    }
  }
}

Sample boot chart for MilaX:


6 comments:

Andre said...

Really good stuff Alex. Keep up the good work. It's inspirational.

I would like to make one of EON but I'm a bit short on time.

Andre said...

Would you mind sharing the kstat script?

.:: Aurora ::. said...

Hey Alex,

Great innovation, I'm following your work in my holiday time.
Not sure if I emailed you yet. However, we have test ISO's of AuroraUX for downloads. I hope we can work togther more to share our work for the greater good as soon as I get back to a workstation :)

Best Regards,
Edward O'Callaghan.
http://auroraux.blastwave.org/

alhazred said...

Utility source added

Andre said...

Alex can you take it further and get the /proc linux 2.6 kernel specific data somehow?

Matthew said...

How easy would it be to get some of this work made up into a package that anyone could install on OpenSolaris though IPS to get info about what's taking up all the time during boot process?

I'm currently taking 2 mins to boot, which I thought was bad but it's not far off some of your example charts, so I'm relieved! Still, with linux now on a sub 30 second boot time, there is lots of room for improvement!

Keep up the good work!