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