loadave

Tony Sanders sanders at cactus.org
Thu Apr 18 09:06:47 AEST 1991


In article <1991Apr17.131722.25180 at dartvax.dartmouth.edu> dav at eleazar.dartmouth.edu (William David Haas) writes:
>Does anyone out there know how to get the load average on a 6000?
This should be in the FAQ.  included is xload/get_load.c

I don't have any useful info on your other questions yet.

#if 0
>From awdprime!auschs!romp!cs.utexas.edu!news-server.csri.toronto.edu!bonnie.concordia.ca!thunder.mcrcim.mcgill.edu!snorkelwacker.mit.edu!usc!sdd.hp.com!spool.mu.edu!uwm.edu!ux1.cso.uiuc.edu!kline Sat Feb 16 12:00:03 CST 1991
Article: 3176 of comp.unix.aix
Path: awdprime!auschs!romp!cs.utexas.edu!news-server.csri.toronto.edu!bonnie.concordia.ca!thunder.mcrcim.mcgill.edu!snorkelwacker.mit.edu!usc!sdd.hp.com!spool.mu.edu!uwm.edu!ux1.cso.uiuc.edu!kline
From: kline at ux1.cso.uiuc.edu (Charley Kline)
Newsgroups: comp.unix.aix
Subject: Re: X11R4 xload
Keywords: X11R4
Message-ID: <1991Jan31.195110.19739 at ux1.cso.uiuc.edu>
Date: 31 Jan 91 19:51:10 GMT
References: <10133 at ncar.ucar.edu>
Organization: University of Illinois at Urbana
Lines: 110

boote at bierstadt.scd.ucar.edu (Jeff W. Boote) writes:
>Has anyone successfully ported the xload client from R4?  If anyone out
>there has a patchfile for it I would be most appreciative!  If not, hints
>and any information from attempts would be nice.

AIX doesn't keep the load average information in the kernel, so you have to
do the math yourself. Just replace the get_load.c module with the one below
and you should be all set. You also need to include -lm in the libraries
since GetLoadPoint() calls the exp() function.

Good luck.

________________________________________________________________________
Charley Kline, KB9FFK, PP-ASEL                          c-kline at uiuc.edu
University of Illinois Computing Services            Packet: kb9ffk at w9yh
1304 W. Springfield Ave, Urbana IL  61801                 (217) 333-3339


----------------------------------------------------/begin included text
#endif /* 0 */
/*
 * This version of this module (get_load.c) is specifically for the IBM
 * S/6000 AIX 3.1 platform.
 *
 *  Charley Kline, University of Illinois Computing Services
 *  c-kline at uiuc.edu
 */


#include <stdio.h>
#include <X11/Xos.h>
#include <X11/Intrinsic.h>

#include <sys/sysinfo.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <math.h>
#include <nlist.h>

struct nlist kernelnames[] = {
    {"sysinfo", 0, 0, 0, 0, 0},
    {NULL, 0, 0, 0, 0, 0},
    };


/* ARGSUSED */
void GetLoadPoint(w, closure, call_data)
    Widget w;  /* unused */
    caddr_t closure;  /* unused */
    caddr_t call_data;  /* pointer to (double) return value */
    {
    static double avenrun = 0.;
    double loadav;
    struct sysinfo si;
    static int rq_old = 0, ro_old = 0;
    static initted = 0;
    static int fd;
    double multiplier;
    double t;

    /*
    ** Do stuff we only need to do once per invocation, like opening
    ** the kmem file and fetching the parts of the symbol table.
    */
    if (!initted) {
	initted = 1;
	knlist(kernelnames, 1, sizeof (struct nlist));
	fd = open("/dev/kmem", O_RDONLY);
	if (fd < 0) {
	    perror("kmem");
	    exit(1);
	    }
	}
    
    /*
    ** Get the system info structure from the running kernel.
    */
    lseek(fd, kernelnames[0].n_value, SEEK_SET);
    read(fd, &si, sizeof (struct sysinfo));

    /*
    ** AIX doesn't keep the load average variables in the kernel; all
    ** we can get is the current number of runnable processes by
    ** observing the difference between the runque and runocc values
    ** in sysinfo, and dividing. Having done this, however, we can apply
    ** a TENEX-style exponential time-average to it by computing an
    ** averaging multiplier based on the sampling interval. This is then
    ** used to factor in the current number of runnable processes to our
    ** running load average. The result "looks right" when observed in
    ** conjunction with the process table and user activity.
    **
    ** We subtract one from the number of running processes given us by
    ** the kernel because for some reason AIX always calls one of the
    ** kprocs "runnable" even though it uses very little CPU. Subtracting
    ** this out gives a load average near zero when the machine is mostly
    ** idle, which is more familiar to those of us who are used to
    ** bsd-style load averages.                   /cvk
    */
    t = (double)(si.runocc - ro_old);
    loadav = (double)(si.runque - rq_old) / t - 1.0;
    rq_old = si.runque;
    ro_old = si.runocc;
    multiplier = exp(-t/60.);
    avenrun = multiplier * avenrun + (1.0 - multiplier) * loadav;
    /* DEBUG
    printf("%d %d %f %f %f\n", si.runque, si.runocc, t, loadav, avenrun);
    */

    *(double *)call_data = avenrun;
}



More information about the Comp.unix.aix mailing list