/* * IOSTAT * * For use with the 2.9 BSD (Berkeley PDP11) system. */ #include #ifndef DISKMON #define DISKMON /* force definition for systm.h */ #endif #include #include #include #define MAXDISK 6 /* max disks that can be monitored */ #define LSTDRV 0 /* last bit for drives (seek only) */ /* usec per word for the various disks */ double xf[MAXDISK] = { 2.48, /* RM02 */ 2.48, /* RM02 */ 11.1 /* RK05 */ /* 1.95, Ampex 9300/Diva Comp 5 (33 sect.) */ /* 2.05, RS04 */ }; int bflg; int dflg; int iflg; int aflg; int sflg; int oflg; /* Data only, no summary line, no headers */ int uflg; struct nlist nl[] = { #define X_DKBUSY 0 "_dk_busy", 0, 0, #define X_SYTIME 1 "_sy_time", 0, 0, #define X_DKTIME 2 "_dk_time", 0, 0, #define X_DKNUMB 3 "_dk_numb", 0, 0, #define X_DKWDS 4 "_dk_wds", 0, 0, #define X_NDISK 5 "_ndisk", 0, 0, #define X_TIN 6 "_tk_nin", 0, 0, #define X_TOUT 7 "_tk_nout", 0, 0, #define X_IOINFO 8 "_io_info", 0, 0, #define X_UBMETER 9 "_ub_meter", 0, 0, "\0\0\0\0\0\0\0\0", 0, 0 }; struct { int busy; long sy_time[8]; long dk_time[1<1&&argv[1][0]=='-') { if (argv[1][1]=='d') dflg++; else if (argv[1][1]=='s') sflg++; else if (argv[1][1]=='a') aflg++; else if (argv[1][1]=='i') iflg++; else if (argv[1][1]=='b') bflg++; else if (argv[1][1]=='o') oflg++; else if (argv[1][1]=='u') uflg++; argc--; argv++; } if(argc > 2) iter = atoi(argv[2]); if(oflg && (iter != 0)) iter+=1; lseek(mf, (long)nl[X_NDISK].n_value, 0); read(mf, (char *)&ndisk, sizeof ndisk); if (ndisk <=0 || ndisk > MAXDISK || ndisk <= LSTDRV) { fprintf(stderr, "Too many disks monitored (or system mismatch)\n"); exit(1); } if (!(sflg|iflg|oflg|bflg|uflg)) { printf(" TTY "); for (i=0; i <= LSTDRV; i++) printf(" DK%d SEEK",i); for ( ; i < ndisk; i++) printf(" DK%d TRANSFER ",i); printf(" PERCENT\n"); printf("tin tout"); for (i=0; i <= LSTDRV; i++) printf(" sps msps"); for ( ; i < ndisk; i++) printf(" tps msps mspt"); printf(" usr nic sys idle\n"); } if(iflg&&!oflg) { printf(" RESOURCE USAGE (in percent)\n"); printf(" user nice sys idle iowt iact"); for (i=0; i <= LSTDRV; i++) printf(" dk%ds",i); for ( ; i < ndisk; i++) printf(" dk%dx",i); printf("\n"); } if (bflg && !oflg) { printf(" BUFFER CACHE USAGE\n"); printf("read reada cache write\n"); } if (uflg && !oflg) { printf(" UNIBUS MAP USAGE\n"); printf("requests buffer remaps raw i/o pages allocation failures\n"); } loop: if (bflg) { biostats(); goto contin; } if (uflg) { unibusstats(); goto contin; } lseek(mf, (long)nl[X_DKBUSY].n_value, 0); read(mf, (char *)&(s.busy), sizeof (s.busy)); lseek(mf, (long)nl[X_SYTIME].n_value, 0); read(mf, (char *)&(s.sy_time), sizeof (s.sy_time)); lseek(mf, (long)nl[X_DKTIME].n_value, 0); read(mf, (char *)&(s.dk_time), (1 << ndisk) * sizeof (s.dk_time[0])); lseek(mf, (long)nl[X_DKNUMB].n_value, 0); read(mf, (char *)&(s.numb), ndisk * sizeof (s.numb[0])); lseek(mf, (long)nl[X_DKWDS].n_value, 0); read(mf, (char *)&(s.wds), ndisk * sizeof (s.wds[0])); lseek(mf, (long)nl[X_TIN].n_value, 0); read(mf, (char *)&(s.tin), sizeof (s.tin)); lseek(mf, (long)nl[X_TOUT].n_value, 0); read(mf, (char *)&(s.tout), sizeof (s.tout)); etime = 0; for(i=0; i < 8; i++) { t = s.sy_time[i]; s.sy_time[i] -= s1.sy_time[i]; s1.sy_time[i] = t; etime += s.sy_time[i]; } if(etime == 0.) etime = 1.; for(i=0; i < (1 << ndisk); i++) { t = s.dk_time[i]; s.dk_time[i] -= s1.dk_time[i]; s1.dk_time[i] = t; } for(i=0; i < ndisk; i++) { t = s.numb[i]; s.numb[i] -= s1.numb[i]; s1.numb[i] = t; t = s.wds[i]; s.wds[i] -= s1.wds[i]; s1.wds[i] = t; } t = s.tin; s.tin -= s1.tin; s1.tin = t; t = s.tout; s.tout -= s1.tout; s1.tout = t; if(oflg && skip) { skip =0; goto contin; } if (dflg) { long tm; time(&tm); printf("%s", ctime(&tm)); } if (aflg) printf("%.2f minutes total\n", etime/3600); if (sflg) { stats2(etime); goto contin; } if (iflg) { stats3(etime); goto contin; } etime /= 60.; f1 = s.tin; f2 = s.tout; printf(" %3.0f", f1/etime); printf(" %3.0f", f2/etime); for(i=0; i 1) { sleep(atoi(argv[1])); goto loop; } } stats(dn) { register i; double f1, f2, f3; double f4, f5, f6; long t; t = 0; for(i=0; i < (1<LSTDRV) printf(" %4.0f %4.1f %4.1f", 0.0, 0.0, 0.0); else printf(" %4.0f %4.1f", 0.0, 0.0); return; } f3 = s.wds[dn]; f3 = f3*32.; f4 = xf[dn]; f4 = f4*1.0e-6; f5 = f1 - f4*f3; f6 = f1 - f5; printf(" %4.0f", f2/etime); printf(" %4.1f", f5*1000./f2); if(dn >LSTDRV) printf(" %4.1f", f6*1000./f2); /* no xfer time for seeks */ } stat1(o) { double f; f = s.sy_time[2*o] +s.sy_time[2*o+1]; printf(" %3.0f", f*(100./60.)/etime); } stats2(t) double t; { register i, j; t /= 100.; printf("sy_time: "); for (j=0; j<8; j++) printf("%6.2f ", s.sy_time[j]/t); printf("\ndk_time: "); for (j=0; j < (1<