|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.