1 static char *sccsid = "@(#)iostat.c 4.2 (Berkeley) 10/19/80"; 2 /* 3 * iostat 4 */ 5 #include <nlist.h> 6 #include <sys/dk.h> 7 8 struct nlist nl[] = { 9 { "_dk_busy" }, 10 #define X_DK_BUSY 0 11 { "_dk_time" }, 12 #define X_DK_TIME 1 13 { "_dk_xfer" }, 14 #define X_DK_XFER 2 15 { "_dk_wds" }, 16 #define X_DK_WDS 3 17 { "_tk_nin" }, 18 #define X_TK_NIN 4 19 { "_tk_nout" }, 20 #define X_TK_NOUT 5 21 { "_dk_seek" }, 22 #define X_DK_SEEK 6 23 { "_cp_time" }, 24 #define X_CP_TIME 7 25 { "_dk_mspw" }, 26 #define X_DK_MSPW 8 27 { 0 }, 28 }; 29 struct 30 { 31 int dk_busy; 32 long cp_time[CPUSTATES]; 33 long dk_time[DK_NDRIVE]; 34 long dk_wds[DK_NDRIVE]; 35 long dk_seek[DK_NDRIVE]; 36 long dk_xfer[DK_NDRIVE]; 37 float dk_mspw[DK_NDRIVE]; 38 long tk_nin; 39 long tk_nout; 40 } s, s1; 41 42 int mf; 43 double etime; 44 45 main(argc, argv) 46 char *argv[]; 47 { 48 extern char *ctime(); 49 register i; 50 int iter; 51 double f1, f2; 52 long t; 53 int tohdr = 1; 54 55 nlist("/vmunix", nl); 56 if(nl[X_DK_BUSY].n_type == 0) { 57 printf("dk_busy not found in /vmunix namelist\n"); 58 exit(1); 59 } 60 mf = open("/dev/kmem", 0); 61 if(mf < 0) { 62 printf("cannot open /dev/kmem\n"); 63 exit(1); 64 } 65 iter = 0; 66 while (argc>1&&argv[1][0]=='-') { 67 argc--; 68 argv++; 69 } 70 lseek(mf, (long)nl[X_DK_MSPW].n_value, 0); 71 read(mf, s.dk_mspw, sizeof s.dk_mspw); 72 if(argc > 2) 73 iter = atoi(argv[2]); 74 loop: 75 if (--tohdr == 0) { 76 printf(" TTY"); 77 for (i = 0; i < DK_NDRIVE; i++) 78 if (s.dk_mspw[i] != 0.0) 79 printf(" D%d ", i); 80 printf(" CPU\n"); 81 printf(" tin tout"); 82 for (i = 0; i < DK_NDRIVE; i++) 83 if (s.dk_mspw[i] != 0.0) 84 printf(" sps tps msps "); 85 printf(" us ni sy id\n"); 86 tohdr = 19; 87 } 88 lseek(mf, (long)nl[X_DK_BUSY].n_value, 0); 89 read(mf, &s.dk_busy, sizeof s.dk_busy); 90 lseek(mf, (long)nl[X_DK_TIME].n_value, 0); 91 read(mf, s.dk_time, sizeof s.dk_time); 92 lseek(mf, (long)nl[X_DK_XFER].n_value, 0); 93 read(mf, s.dk_xfer, sizeof s.dk_xfer); 94 lseek(mf, (long)nl[X_DK_WDS].n_value, 0); 95 read(mf, s.dk_wds, sizeof s.dk_wds); 96 lseek(mf, (long)nl[X_TK_NIN].n_value, 0); 97 read(mf, &s.tk_nin, sizeof s.tk_nin); 98 lseek(mf, (long)nl[X_TK_NOUT].n_value, 0); 99 read(mf, &s.tk_nout, sizeof s.tk_nout); 100 lseek(mf, (long)nl[X_DK_SEEK].n_value, 0); 101 read(mf, s.dk_seek, sizeof s.dk_seek); 102 lseek(mf, (long)nl[X_CP_TIME].n_value, 0); 103 read(mf, s.cp_time, sizeof s.cp_time); 104 lseek(mf, (long)nl[X_DK_MSPW].n_value, 0); 105 read(mf, s.dk_mspw, sizeof s.dk_mspw); 106 for (i = 0; i < DK_NDRIVE; i++) { 107 #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t 108 X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time); 109 } 110 t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t; 111 t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t; 112 etime = 0; 113 for(i=0; i<CPUSTATES; i++) { 114 X(cp_time); 115 etime += s.cp_time[i]; 116 } 117 if (etime == 0.0) 118 etime = 1.0; 119 etime /= 60.0; 120 printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime); 121 for (i=0; i<DK_NDRIVE; i++) 122 if (s.dk_mspw[i] != 0.0) 123 stats(i); 124 for (i=0; i<CPUSTATES; i++) 125 stat1(i); 126 printf("\n"); 127 contin: 128 --iter; 129 if(iter) 130 if(argc > 1) { 131 sleep(atoi(argv[1])); 132 goto loop; 133 } 134 } 135 136 stats(dn) 137 { 138 register i; 139 double atime, words, xtime, itime; 140 141 if (s.dk_mspw[dn] == 0.0) { 142 printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0); 143 return; 144 } 145 atime = s.dk_time[dn]; 146 atime /= 60.0; 147 words = s.dk_wds[dn]*32.0; /* number of words transferred */ 148 xtime = s.dk_mspw[dn]*words; /* transfer time */ 149 itime = atime - xtime; /* time not transferring */ 150 /* 151 printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n", 152 dn, words, atime, xtime, itime); 153 */ 154 if (xtime < 0) 155 itime += xtime, xtime = 0; 156 if (itime < 0) 157 xtime += itime, itime = 0; 158 printf("%4.0f", s.dk_seek[dn]/etime); 159 printf("%4.0f", s.dk_xfer[dn]/etime); 160 printf("%5.1f ", 161 s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0); 162 /* 163 printf("%4.1f", 164 s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0); 165 */ 166 } 167 168 stat1(o) 169 { 170 register i; 171 double time; 172 173 time = 0; 174 for(i=0; i<CPUSTATES; i++) 175 time += s.cp_time[i]; 176 if (time == 0.0) 177 time = 1.0; 178 printf("%3.0f", 100*s.cp_time[o]/time); 179 } 180