Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!godot!harvard!wjh12!foxvax1!brunix!ddj From: ddj@brunix.UUCP (Dave Johnson) Newsgroups: net.sources.bugs Subject: Re: System Monitoring Program (MON) Message-ID: <11150@brunix.UUCP> Date: Wed, 12-Dec-84 04:05:25 EST Article-I.D.: brunix.11150 Posted: Wed Dec 12 04:05:25 1984 Date-Received: Fri, 14-Dec-84 05:35:17 EST References: rlgvax.290, <6317@brl-tgr.ARPA> <1533@sdcrdcf.UUCP> Lines: 579 I've made some changes to mon in addition to those posted by Jonathan Biggar in article <1533@sdcrdcf.UUCP>, and by Guy Harris in article <290@rlgvax.UUCP>. 1) Added code to report the number of forks and vforks during each interval (this number is usually small enough to get rounded to zero if you convert into a per-second rate, so I made it a raw number). 2) Removed three redundant kmem lseek/read calls. dk_mspw doesn't change after the system is booted (nor does dk_bps on the sun), so reading it in mon.c should suffice. Also dk_xfer isn't used in vm.c, it's read in io.c already. Finally, hz doesn't change while the program is running either. 3) Added a test for no disks at all before printing the total disk activity -- makes it just a tad prettier on a diskless sun. 4) Fixed the disk statistics code to work on either VAXen or Suns. Sun's disk drivers maintain a byte/second figure for each drive rather than Berkeley's millisecond/word. 5) Fixed the load average code for Suns -- they keep the value as scaled integers rather than as doubles. 6) Fixed the interrupt/second code for Suns -- they don't count clock interrupts, Berkeley does. Dave Johnson Brown University CS Dept. {ihnp4,decvax,allegra}!brunix!ddj ddj%brown.CSNET@csnet-relay.ARPA ------------------ diff -c org/display.c sun/display.c *** org/display.c Tue Dec 11 23:17:24 1984 --- sun/display.c Tue Dec 11 23:42:01 1984 *************** *** 37,42 mvprintw(PAGEY,LEFT,"Paging: re at pin pout oprs fr def sr"); mvprintw(PAGEY+3,LEFT," nxf xf nzf zf nrf rf prf swi swo"); mvprintw(CHARY,CHARX,"Char: in out"); mvprintw(NETIFY,LEFT,"Name Ipkts Ierrs Opkts Oerrs Collis Oqueue"); /* add the disk drive names to the screen */ --- 37,43 ----- mvprintw(PAGEY,LEFT,"Paging: re at pin pout oprs fr def sr"); mvprintw(PAGEY+3,LEFT," nxf xf nzf zf nrf rf prf swi swo"); mvprintw(CHARY,CHARX,"Char: in out"); + mvprintw(FORKY,FORKX,"Forks: fork vfork"); mvprintw(NETIFY,LEFT,"Name Ipkts Ierrs Opkts Oerrs Collis Oqueue"); /* add the disk drive names to the screen */ diff -c org/io.c sun/io.c *** org/io.c Tue Dec 11 23:22:10 1984 --- sun/io.c Tue Dec 11 23:42:29 1984 *************** *** 37,46 read(kmem, &s.tk_nout, sizeof s.tk_nout); lseek(kmem, (long)namelist[X_DK_SEEK].n_value, 0); read(kmem, s.dk_seek, sizeof s.dk_seek); - lseek(kmem, (long)namelist[X_DK_MSPW].n_value, 0); - read(kmem, s.dk_mspw, sizeof s.dk_mspw); - lseek(kmem, (long)namelist[X_HZ].n_value, 0); - read(kmem, &hz, sizeof hz); for (i = 0; i < DK_NDRIVE; i++) { #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time); --- 37,42 ----- read(kmem, &s.tk_nout, sizeof s.tk_nout); lseek(kmem, (long)namelist[X_DK_SEEK].n_value, 0); read(kmem, s.dk_seek, sizeof s.dk_seek); for (i = 0; i < DK_NDRIVE; i++) { #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time); *************** *** 60,66 } } /* Display Totals */ ! mvprintw(lasty+2, DISKX+DISKOFF, "%4.0f%4.0f", tkbps, ttps); } /* --- 58,65 ----- } } /* Display Totals */ ! if (lasty != 0) ! mvprintw(lasty+2, DISKX+DISKOFF, "%4.0f%4.0f", tkbps, ttps); } /* *************** *** 83,89 return(0); lasty = y; ! if (s.dk_mspw[dn] == 0.0) { mvprintw(y,DISKX+DISKOFF,"%4.0f%4.0f%5.1f", 0.0, 0.0, 0.0); return(0); } --- 82,88 ----- return(0); lasty = y; ! if (s.dk_xfer[dn] == 0) { mvprintw(y,DISKX+DISKOFF,"%4.0f%4.0f%5.1f", 0.0, 0.0, 0.0); return(0); } *************** *** 90,96 atime = s.dk_time[dn]; atime /= (float) hz; words = s.dk_wds[dn]*32.0; /* number of 16 bit words transferred */ ! xtime = s.dk_mspw[dn]*words; /* transfer time */ itime = atime - xtime; /* time not transferring (seek time) */ if (xtime < 0) --- 89,99 ----- atime = s.dk_time[dn]; atime /= (float) hz; words = s.dk_wds[dn]*32.0; /* number of 16 bit words transferred */ ! #ifdef sun ! xtime = words*2/s.dk_bps[dn]; ! #else sun ! xtime = s.dk_mspw[dn]*words; /* transfer time */ ! #endif sun itime = atime - xtime; /* time not transferring (seek time) */ if (xtime < 0) diff -c org/mon.c sun/mon.c *** org/mon.c Tue Dec 11 23:24:20 1984 --- sun/mon.c Tue Dec 11 23:47:47 1984 *************** *** 19,25 */ struct nlist namelist[] = { { "_dk_busy" }, { "_dk_mspw" }, { "_hz" }, { "_cp_time" }, { "_rate" }, --- 19,29 ----- */ struct nlist namelist[] = { { "_dk_busy" }, ! #ifdef sun ! { "_dk_bps" }, ! #else sun ! { "_dk_mspw" }, ! #endif sun { "_hz" }, { "_cp_time" }, { "_rate" }, *************** *** 35,40 { "_tk_nin" }, { "_tk_nout" }, { "_avenrun" }, #ifdef DUALCPU { "_cp2_time" }, /* 2nd CPU stats */ { "_slavestart" }, /* Used to detect 2nd CPU */ --- 39,45 ----- { "_tk_nin" }, { "_tk_nout" }, { "_avenrun" }, + { "_forkstat" }, #ifdef DUALCPU { "_cp2_time" }, /* 2nd CPU stats */ { "_slavestart" }, /* Used to detect 2nd CPU */ *************** *** 70,77 /* * do all things that need to be done only once */ ! lseek(kmem, (long)namelist[X_DK_MSPW].n_value, 0); ! read(kmem, s.dk_mspw, sizeof s.dk_mspw); lseek(kmem, (long)namelist[X_HZ].n_value, 0); read(kmem, &hz, sizeof hz); read_names(); --- 75,90 ----- /* * do all things that need to be done only once */ ! #ifdef sun ! lseek(kmem, (long)namelist[X_DK_BPS].n_value, 0); ! read(kmem, s.dk_bps, sizeof s.dk_bps); ! #else sun ! lseek(kmem, (long)namelist[X_DK_MSPW].n_value, 0); ! read(kmem, s.dk_mspw, sizeof s.dk_mspw); ! #endif sun ! /* prime the fork counters so we don't see forks since boot */ ! lseek(kmem, (long)namelist[X_FORKSTAT].n_value, 0); ! read(kmem, &s1.forkstat, sizeof s1.forkstat); lseek(kmem, (long)namelist[X_HZ].n_value, 0); read(kmem, &hz, sizeof hz); read_names(); *************** *** 113,119 /* get load average */ lseek(kmem, (long)namelist[LOADAV].n_value, 0); read(kmem, &loadavg[0], sizeof loadavg); ! mvprintw(0,13,"%4.2f %4.2f %4.2f %4.2f", loadavg[3], loadavg[0], loadavg[1], loadavg[2]); time(&clock); mvprintw(0,40,ctime(&clock)); dispupdate(); --- 123,135 ----- /* get load average */ lseek(kmem, (long)namelist[LOADAV].n_value, 0); read(kmem, &loadavg[0], sizeof loadavg); ! #ifdef sun ! mvprintw(0,13,"%4.2f %4.2f %4.2f", ! loadavg[0]/256., loadavg[1]/256., loadavg[2]/256.); ! #else sun ! mvprintw(0,13,"%4.2f %4.2f %4.2f %4.2f", ! loadavg[3], loadavg[0], loadavg[1], loadavg[2]); ! #endif sun time(&clock); mvprintw(0,40,ctime(&clock)); dispupdate(); diff -c org/mon.h sun/mon.h *** org/mon.h Tue Dec 11 23:38:35 1984 --- sun/mon.h Tue Dec 11 23:51:25 1984 *************** *** 16,22 * definition of namelist in main. */ #define X_DK_BUSY 0 ! #define X_DK_MSPW 1 #define X_HZ 2 #define X_CP_TIME 3 #define X_RATE 4 --- 16,26 ----- * definition of namelist in main. */ #define X_DK_BUSY 0 ! #ifdef sun ! #define X_DK_BPS 1 ! #else sun ! #define X_DK_MSPW 1 ! #endif sun #define X_HZ 2 #define X_CP_TIME 3 #define X_RATE 4 *************** *** 32,37 #define X_TK_NIN 14 #define X_TK_NOUT 15 #define LOADAV 16 #ifdef DUALCPU #define X_CP_TIME2 17 /* 2nd CPU stats */ #define X_SLAVESTART 18 /* 2nd cpu existance test */ --- 36,42 ----- #define X_TK_NIN 14 #define X_TK_NOUT 15 #define LOADAV 16 + #define X_FORKSTAT 17 #ifdef DUALCPU #define X_CP_TIME2 18 /* 2nd CPU stats */ #define X_SLAVESTART 19 /* 2nd cpu existance test */ *************** *** 33,40 #define X_TK_NOUT 15 #define LOADAV 16 #ifdef DUALCPU ! #define X_CP_TIME2 17 /* 2nd CPU stats */ ! #define X_SLAVESTART 18 /* 2nd cpu existance test */ #endif DUALCPU extern struct nlist namelist[]; --- 38,45 ----- #define LOADAV 16 #define X_FORKSTAT 17 #ifdef DUALCPU ! #define X_CP_TIME2 18 /* 2nd CPU stats */ ! #define X_SLAVESTART 19 /* 2nd cpu existance test */ #endif DUALCPU extern struct nlist namelist[]; *************** *** 46,52 int kmem, hz; int deficit; double etime; ! double loadavg[4]; /* drive names and numbers */ char dr_name[DK_NDRIVE][10]; --- 51,61 ----- int kmem, hz; int deficit; double etime; ! #ifdef sun ! long loadavg[3]; ! #else sun ! double loadavg[4]; ! #endif sun /* drive names and numbers */ char dr_name[DK_NDRIVE][10]; *************** *** 88,94 long dk_wds[DK_NDRIVE]; long dk_seek[DK_NDRIVE]; long dk_xfer[DK_NDRIVE]; ! float dk_mspw[DK_NDRIVE]; long tk_nin; long tk_nout; struct vmmeter Rate; --- 97,107 ----- long dk_wds[DK_NDRIVE]; long dk_seek[DK_NDRIVE]; long dk_xfer[DK_NDRIVE]; ! #ifdef sun ! long dk_bps[DK_NDRIVE]; ! #else sun ! float dk_mspw[DK_NDRIVE]; ! #endif sun long tk_nin; long tk_nout; struct vmmeter Rate; *************** *** 93,98 long tk_nout; struct vmmeter Rate; struct vmtotal Total; } s, s1; #define rate s.Rate --- 106,112 ----- long tk_nout; struct vmmeter Rate; struct vmtotal Total; + struct forkstat forkstat; } s, s1; #define rate s.Rate *************** *** 109,113 #define CHARY 5 #define CHARX 37 #define NETIFY 17 ! #define DISKY 2 #define DISKX 55 --- 123,129 ----- #define CHARY 5 #define CHARX 37 #define NETIFY 17 ! #define DISKY 5 #define DISKX 55 #define FORKY 2 #define FORKX 55 *************** *** 111,113 #define NETIFY 17 #define DISKY 2 #define DISKX 55 --- 125,129 ----- #define NETIFY 17 #define DISKY 5 #define DISKX 55 + #define FORKY 2 + #define FORKX 55 diff -c org/readnames.c sun/readnames.c *** org/readnames.c Tue Dec 11 23:05:00 1984 --- sun/readnames.c Tue Dec 11 22:52:53 1984 *************** *** 6,13 */ #include "mon.h" #include/* needed by following two includes */ ! #include /* unibus adapters */ ! #include /* massbus adapters */ #define steal(where, var) lseek(kmem, where, 0); read(kmem, &var, sizeof var); --- 6,18 ----- */ #include "mon.h" #include /* needed by following two includes */ ! #ifdef vax ! #include /* unibus adapters */ ! #include /* massbus adapters */ ! #endif vax ! #ifdef sun ! #include /* multibus */ ! #endif sun #define steal(where, var) lseek(kmem, where, 0); read(kmem, &var, sizeof var); *************** *** 13,18 read_names() { struct mba_device mdev; register struct mba_device *mp; struct mba_driver mdrv; --- 18,24 ----- read_names() { + #ifdef vax struct mba_device mdev; register struct mba_device *mp; struct mba_driver mdrv; *************** *** 16,21 struct mba_device mdev; register struct mba_device *mp; struct mba_driver mdrv; short two_char; char *cp = (char *) &two_char; struct uba_device udev, *up; --- 22,33 ----- struct mba_device mdev; register struct mba_device *mp; struct mba_driver mdrv; + #endif vax + #ifdef sun + struct mb_device mdev; + register struct mb_device *mp; + struct mb_driver mdrv; + #endif sun short two_char; char *cp = (char *) &two_char; #ifdef vax *************** *** 18,23 struct mba_driver mdrv; short two_char; char *cp = (char *) &two_char; struct uba_device udev, *up; struct uba_driver udrv; --- 30,36 ----- #endif sun short two_char; char *cp = (char *) &two_char; + #ifdef vax struct uba_device udev, *up; struct uba_driver udrv; *************** *** 45,48 sprintf(dr_name[udev.ui_dk], "%c%c%d", cp[0], cp[1], udev.ui_unit); dr_unit[udev.ui_dk] = udev.ui_unit; } } --- 58,76 ----- sprintf(dr_name[udev.ui_dk], "%c%c%d", cp[0], cp[1], udev.ui_unit); dr_unit[udev.ui_dk] = udev.ui_unit; } + #endif vax + #ifdef sun + mp = (struct mb_device *) namelist[X_MBDINIT].n_value; + if (mp) for (;;) { + steal(mp++, mdev); + if (mdev.md_driver == 0) + break; + if (mdev.md_dk < 0 || mdev.md_alive == 0) + continue; + steal(mdev.md_driver, mdrv); + steal(mdrv.mdr_dname, two_char); + sprintf(dr_name[mdev.md_dk], "%c%c%d", cp[0], cp[1], mdev.md_unit); + dr_unit[mdev.md_dk] = mdev.md_unit; + } + #endif sun } diff -c org/vm.c sun/vm.c *** org/vm.c Tue Dec 11 23:33:33 1984 --- sun/vm.c Tue Dec 11 23:43:37 1984 *************** *** 27,34 read(kmem, s.cp_time2, sizeof s.cp_time2); } #endif DUALCPU - lseek(kmem, (long)namelist[X_DK_XFER].n_value, 0); - read(kmem, s.dk_xfer, sizeof s.dk_xfer); lseek(kmem, (long)namelist[X_RATE].n_value, 0); read(kmem, &rate, sizeof rate); lseek(kmem, (long)namelist[X_TOTAL].n_value, 0); --- 27,32 ----- read(kmem, s.cp_time2, sizeof s.cp_time2); } #endif DUALCPU lseek(kmem, (long)namelist[X_RATE].n_value, 0); read(kmem, &rate, sizeof rate); lseek(kmem, (long)namelist[X_TOTAL].n_value, 0); *************** *** 35,40 read(kmem, &total, sizeof total); lseek(kmem, (long)namelist[X_DEFICIT].n_value, 0); read(kmem, &deficit, sizeof deficit); etime = 0; for (i=0; i < CPUSTATES; i++) { t = s.cp_time[i]; --- 33,40 ----- read(kmem, &total, sizeof total); lseek(kmem, (long)namelist[X_DEFICIT].n_value, 0); read(kmem, &deficit, sizeof deficit); + lseek(kmem, (long)namelist[X_FORKSTAT].n_value, 0); + read(kmem, &s.forkstat, sizeof s.forkstat); etime = 0; for (i=0; i < CPUSTATES; i++) { t = s.cp_time[i]; *************** *** 73,79 , pgtok(deficit), rate.v_scan); /* Display CPU info */ ! mvprintw(CPUY+1,5,"%4d %4d", (rate.v_intr) - hz, rate.v_syscall); mvprintw(CPUY+1,17,"%4d", rate.v_swtch); #ifdef DUALCPU if (dualcpu) --- 73,83 ----- , pgtok(deficit), rate.v_scan); /* Display CPU info */ ! #ifdef sun ! mvprintw(CPUY+1,5,"%4d %4d", rate.v_intr, rate.v_syscall); ! #else ! mvprintw(CPUY+1,5,"%4d %4d", (rate.v_intr) - hz, rate.v_syscall); ! #endif sun mvprintw(CPUY+1,17,"%4d", rate.v_swtch); #ifdef DUALCPU if (dualcpu) *************** *** 80,85 mvprintw(CPUY+1,30,"%4d", rate.v_swtch2); #endif DUALCPU cputime(); /* Display additional stuff */ mvprintw(PAGEY+4,6,"%4d%4d %4d%4d %4d%4d %4d %4d%4d", --- 84,98 ----- mvprintw(CPUY+1,30,"%4d", rate.v_swtch2); #endif DUALCPU cputime(); + /* Display FORK info */ + t = s.forkstat.cntfork; + s.forkstat.cntfork -= s1.forkstat.cntfork; + s1.forkstat.cntfork = t; + t = s.forkstat.cntvfork; + s.forkstat.cntvfork -= s1.forkstat.cntvfork; + s1.forkstat.cntvfork = t; + mvprintw(FORKY+1,FORKX+6,"%5d %5d", + s.forkstat.cntfork, s.forkstat.cntvfork); /* Display additional stuff */ mvprintw(PAGEY+4,6,"%4d%4d %4d%4d %4d%4d %4d %4d%4d",