home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / perfmon / barmon.c < prev    next >
C/C++ Source or Header  |  1992-05-08  |  6KB  |  226 lines

  1. static char *what = "@(#)barmon.c    1.7 1/18/92 (c) 1991 Larry McVoy";
  2. #include <stdio.h>
  3. #include <curses.h>
  4. #include <sys/dk.h>
  5. #include <time.h>
  6. #include <signal.h>
  7. #include <sys/time.h>
  8. #include <ctype.h>
  9. #include <rpcsvc/rstat.h>
  10.  
  11. #define    LABEL        10
  12. /*
  13.  * XXX - this should be an array of structs.
  14.  */
  15. #define    USRLABEL    "[% USER CPU]"
  16. #define    USRWID        11
  17. #define    USRLEFT        LABEL
  18. #define    USRRIGHT    (USRLEFT+USRWID)
  19. #define    SYSLABEL    "[% SYS CPU ]" 
  20. #define    SYSWID        11
  21. #define    SYSLEFT        (USRRIGHT+1)
  22. #define    SYSRIGHT    (SYSLEFT+SYSWID)
  23. #define    PKTFMT        "[PKTS %5d]"
  24. #define    PKTWID        11
  25. #define    PKTLEFT        (SYSRIGHT+1)
  26. #define    PKTRIGHT    (PKTLEFT+PKTWID)
  27. #define    PKTADJUST    100
  28. #define    DISKFMT        "[DISK %5d]"
  29. #define    DISKWID        11
  30. #define    DISKLEFT    (PKTRIGHT+1)
  31. #define    DISKRIGHT    (DISKLEFT+DISKWID)
  32. #define    DISKADJUST    10
  33. #define    PAGEFMT        "[PAGE %5d]"
  34. #define    PAGEWID        11
  35. #define    PAGELEFT    (DISKRIGHT+1)
  36. #define    PAGERIGHT    (PAGELEFT+PAGEWID)
  37. #define    PAGEADJUST    10
  38. #define    SLPDEFAULT    5
  39. #define    sane(x)        ((x) > 100000 ? (-1) : (x))
  40. #define    scale(x)    sane(secs == 1 ? (x) : (x) / secs)
  41. #define    sleep(x)    usleep(1000000 * (x))
  42.  
  43. char    **hosts;
  44. struct    statstime *orig, *new;
  45. struct    mystat {
  46.     int    usr;
  47.     int    sys;
  48.     int    pkt;
  49.     int    page;
  50.     int    disk;
  51. }    *save;
  52. int    secs;
  53. int    n;
  54. int    pagemax = 10, pktmax = 100, diskmax = 20;
  55. int    newpagemax = 10, newpktmax = 100, newdiskmax = 20;
  56. catch() {}
  57.  
  58. main(ac, av)
  59.     char    **av;
  60. {
  61.     int    i;
  62.     char    *calloc();
  63.     struct    itimerval it;
  64.     time_t    clock;
  65.  
  66.     if (isdigit(av[ac - 1][0])) {
  67.         secs =  atoi(av[ac - 1]);
  68.         ac--;
  69.     } else {
  70.         secs = SLPDEFAULT;
  71.     }
  72.     hosts = (char**)calloc(ac, sizeof(char *));
  73.     orig = (struct statstime*)calloc(ac, sizeof(struct statstime));
  74.     new = (struct statstime*)calloc(ac, sizeof(struct statstime));
  75.     save = (struct mystat*)calloc(ac, sizeof(struct mystat));
  76.  
  77.     /*
  78.      * Go through it once to fire up all the rstatd's.
  79.      */
  80.     for (i = 1; i < ac; ++i) {
  81.         if (rstat(av[i], &orig[i - 1]) == 0) {
  82.             hosts[n++] = av[i];
  83.         } else {
  84.             perror(av[i]);
  85.             exit(1);
  86.         }
  87.     }
  88.  
  89.     /*
  90.      * Initialize
  91.      * XXX - cath sigint and restore modes?
  92.      */
  93.     initscr();
  94.     clear();
  95.     mvaddstr(0, USRLEFT, USRLABEL);
  96.     mvaddstr(0, SYSLEFT, SYSLABEL);
  97.     mvprintw(0, PKTLEFT, PKTFMT, pktmax);
  98.     mvprintw(0, DISKLEFT, DISKFMT, diskmax);
  99.     mvprintw(0, PAGELEFT, PAGEFMT, pagemax);
  100.     for(i = 1; i < ac; ++i) {
  101.         if (strlen(av[i]) >= LABEL)
  102.             av[i][LABEL] = 0;    /* XXX off by 1? */
  103.         mvaddstr(i, 0, av[i]);
  104.         mvaddch(i, USRLEFT, '[');
  105.         mvaddch(i, USRRIGHT, ']');
  106.         mvaddch(i, SYSLEFT, '[');
  107.         mvaddch(i, SYSRIGHT, ']');
  108.         mvaddch(i, PKTLEFT, '[');
  109.         mvaddch(i, PKTRIGHT, ']');
  110.         mvaddch(i, DISKLEFT, '[');
  111.         mvaddch(i, DISKRIGHT, ']');
  112.         mvaddch(i, PAGELEFT, '[');
  113.         mvaddch(i, PAGERIGHT, ']');
  114.     }
  115.  
  116.     /*
  117.      * Set up an interval timer - this should help get rid of delays.
  118.      */
  119.     it.it_interval.tv_sec = secs;
  120.     it.it_interval.tv_usec = secs;
  121.     it.it_value.tv_sec = secs;
  122.     it.it_value.tv_usec = secs;
  123.     signal(SIGALRM, catch);
  124.     setitimer(ITIMER_REAL, &it, 0);
  125.     sigblock(sigmask(SIGALRM));
  126.  
  127.     /*
  128.      * Do it again now that it is fast.
  129.      */
  130.     for (i = 0; i < ac - 1; ++i) {
  131.         rstat(hosts[i], &orig[i]);
  132.     }
  133.     while (1) {
  134.         /*
  135.          * We need the signal handling because of the fact that the
  136.          * rstat could be infinitely long.
  137.          * XXX - need corbin's async rpc's.
  138.          */
  139.         sigpause(0);
  140.         newpktmax = newdiskmax = newpagemax = 0;
  141.         for (i = 0; i < ac - 1; ++i) {
  142.             getstats(i);
  143.         }
  144. #define    adjustmax(n, o, a)    if (n > o) { \
  145.                     o = ((n + a - 1) / a) * a; \
  146.                 } else if (n < o / 2) { \
  147.                     o /= 2; \
  148.                     o = ((o + a - 1) / a) * a; \
  149.                 }
  150.         adjustmax(newdiskmax, diskmax, DISKADJUST);
  151.         adjustmax(newpktmax, pktmax, PKTADJUST);
  152.         adjustmax(newpagemax, pagemax, PAGEADJUST);
  153.         mvprintw(0, PKTLEFT, PKTFMT, pktmax);
  154.         mvprintw(0, DISKLEFT, DISKFMT, diskmax);
  155.         mvprintw(0, PAGELEFT, PAGEFMT, pagemax);
  156.         for (i = 0; i < ac - 1; ++i) {
  157.             display(i);
  158.         }
  159.         time(&clock);
  160.         mvprintw(23, 0, "%.24s", ctime(&clock));
  161.         refresh();
  162.     }
  163. }
  164.  
  165. /*
  166.  * Get the statistics and rescale
  167.  */
  168. getstats(i)
  169. {
  170.     int    y, u, s, d, pkt, pg, pos;
  171.  
  172.     if (rstat(hosts[i], &new[i]) != 0) {
  173.         perror(hosts[i]);
  174.         exit(1);
  175.     }
  176.     u = scale(new[i].cp_time[0] - orig[i].cp_time[0]);
  177.     s = scale(new[i].cp_time[2] - orig[i].cp_time[2]);
  178.     pkt = scale(new[i].if_ipackets - orig[i].if_ipackets) +
  179.         scale(new[i].if_opackets - orig[i].if_opackets);
  180.     d = scale(new[i].dk_xfer[0] - orig[i].dk_xfer[0]) +
  181.         scale(new[i].dk_xfer[1] - orig[i].dk_xfer[1]) +
  182.         scale(new[i].dk_xfer[2] - orig[i].dk_xfer[2]) +
  183.         scale(new[i].dk_xfer[3] - orig[i].dk_xfer[3]);
  184.     pg = scale(new[i].v_pgpgin - orig[i].v_pgpgin) +
  185.         scale(new[i].v_pgpgout - orig[i].v_pgpgout);
  186.     while (u + s > 100)    /* timing errors */
  187.         u--, s--;
  188.  
  189. #define    adjust(x, w, m)    if (x > m) x = m; \
  190.             x = (x + ((m/(w-1) / 2))) * (w - 1) / m;
  191.     adjust(u, USRWID, 100);
  192.     adjust(s, SYSWID, 100);
  193.     if (newpktmax < pkt)
  194.         newpktmax = pkt;
  195.     adjust(pkt, PKTWID, pktmax);
  196.     if (newdiskmax < d)
  197.         newdiskmax = d;
  198.     adjust(d, DISKWID, diskmax);
  199.     if (newpagemax < pg)
  200.         newpagemax = pg;
  201.     adjust(pg, PAGEWID, pagemax);
  202.     save[i].usr = u;
  203.     save[i].sys = s;
  204.     save[i].pkt = pkt;
  205.     save[i].disk = d;
  206.     save[i].page = pg;
  207.     orig[i] = new[i];
  208. }
  209.  
  210. display(i)
  211. {
  212.     int    y, pos;
  213.  
  214.     y = i + 1;
  215.     for (pos = USRLEFT + 1; pos < USRRIGHT; ++pos)
  216.         mvaddch(y, pos, save[i].usr-- > 0 ? 'U' : ' ');
  217.     for (pos = SYSLEFT + 1; pos < SYSRIGHT; ++pos)
  218.         mvaddch(y, pos, save[i].sys-- > 0 ? 'S' : ' ');
  219.     for (pos = PKTLEFT + 1; pos < PKTRIGHT; ++pos)
  220.         mvaddch(y, pos, save[i].pkt-- > 0 ? 'N' : ' ');
  221.     for (pos = DISKLEFT + 1; pos < DISKRIGHT; ++pos)
  222.         mvaddch(y, pos, save[i].disk-- > 0 ? 'D' : ' ');
  223.     for (pos = PAGELEFT + 1; pos < PAGERIGHT; ++pos)
  224.         mvaddch(y, pos, save[i].page-- > 0 ? 'P' : ' ');
  225. }
  226.