|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/param.h>
3: #include <sys/vm.h>
4:
5: struct
6: {
7: char name[8];
8: int type;
9: unsigned value;
10: } nl[] = {
11: "_dk_busy", 0, 0,
12: "_dk_time", 0, 0,
13: "_dk_numb", 0, 0,
14: "_rate", 0, 0,
15: "_total", 0, 0,
16: "_deficit", 0, 0,
17: #define X_FORKSTAT 6
18: "_forksta", 0, 0,
19: #define X_SUM 7
20: "_sum", 0, 0,
21: #define X_FIRSTFREE 8
22: "_firstfr", 0, 0,
23: #define X_MAXFREE 9
24: "_maxfree", 0, 0,
25: #ifdef ERNIE
26: #define X_REC 10
27: "_rectime", 0, 0,
28: #define X_PGIN 11
29: "_pgintim", 0, 0,
30: #endif
31: "\0\0\0\0\0\0\0\0", 0, 0
32: };
33:
34: int firstfree, maxfree;
35: char version[128];
36: struct
37: {
38: int busy;
39: long etime[32];
40: long numb[3];
41: struct vmmeter Rate;
42: struct vmtotal Total;
43: struct vmmeter Sum;
44: struct forkstat Forkstat;
45: #ifdef ERNIE
46: unsigned rectime;
47: unsigned pgintime;
48: #endif
49: } s, s1, z;
50: #define rate s.Rate
51: #define total s.Total
52: #define sum s.Sum
53: #define forkstat s.Forkstat
54:
55: int zero;
56: int deficit;
57: double etime;
58: int mf;
59:
60: main(argc, argv)
61: char **argv;
62: {
63: int lines;
64: extern char *ctime();
65: register i;
66: int iter;
67: double f1, f2;
68: long t;
69: extern char _sobuf[];
70:
71: setbuf(stdout, _sobuf);
72: nlist("/vmunix", nl);
73: if(nl[0].type == -1) {
74: printf("no /vmunix namelist\n");
75: exit(1);
76: }
77: mf = open("/dev/kmem", 0);
78: if(mf < 0) {
79: printf("cannot open /dev/kmem\n");
80: exit(1);
81: }
82: iter = 0;
83: argc--, argv++;
84: while (argc>0 && argv[0][0]=='-') {
85: char *cp = *argv++;
86: argc--;
87: while (*++cp) switch (*cp) {
88:
89: #ifdef ERNIE
90: case 't':
91: dotimes();
92: exit(0);
93: #endif
94: case 'z':
95: close(mf);
96: mf = open("/dev/kmem", 2);
97: lseek(mf, (long)nl[X_SUM].value, 0);
98: write(mf, &z.Sum, sizeof z.Sum);
99: exit(0);
100:
101: case 'f':
102: doforkst();
103: exit(0);
104:
105: case 's':
106: dosum();
107: exit(0);
108:
109: default:
110: fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
111: exit(1);
112: }
113: }
114: if(argc > 1)
115: iter = atoi(argv[1]);
116: lseek(mf, (long)nl[X_FIRSTFREE].value, 0);
117: read(mf, &firstfree, sizeof firstfree);
118: lseek(mf, (long)nl[X_MAXFREE].value, 0);
119: read(mf, &maxfree, sizeof maxfree);
120: reprint:
121: lines = 20;
122: /* s1 = z; */
123: printf("\
124: Procs Virtual Real Page Swap Disk Cpu\n\
125: RQ DW PW SL SW AVM TX FRE RE PI PO FR DE SR I O D0 D1 D2 CS US NI SY ID\n\
126: ");
127: loop:
128: lseek(mf, (long)nl[0].value, 0);
129: read(mf, &s.busy, sizeof s.busy);
130: lseek(mf, (long)nl[1].value, 0);
131: read(mf, s.etime, sizeof s.etime);
132: lseek(mf, (long)nl[2].value, 0);
133: read(mf, s.numb, sizeof s.numb);
134: lseek(mf, (long)nl[3].value, 0);
135: read(mf, &rate, sizeof rate);
136: lseek(mf, (long)nl[4].value, 0);
137: read(mf, &total, sizeof total);
138: lseek(mf, (long)nl[5].value, 0);
139: read(mf, &deficit, sizeof deficit);
140: for(i=0; i<35; i++) {
141: t = s.etime[i];
142: s.etime[i] -= s1.etime[i];
143: s1.etime[i] = t;
144: }
145: t = 0;
146: for(i=0; i<32; i++)
147: t += s.etime[i];
148: etime = t;
149: if(etime == 0.)
150: etime = 1.;
151: /*
152: Procs Virtual Real Page Swap Disk Cpu
153: RQ DW PW SL SW AVM TX FRE RE PI PO FR DE SR I O D0 D1 D2 CS US NI SY ID
154: */
155: printf("%2d%3d%3d%3d%3d", total.t_rq, total.t_dw, total.t_pw,
156: total.t_sl, total.t_sw);
157: printf("%6d%3d%5d", total.t_avm, pct(total.t_avmtxt, total.t_avm),
158: total.t_free);
159: printf("%4d%3d", rate.v_pgrec, rate.v_pgin);
160: printf("%3d%3d%4d%4.1f%2d%2d",
161: rate.v_pgout, rate.v_dfree, deficit,
162: (60.0 * rate.v_scan) / LOOPSIZ,
163: rate.v_swpin, rate.v_swpout);
164: etime /= 60.;
165: printf(" ");
166: for(i=0; i<3; i++)
167: stats(i);
168: printf("%4d", rate.v_swtch);
169: for(i=0; i<4; i++)
170: stat1(i*8);
171: printf("\n");
172: fflush(stdout);
173: contin:
174: --iter;
175: if(iter)
176: if(argc > 0) {
177: sleep(atoi(argv[0]));
178: if (--lines <= 0)
179: goto reprint;
180: goto loop;
181: }
182: }
183:
184: #ifdef ERNIE
185: dotimes()
186: {
187:
188: lseek(mf, (long)nl[X_REC].value, 0);
189: read(mf, &s.rectime, sizeof s.rectime);
190: lseek(mf, (long)nl[X_PGIN].value, 0);
191: read(mf, &s.pgintime, sizeof s.pgintime);
192: lseek(mf, (long)nl[X_SUM].value, 0);
193: read(mf, &sum, sizeof sum);
194: printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime);
195: printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec);
196: printf("\n");
197: printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10);
198: printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0));
199: }
200: #endif
201:
202: dosum()
203: {
204:
205: lseek(mf, (long)nl[X_SUM].value, 0);
206: read(mf, &sum, sizeof sum);
207: printf("%8d swap ins\n", sum.v_swpin);
208: printf("%8d swap outs\n", sum.v_swpout);
209: printf("%8d pages swapped in\n", sum.v_pswpin);
210: printf("%8d pages swapped out\n", sum.v_pswpout);
211: printf("%8d total address trans. faults taken\n", sum.v_faults);
212: printf("%8d page ins\n", sum.v_pgin);
213: printf("%8d page outs\n", sum.v_pgout);
214: printf("%8d total reclaims\n", sum.v_pgrec);
215: printf("%8d reclaims from free list\n", sum.v_pgfrec);
216: printf("%8d intransit blocking page faults\n", sum.v_intrans);
217: printf("%8d zero fill on demand page faults\n", sum.v_zfod / CLSIZE);
218: printf("%8d total zero fill pages created\n", sum.v_nzfod);
219: printf("%8d executable fill on demand page faults\n", sum.v_exfod / CLSIZE);
220: printf("%8d total executable fill pages created\n", sum.v_nexfod);
221: printf("%8d file fill on demand page faults\n", sum.v_vrfod / CLSIZE);
222: printf("%8d total pages set up for fill on demand with vread\n", sum.v_nvrfod);
223: printf("%8d pages examined by the clock daemon\n", sum.v_scan);
224: printf("%8d revolutions of the clock hand\n", sum.v_rev);
225: printf("%8d pages freed by the clock daemon\n", sum.v_dfree);
226: printf("%8d cpu context switches\n", sum.v_swtch);
227: }
228:
229:
230: doforkst()
231: {
232:
233: lseek(mf, (long)nl[X_FORKSTAT].value, 0);
234: read(mf, &forkstat, sizeof forkstat);
235: printf("%d forks, %d pages, average=%.2f\n",
236: forkstat.cntfork, forkstat.sizfork,
237: (float) forkstat.sizfork / forkstat.cntfork);
238: printf("%d vforks, %d pages, average=%.2f\n",
239: forkstat.cntvfork, forkstat.sizvfork,
240: (float)forkstat.sizvfork / forkstat.cntvfork);
241: }
242:
243: stats(dn)
244: {
245: register i;
246: double f1, f2;
247: long t;
248:
249: t = 0;
250: for(i=0; i<32; i++)
251: if(i & (1<<dn))
252: t += s.etime[i];
253: f1 = t;
254: f1 = f1/60.;
255: f2 = s.numb[dn];
256: if(f2 == 0. && dn) {
257: printf("%3.0f", 0.0);
258: return;
259: }
260: printf("%3.0f", f2/etime);
261: }
262:
263: stat1(o)
264: {
265: register i;
266: long t;
267: double f1, f2;
268:
269: t = 0;
270: for(i=0; i<32; i++)
271: t += s.etime[i];
272: f1 = t;
273: if(f1 == 0.)
274: f1 = 1.;
275: t = 0;
276: for(i=0; i<8; i++)
277: t += s.etime[o+i];
278: f2 = t;
279: printf("%3.0f", f2*100./f1);
280: }
281: pct(top, bot)
282: {
283:
284: if (bot == 0)
285: return (0);
286: return ((top * 100) / bot);
287: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.