|
|
1.1 root 1: #include <stdio.h>
2: #include <libc.h>
3: #include <sys/param.h>
4: #include <sys/vm.h>
5: #include <nlist.h>
6: #include <sys/meter.h>
7:
8: struct nlist nl[] = {
9: #define X_CPTIME 0
10: { "_cp_time" },
11: #define X_RATE 1
12: { "_rate" },
13: #define X_TOTAL 2
14: { "_total" },
15: #define X_DEFICIT 3
16: { "_deficit" },
17: #define X_SUM 4
18: { "_sum" },
19: #define X_FIRSTFREE 5
20: { "_firstfree" },
21: #define X_MAXFREE 6
22: { "_maxfree" },
23: #define X_BOOTIME 7
24: { "_bootime" },
25: #define X_REC 8
26: { "_rectime" },
27: #define X_PGIN 9
28: { "_pgintime" },
29: { 0 },
30: };
31:
32: double stat1();
33: int firstfree, maxfree;
34: struct
35: {
36: int busy;
37: long time[CPUSTATES];
38: struct vmmeter Rate;
39: struct vmtotal Total;
40: struct vmmeter Sum;
41: unsigned rectime;
42: unsigned pgintime;
43: } s, s1, z;
44: #define rate s.Rate
45: #define total s.Total
46: #define sum s.Sum
47:
48: int zero;
49: int deficit;
50: double etime;
51: int mf;
52:
53: main(argc, argv)
54: char **argv;
55: {
56: time_t now;
57: int lines;
58: extern char *ctime();
59: register i;
60: int iter, nintv;
61: time_t bootime;
62: long t;
63: extern char _sobuf[];
64:
65: setbuf(stdout, _sobuf);
66: nlist("/unix", nl);
67: if(nl[0].n_type == 0) {
68: printf("no /unix namelist\n");
69: exit(1);
70: }
71: mf = open("/dev/kmem", 0);
72: if(mf < 0) {
73: printf("cannot open /dev/kmem\n");
74: exit(1);
75: }
76: iter = 0;
77: argc--, argv++;
78: while (argc>0 && argv[0][0]=='-') {
79: char *cp = *argv++;
80: argc--;
81: while (*++cp) switch (*cp) {
82:
83: case 't':
84: dotimes();
85: exit(0);
86: case 'z':
87: close(mf);
88: mf = open("/dev/kmem", 2);
89: lseek(mf, (long)nl[X_SUM].n_value, 0);
90: write(mf, &z.Sum, sizeof z.Sum);
91: exit(0);
92:
93:
94: case 's':
95: dosum();
96: exit(0);
97:
98: default:
99: fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
100: exit(1);
101: }
102: }
103: if(argc > 1)
104: iter = atoi(argv[1]);
105: lseek(mf, (long)nl[X_FIRSTFREE].n_value, 0);
106: read(mf, &firstfree, sizeof firstfree);
107: lseek(mf, (long)nl[X_MAXFREE].n_value, 0);
108: read(mf, &maxfree, sizeof maxfree);
109: lseek(mf, (long)nl[X_BOOTIME].n_value, 0);
110: read(mf, &bootime, sizeof bootime);
111: time(&now);
112: nintv = now - bootime;
113: if (nintv <= 0 || nintv > 60*60*24*365*10) {
114: printf("Time makes no sense... namelist must be wrong.\n");
115: exit(1);
116: }
117: reprint:
118: lines = 20;
119: /* s1 = z; */
120: printf("\
121: procs| memory | page | | cpu\n\
122: r b w avm fre re at pi po fr de sr sy cs us sy id st\n");
123: loop:
124: lseek(mf, (long)nl[X_CPTIME].n_value, 0);
125: read(mf, s.time, sizeof s.time);
126: if (nintv != 1) {
127: lseek(mf, (long)nl[X_SUM].n_value, 0);
128: read(mf, &rate, sizeof rate);
129: } else {
130: lseek(mf, (long)nl[X_RATE].n_value, 0);
131: read(mf, &rate, sizeof rate);
132: }
133: lseek(mf, (long)nl[X_TOTAL].n_value, 0);
134: read(mf, &total, sizeof total);
135: lseek(mf, (long)nl[X_DEFICIT].n_value, 0);
136: read(mf, &deficit, sizeof deficit);
137: etime = 0;
138: for (i=0; i < CPUSTATES; i++) {
139: t = s.time[i];
140: s.time[i] -= s1.time[i];
141: s1.time[i] = t;
142: etime += s.time[i];
143: }
144: if(etime == 0.)
145: etime = 1.;
146: printf("%2d %d %d", total.t_rq, total.t_dw+total.t_pw, total.t_sw);
147: printf(" %6d %6d", total.t_avm/CLSIZE, total.t_free/CLSIZE);
148: printf(" %3d %3d %3d",
149: (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv,
150: (rate.v_xsfrec+rate.v_xifrec)/nintv, rate.v_pgpgin/CLSIZE/nintv);
151: printf(" %3d %3d %3d %3d", rate.v_pgpgout/CLSIZE/nintv,
152: rate.v_dfree/CLSIZE/nintv, deficit/CLSIZE, rate.v_scan/nintv);
153: etime /= 60.;
154: printf(" %3d", rate.v_syscall/nintv);
155: printf(" %3d", rate.v_swtch/nintv);
156: for(i=0; i<CPUSTATES; i++) {
157: float f = stat1(i);
158: if (i == 0) { /* US+NI */
159: i++;
160: f += stat1(i);
161: }
162: printf("%3.0f", f);
163: }
164: printf("\n");
165: fflush(stdout);
166: nintv = 1;
167: --iter;
168: if(iter)
169: if(argc > 0) {
170: sleep(atoi(argv[0]));
171: if (--lines <= 0)
172: goto reprint;
173: goto loop;
174: }
175: }
176:
177: dotimes()
178: {
179:
180: lseek(mf, (long)nl[X_REC].n_value, 0);
181: read(mf, &s.rectime, sizeof s.rectime);
182: lseek(mf, (long)nl[X_PGIN].n_value, 0);
183: read(mf, &s.pgintime, sizeof s.pgintime);
184: lseek(mf, (long)nl[X_SUM].n_value, 0);
185: read(mf, &sum, sizeof sum);
186: printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime);
187: printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec);
188: printf("\n");
189: printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10);
190: printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0));
191: }
192:
193: dosum()
194: {
195:
196: lseek(mf, (long)nl[X_SUM].n_value, 0);
197: read(mf, &sum, sizeof sum);
198: printf("%9d swap ins\n", sum.v_swpin);
199: printf("%9d swap outs\n", sum.v_swpout);
200: printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE);
201: printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE);
202: printf("%9d total address trans. faults taken\n", sum.v_faults);
203: printf("%9d page ins\n", sum.v_pgin);
204: printf("%9d page outs\n", sum.v_pgout);
205: printf("%9d pages paged in\n", sum.v_pgpgin);
206: printf("%9d pages paged out\n", sum.v_pgpgout);
207: printf("%9d sequential process pages freed\n", sum.v_seqfree);
208: printf("%9d total reclaims\n", sum.v_pgrec);
209: printf("%9d reclaims from free list\n", sum.v_pgfrec);
210: printf("%9d intransit blocking page faults\n", sum.v_intrans);
211: printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE);
212: printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE);
213: printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE);
214: printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE);
215: printf("%9d swap text pages found in free list\n", sum.v_xsfrec);
216: printf("%9d inode text pages found in free list\n", sum.v_xifrec);
217: printf("%9d pages examined by the clock daemon\n", sum.v_scan);
218: printf("%9d revolutions of the clock hand\n", sum.v_rev);
219: printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE);
220: printf("%9d cpu context switches\n", sum.v_swtch);
221: printf("%9d traps\n", sum.v_trap);
222: printf("%9d system calls\n", sum.v_syscall);
223: }
224:
225: double
226: stat1(row)
227: {
228: double t;
229: register i;
230:
231: t = 0;
232: for(i=0; i<CPUSTATES; i++)
233: t += s.time[i];
234: if(t == 0.)
235: t = 1.;
236: return(s.time[row]*100./t);
237: }
238:
239: pct(top, bot)
240: {
241:
242: if (bot == 0)
243: return (0);
244: return ((top * 100) / bot);
245: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.