|
|
1.1 root 1: /*
2: * iostat
3: */
4: #include <nlist.h>
5: #include <sys/dk.h>
6: #include "/usr/sys/h/param.h"
7: /* this is a botch, fix sys/buf.h */
8: #define KERNEL
9: #include "/usr/sys/h/buf.h"
10:
11: struct nlist nl[] = {
12: { "_dk_busy" },
13: #define X_DK_BUSY 0
14: { "_dk_time" },
15: #define X_DK_TIME 1
16: { "_dk_xfer" },
17: #define X_DK_XFER 2
18: { "_dk_wds" },
19: #define X_DK_WDS 3
20: { "_tk_nin" },
21: #define X_TK_NIN 4
22: { "_tk_nout" },
23: #define X_TK_NOUT 5
24: { "_dk_seek" },
25: #define X_DK_SEEK 6
26: { "_cp_time" },
27: #define X_CP_TIME 7
28: { "_dk_mspw" },
29: #define X_DK_MSPW 8
30: { "_io_info" },
31: #define X_DK_INFO 9
32: { "_io_wait" },
33: #define X_IO_WAIT 10
34: { 0 },
35: };
36: struct
37: {
38: int dk_busy;
39: long cp_time[CPUSTATES];
40: long dk_time[DK_NDRIVE];
41: long dk_wds[DK_NDRIVE];
42: long dk_seek[DK_NDRIVE];
43: long dk_xfer[DK_NDRIVE];
44: float dk_mspw[DK_NDRIVE];
45: struct {
46: int nbuf;
47: long nread, nreada, ncache, nwrite;
48: long whyread[W_LAST+1], whycache[W_LAST+1];
49: } io_info;
50: long io_wait;
51: long tk_nin;
52: long tk_nout;
53: } s, s1;
54:
55: int mf;
56: double etime;
57:
58: main(argc, argv)
59: char *argv[];
60: {
61: extern char *ctime();
62: register i;
63: int iter;
64: double f1, f2;
65: long t;
66: int tohdr = 1;
67:
68: nlist("/vmunix", nl);
69: if(nl[X_DK_BUSY].n_type == 0) {
70: printf("dk_busy not found in /vmunix namelist\n");
71: exit(1);
72: }
73: mf = open("/dev/kmem", 0);
74: if(mf < 0) {
75: printf("cannot open /dev/kmem\n");
76: exit(1);
77: }
78: iter = 0;
79: while (argc>1&&argv[1][0]=='-') {
80: argc--;
81: argv++;
82: }
83: lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
84: read(mf, s.dk_mspw, sizeof s.dk_mspw);
85: if(argc > 2)
86: iter = atoi(argv[2]);
87: loop:
88: if (--tohdr == 0) {
89: for (i = 0; i < DK_NDRIVE; i++)
90: if (s.dk_mspw[i] != 0.0)
91: printf(" D%d ", i);
92: printf(" CPU\n");
93: for (i = 0; i < DK_NDRIVE; i++)
94: if (s.dk_mspw[i] != 0.0)
95: printf(" sps tps msps ");
96: printf(" us ni sy id wt\trd\trda\tch\twrt\n");
97: tohdr = 9;
98: }
99: lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
100: read(mf, &s.dk_busy, sizeof s.dk_busy);
101: lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
102: read(mf, s.dk_time, sizeof s.dk_time);
103: lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
104: read(mf, s.dk_xfer, sizeof s.dk_xfer);
105: lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
106: read(mf, s.dk_wds, sizeof s.dk_wds);
107: lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
108: read(mf, &s.tk_nin, sizeof s.tk_nin);
109: lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
110: read(mf, &s.tk_nout, sizeof s.tk_nout);
111: lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
112: read(mf, s.dk_seek, sizeof s.dk_seek);
113: lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
114: read(mf, s.cp_time, sizeof s.cp_time);
115: lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
116: read(mf, s.dk_mspw, sizeof s.dk_mspw);
117: lseek(mf, (long)nl[X_DK_INFO].n_value, 0);
118: read(mf, (char *)&s.io_info, sizeof s.io_info);
119: lseek(mf, (long)nl[X_IO_WAIT].n_value, 0);
120: read(mf, (char *)&s.io_wait, sizeof s.io_wait);
121: #define sv(x) t = s.x; s.x -= s1.x; s1.x = t;
122: for (i = 0; i < DK_NDRIVE; i++) {
123: sv(dk_xfer[i]); sv(dk_seek[i]); sv(dk_wds[i]); sv(dk_time[i]);
124: }
125: sv(tk_nin);
126: sv(tk_nout);
127: sv(io_info.nread);
128: sv(io_info.nreada);
129: sv(io_info.ncache);
130: sv(io_info.nwrite);
131: sv(io_wait);
132: for(i = 0; i <= W_LAST; i++) {
133: sv(io_info.whyread[i]);
134: sv(io_info.whycache[i]);
135: }
136: etime = 0;
137: for(i=0; i<CPUSTATES; i++) {
138: sv(cp_time[i]);
139: etime += s.cp_time[i];
140: }
141: if (etime == 0.0)
142: etime = 1.0;
143: etime /= 60.0;
144: for (i=0; i<DK_NDRIVE; i++)
145: if (s.dk_mspw[i] != 0.0)
146: stats(i);
147: for (i=0; i<CPUSTATES; i++)
148: stat1(i);
149: printf("%3.0f", s.io_wait*100./60./etime);
150: printf("\t%d\t%d\t%d\t%d", s.io_info.nread, s.io_info.nreada,
151: s.io_info.ncache, s.io_info.nwrite);
152: printf("\n");
153: #define W_FREE 1
154: #define W_INODE 2
155: #define W_INDIR 3
156: #define W_SUPER 4
157: #define W_DATA 5
158: #define W_EXEC 6
159: #define W_BADDR 7
160: #define W_DIREC 8
161: #define W_LAST 8
162: #define xpr(n,i) printf("%ld,%ld:%s ",s.io_info.whyread[i], s.io_info.whycache[i],n);
163: xpr("f", 1); xpr("ino", 2); xpr("ind", 3); xpr("s", 4);
164: xpr("d", 5); xpr("x", 6); xpr("v", 7); xpr("dir", 8);
165: printf("\n");
166: contin:
167: --iter;
168: if(iter)
169: if(argc > 1) {
170: sleep(atoi(argv[1]));
171: goto loop;
172: }
173: }
174:
175: stats(dn)
176: {
177: register i;
178: double atime, words, xtime, itime;
179:
180: if (s.dk_mspw[dn] == 0.0) {
181: printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
182: return;
183: }
184: atime = s.dk_time[dn];
185: atime /= 60.0;
186: words = s.dk_wds[dn]*32.0; /* number of words transferred */
187: xtime = s.dk_mspw[dn]*words; /* transfer time */
188: itime = atime - xtime; /* time not transferring */
189: /*
190: printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
191: dn, words, atime, xtime, itime);
192: */
193: if (xtime < 0)
194: itime += xtime, xtime = 0;
195: if (itime < 0)
196: xtime += itime, itime = 0;
197: printf("%4.0f", s.dk_seek[dn]/etime);
198: printf("%4.0f", s.dk_xfer[dn]/etime);
199: printf("%5.1f ",
200: s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
201: /*
202: printf("%4.1f",
203: s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
204: */
205: }
206:
207: stat1(o)
208: {
209: register i;
210: double time;
211:
212: time = 0;
213: for(i=0; i<CPUSTATES; i++)
214: time += s.cp_time[i];
215: if (time == 0.0)
216: time = 1.0;
217: printf("%3.0f", 100*s.cp_time[o]/time);
218: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.