BSD 4 release
[unix-history] / usr / src / cmd / iostat.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)iostat.c 4.2 (Berkeley) 10/19/80";
be974f30
BJ
2/*
3 * iostat
4 */
5#include <nlist.h>
6#include <sys/dk.h>
7
8struct 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};
29struct
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
42int mf;
43double etime;
44
45main(argc, argv)
46char *argv[];
47{
48 extern char *ctime();
49 register i;
50 int iter;
51 double f1, f2;
52 long t;
8b6704d4 53 int tohdr = 1;
be974f30
BJ
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]);
be974f30 74loop:
8b6704d4
BJ
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 }
be974f30
BJ
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");
127contin:
128 --iter;
129 if(iter)
130 if(argc > 1) {
131 sleep(atoi(argv[1]));
132 goto loop;
133 }
134}
135
136stats(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
168stat1(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}