home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / iostat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.3 KB  |  272 lines

  1. int    bflg;
  2. int    dflg;
  3. int    tflg;
  4. int    iflg;
  5. int    aflg;
  6. int    sflg;
  7. struct
  8. {
  9.     char    name[8];
  10.     int    type;
  11.     unsigned    value;
  12. } nl[] = {
  13.     "_dk_busy", 0, 0,
  14.     "_io_info", 0, 0,
  15.     "\0\0\0\0\0\0\0\0", 0, 0
  16. };
  17. struct
  18. {
  19.     int    busy;
  20.     long    etime[32];
  21.     long    numb[3];
  22.     long    wds[3];
  23.     long    tin;
  24.     long    tout;
  25. } s, s1;
  26.  
  27. struct iostat {
  28.     int    nbuf;
  29.     long    nread;
  30.     long    nreada;
  31.     long    ncache;
  32.     long    nwrite;
  33.     long    bufcount[50];
  34. } io_info, io_delta;
  35. double    etime;
  36.  
  37. int    mf;
  38.  
  39. main(argc, argv)
  40. char *argv[];
  41. {
  42.     extern char *ctime();
  43.     register  i;
  44.     int iter;
  45.     double f1, f2;
  46.     long t;
  47.  
  48.     nlist("/unix", nl);
  49.     if(nl[0].type == -1) {
  50.         printf("dk_busy not found in /unix namelist\n");
  51.         exit(1);
  52.     }
  53.     mf = open("/dev/kmem", 0);
  54.     if(mf < 0) {
  55.         printf("cannot open /dev/kmem\n");
  56.         exit(1);
  57.     }
  58.     iter = 0;
  59.     while (argc>1&&argv[1][0]=='-') {
  60.         if (argv[1][1]=='d')
  61.             dflg++;
  62.         else if (argv[1][1]=='s')
  63.             sflg++;
  64.         else if (argv[1][1]=='a')
  65.             aflg++;
  66.         else if (argv[1][1]=='t')
  67.             tflg++;
  68.         else if (argv[1][1]=='i')
  69.             iflg++;
  70.         else if (argv[1][1]=='b')
  71.             bflg++;
  72.         argc--;
  73.         argv++;
  74.     }
  75.     if(argc > 2)
  76.         iter = atoi(argv[2]);
  77.     if (!(sflg|iflg)) {
  78.     if(tflg)
  79.         printf("         TTY");
  80.     if (bflg==0)
  81.     printf("   RF                RK                RP                  PERCENT\n");
  82.     if(tflg)
  83.         printf("   tin  tout");
  84.     if (bflg==0)
  85.     printf("   tpm  msps  mspt   tpm  msps  mspt   tpm  msps  mspt  user  nice systm  idle\n");
  86.     }
  87.  
  88. loop:
  89.     lseek(mf, (long)nl[0].value, 0);
  90.     read(mf, (char *)&s, sizeof s);
  91.     for(i=0; i<40; i++) {
  92.         t = s.etime[i];
  93.         s.etime[i] -= s1.etime[i];
  94.         s1.etime[i] = t;
  95.     }
  96.     t = 0;
  97.     for(i=0; i<32; i++)
  98.         t += s.etime[i];
  99.     etime = t;
  100.     if(etime == 0.)
  101.         etime = 1.;
  102.     if (bflg) {
  103.         biostats();
  104.         goto contin;
  105.     }
  106.     if (dflg) {
  107.         long tm;
  108.         time(&tm);
  109.         printf("%s", ctime(&tm));
  110.     }
  111.     if (aflg)
  112.         printf("%.2f minutes total\n", etime/3600);
  113.     if (sflg) {
  114.         stats2(etime);
  115.         goto contin;
  116.     }
  117.     if (iflg) {
  118.         stats3(etime);
  119.         goto contin;
  120.     }
  121.     etime /= 60.;
  122.     if(tflg) {
  123.         f1 = s.tin;
  124.         f2 = s.tout;
  125.         printf("%6.1f", f1/etime);
  126.         printf("%6.1f", f2/etime);
  127.     }
  128.     for(i=0; i<3; i++)
  129.         stats(i);
  130.     for(i=0; i<4; i++)
  131.         stat1(i*8);
  132.     printf("\n");
  133. contin:
  134.     --iter;
  135.     if(iter)
  136.     if(argc > 1) {
  137.         sleep(atoi(argv[1]));
  138.         goto loop;
  139.     }
  140. }
  141.  
  142. /* usec per word for the various disks */
  143. double    xf[] = {
  144.     16.0,    /* RF */
  145.     11.1,    /* RK03/05 */
  146.     2.48,    /* RP06 */
  147. };
  148.  
  149. stats(dn)
  150. {
  151.     register i;
  152.     double f1, f2, f3;
  153.     double f4, f5, f6;
  154.     long t;
  155.  
  156.     t = 0;
  157.     for(i=0; i<32; i++)
  158.         if(i & (1<<dn))
  159.             t += s.etime[i];
  160.     f1 = t;
  161.     f1 = f1/60.;
  162.     f2 = s.numb[dn];
  163.     if(f2 == 0.) {
  164.         printf("%6.0f%6.1f%6.1f", 0.0, 0.0, 0.0);
  165.         return;
  166.     }
  167.     f3 = s.wds[dn];
  168.     f3 = f3*32.;
  169.     f4 = xf[dn];
  170.     f4 = f4*1.0e-6;
  171.     f5 = f1 - f4*f3;
  172.     f6 = f1 - f5;
  173.     printf("%6.0f", f2*60./etime);
  174.     printf("%6.1f", f5*1000./f2);
  175.     printf("%6.1f", f6*1000./f2);
  176. }
  177.  
  178. stat1(o)
  179. {
  180.     register i;
  181.     long t;
  182.     double f1, f2;
  183.  
  184.     t = 0;
  185.     for(i=0; i<32; i++)
  186.         t += s.etime[i];
  187.     f1 = t;
  188.     if(f1 == 0.)
  189.         f1 = 1.;
  190.     t = 0;
  191.     for(i=0; i<8; i++)
  192.         t += s.etime[o+i];
  193.     f2 = t;
  194.     printf("%6.2f", f2*100./f1);
  195. }
  196.  
  197. stats2(t)
  198. double t;
  199. {
  200.     register i, j;
  201.  
  202.     for (i=0; i<4; i++) {
  203.         for (j=0; j<8; j++)
  204.             printf("%6.2f\n", s.etime[8*i+j]/(t/100));
  205.         printf("\n");
  206.     }
  207. }
  208.  
  209. stats3(t)
  210. double t;
  211. {
  212.     register i;
  213.     double sum;
  214.  
  215.     t /= 100;
  216.     printf("%6.2f idle\n", s.etime[24]/t);
  217.     sum = 0;
  218.     for (i=0; i<8; i++)
  219.         sum += s.etime[i];
  220.     printf("%6.2f user\n", sum/t);
  221.     sum = 0;
  222.     for (i=0; i<8; i++)
  223.         sum += s.etime[8+i];
  224.     printf("%6.2f nice\n", sum/t);
  225.     sum = 0;
  226.     for (i=0; i<8; i++)
  227.         sum += s.etime[16+i];
  228.     printf("%6.2f system\n", sum/t);
  229.     sum = 0;
  230.     for (i=1; i<8; i++)
  231.         sum += s.etime[24+i];
  232.     printf("%6.2f IO wait\n", sum/t);
  233.     sum = 0;
  234.     for (i=1; i<8; i++)
  235.         sum += s.etime[i]+s.etime[i+8]+s.etime[i+16]+s.etime[i+24];
  236.     printf("%6.2f IO active\n", sum/t);
  237.     sum = 0;
  238.     for (i=0; i<32; i++)
  239.         if (i&01)
  240.             sum += s.etime[i];
  241.     printf("%6.2f RF active\n", sum/t);
  242.     sum = 0;
  243.     for (i=0; i<32; i++)
  244.         if (i&02)
  245.             sum += s.etime[i];
  246.     printf("%6.2f RK active\n", sum/t);
  247.     sum = 0;
  248.     for (i=0; i<32; i++)
  249.         if (i&04)
  250.             sum += s.etime[i];
  251.     printf("%6.2f RP active\n", sum/t);
  252. }
  253.  
  254. biostats()
  255. {
  256. register i;
  257.  
  258.     lseek(mf,(long)nl[1].value, 0);
  259.     read(mf, (char *)&io_info, sizeof(io_info));
  260.     printf("%D\t%D\t%D\t%D\n",
  261.      io_info.nread-io_delta.nread, io_info.nreada-io_delta.nreada,
  262.      io_info.ncache-io_delta.ncache, io_info.nwrite-io_delta.nwrite);
  263.  
  264.     for(i=0; i<30; ) {
  265.         printf("%D\t",(long)io_info.bufcount[i]-io_delta.bufcount[i]);
  266.         i++;
  267.         if (i % 10 == 0)
  268.             printf("\n");
  269.     }
  270.     io_delta = io_info;
  271. }
  272.