+static char *sccsid = "@(#)vmstat.c 4.2 (Berkeley) 10/15/80";
#include <stdio.h>
#include <sys/param.h>
#include <sys/vm.h>
+#include <sys/dk.h>
+#include <nlist.h>
-struct
-{
- char name[8];
- int type;
- unsigned value;
-} nl[] = {
- "_dk_busy", 0, 0,
- "_dk_time", 0, 0,
- "_dk_numb", 0, 0,
- "_rate", 0, 0,
- "_total", 0, 0,
- "_deficit", 0, 0,
-#define X_FORKSTAT 6
- "_forksta", 0, 0,
-#define X_SUM 7
- "_sum", 0, 0,
-#define X_FIRSTFREE 8
- "_firstfr", 0, 0,
-#define X_MAXFREE 9
- "_maxfree", 0, 0,
+struct nlist nl[] = {
+#define X_CPTIME 0
+ { "_cp_time" },
+#define X_RATE 1
+ { "_rate" },
+#define X_TOTAL 2
+ { "_total" },
+#define X_DEFICIT 3
+ { "_deficit" },
+#define X_FORKSTAT 4
+ { "_forkstat" },
+#define X_SUM 5
+ { "_sum" },
+#define X_FIRSTFREE 6
+ { "_firstfree" },
+#define X_MAXFREE 7
+ { "_maxfree" },
+#define X_BOOTIME 8
+ { "_bootime" },
+#define X_DKXFER 9
+ { "_dk_xfer" },
#ifdef ERNIE
#define X_REC 10
- "_rectime", 0, 0,
+ { "_rectime" },
#define X_PGIN 11
- "_pgintim", 0, 0,
+ { "_pgintime" },
#endif
- "\0\0\0\0\0\0\0\0", 0, 0
+ { 0 },
};
+double stat1();
int firstfree, maxfree;
-char version[128];
struct
{
int busy;
- long etime[32];
- long numb[3];
+ long time[CPUSTATES];
+ long xfer[DK_NDRIVE];
struct vmmeter Rate;
struct vmtotal Total;
struct vmmeter Sum;
#define sum s.Sum
#define forkstat s.Forkstat
+int iflag = 1;
int zero;
int deficit;
double etime;
main(argc, argv)
char **argv;
{
+ time_t now;
int lines;
extern char *ctime();
- register i;
- int iter;
+ register i,j;
+ int iter, nintv;
+ time_t bootime;
double f1, f2;
long t;
extern char _sobuf[];
setbuf(stdout, _sobuf);
nlist("/vmunix", nl);
- if(nl[0].type == -1) {
+ if(nl[0].n_type == 0) {
printf("no /vmunix namelist\n");
exit(1);
}
case 'z':
close(mf);
mf = open("/dev/kmem", 2);
- lseek(mf, (long)nl[X_SUM].value, 0);
+ lseek(mf, (long)nl[X_SUM].n_value, 0);
write(mf, &z.Sum, sizeof z.Sum);
exit(0);
dosum();
exit(0);
+ case 'i':
+ iflag = 0;
+ break;
+
default:
fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
exit(1);
}
if(argc > 1)
iter = atoi(argv[1]);
- lseek(mf, (long)nl[X_FIRSTFREE].value, 0);
+ lseek(mf, (long)nl[X_FIRSTFREE].n_value, 0);
read(mf, &firstfree, sizeof firstfree);
- lseek(mf, (long)nl[X_MAXFREE].value, 0);
+ lseek(mf, (long)nl[X_MAXFREE].n_value, 0);
read(mf, &maxfree, sizeof maxfree);
+ lseek(mf, (long)nl[X_BOOTIME].n_value, 0);
+ read(mf, &bootime, sizeof bootime);
+ time(&now);
+ nintv = now - bootime;
+ if (nintv <= 0 || nintv > 60*60*24*365*10) {
+ printf("Time makes no sense... namelist must be wrong.\n");
+ exit(1);
+ }
reprint:
lines = 20;
/* s1 = z; */
+ if (iflag==0)
printf("\
- Procs Virtual Real Page Swap Disk Cpu\n\
-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\
+ Procs Virtual Real Page Swap Disk Cpu\n\
+RQ DW PW SW AVM TX FRE RE AT PI PO FR DE SR I O D0 D1 D2 D3 CS US SY ID\n\
+");
+ else
+printf("\
+ Procs Memory Page Swap Disk Faults Cpu\n\
+ R B W AVM FRE RE AT PI PO FR DE SR I O D0 D1 D2 D3 IN SY CS US SY ID\n\
");
loop:
- lseek(mf, (long)nl[0].value, 0);
- read(mf, &s.busy, sizeof s.busy);
- lseek(mf, (long)nl[1].value, 0);
- read(mf, s.etime, sizeof s.etime);
- lseek(mf, (long)nl[2].value, 0);
- read(mf, s.numb, sizeof s.numb);
- lseek(mf, (long)nl[3].value, 0);
- read(mf, &rate, sizeof rate);
- lseek(mf, (long)nl[4].value, 0);
+ lseek(mf, (long)nl[X_CPTIME].n_value, 0);
+ read(mf, s.time, sizeof s.time);
+ lseek(mf, (long)nl[X_DKXFER].n_value, 0);
+ read(mf, s.xfer, sizeof s.xfer);
+ if (nintv != 1) {
+ lseek(mf, (long)nl[X_SUM].n_value, 0);
+ read(mf, &rate, sizeof rate);
+ } else {
+ lseek(mf, (long)nl[X_RATE].n_value, 0);
+ read(mf, &rate, sizeof rate);
+ }
+ lseek(mf, (long)nl[X_TOTAL].n_value, 0);
read(mf, &total, sizeof total);
- lseek(mf, (long)nl[5].value, 0);
+ lseek(mf, (long)nl[X_DEFICIT].n_value, 0);
read(mf, &deficit, sizeof deficit);
- for(i=0; i<35; i++) {
- t = s.etime[i];
- s.etime[i] -= s1.etime[i];
- s1.etime[i] = t;
+ etime = 0;
+ for (i=0; i < DK_NDRIVE; i++) {
+ t = s.xfer[i];
+ s.xfer[i] -= s1.xfer[i];
+ s1.xfer[i] = t;
+ }
+ for (i=0; i < CPUSTATES; i++) {
+ t = s.time[i];
+ s.time[i] -= s1.time[i];
+ s1.time[i] = t;
+ etime += s.time[i];
}
- t = 0;
- for(i=0; i<32; i++)
- t += s.etime[i];
- etime = t;
if(etime == 0.)
etime = 1.;
-/*
- Procs Virtual Real Page Swap Disk Cpu
-RQ DW PW SL SW AVM TX FRE RE PI PO FR DE SR I O D0 D1 D2 CS US NI SY ID
-*/
- printf("%2d%3d%3d%3d%3d", total.t_rq, total.t_dw, total.t_pw,
- total.t_sl, total.t_sw);
- printf("%6d%3d%5d", total.t_avm, pct(total.t_avmtxt, total.t_avm),
- total.t_free);
- printf("%4d%3d", rate.v_pgrec, rate.v_pgin);
- printf("%3d%3d%4d%4.1f%2d%2d",
- rate.v_pgout, rate.v_dfree, deficit,
- (60.0 * rate.v_scan) / LOOPSIZ,
- rate.v_swpin, rate.v_swpout);
+ if (iflag)
+ printf("%2d%2d%2d", total.t_rq, total.t_dw+total.t_pw,
+ total.t_sw);
+ else
+ printf("%2d%3d%3d%3d%3d", total.t_rq, total.t_dw, total.t_pw,
+ total.t_sw);
+ if (iflag)
+ printf("%6d%5d", total.t_avm/2, total.t_free/2);
+ else
+ printf("%6d%3d%5d", total.t_avm/2,
+ pct(total.t_avmtxt, total.t_avm), total.t_free/2);
+ printf("%4d%3d%3d",
+ (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv,
+ (rate.v_xsfrec+rate.v_xifrec)/nintv, rate.v_pgin/nintv);
+ printf("%3d%3d%4d%4.1f%2d%2d", rate.v_pgout/nintv,
+ rate.v_dfree/nintv, deficit/2,
+ (60.0 * rate.v_scan) / (LOOPSIZ*nintv),
+ rate.v_swpin/nintv, rate.v_swpout/nintv);
etime /= 60.;
printf(" ");
- for(i=0; i<3; i++)
- stats(i);
- printf("%4d", rate.v_swtch);
for(i=0; i<4; i++)
- stat1(i*8);
+ stats(i);
+ if (iflag)
+ printf("%4d%4d", (rate.v_intr/nintv) - HZ,
+ rate.v_syscall/nintv);
+ printf("%4d", rate.v_swtch/nintv);
+ for(i=0; i<CPUSTATES; i++) {
+ float f = stat1(i);
+ if (i == 0) { /* US+NI */
+ i++;
+ f += stat1(i);
+ }
+ printf("%3.0f", f);
+ }
printf("\n");
fflush(stdout);
contin:
+ nintv = 1;
--iter;
if(iter)
if(argc > 0) {
dotimes()
{
- lseek(mf, (long)nl[X_REC].value, 0);
+ lseek(mf, (long)nl[X_REC].n_value, 0);
read(mf, &s.rectime, sizeof s.rectime);
- lseek(mf, (long)nl[X_PGIN].value, 0);
+ lseek(mf, (long)nl[X_PGIN].n_value, 0);
read(mf, &s.pgintime, sizeof s.pgintime);
- lseek(mf, (long)nl[X_SUM].value, 0);
+ lseek(mf, (long)nl[X_SUM].n_value, 0);
read(mf, &sum, sizeof sum);
printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime);
printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec);
dosum()
{
- lseek(mf, (long)nl[X_SUM].value, 0);
+ lseek(mf, (long)nl[X_SUM].n_value, 0);
read(mf, &sum, sizeof sum);
- printf("%8d swap ins\n", sum.v_swpin);
- printf("%8d swap outs\n", sum.v_swpout);
- printf("%8d pages swapped in\n", sum.v_pswpin);
- printf("%8d pages swapped out\n", sum.v_pswpout);
- printf("%8d total address trans. faults taken\n", sum.v_faults);
- printf("%8d page ins\n", sum.v_pgin);
- printf("%8d page outs\n", sum.v_pgout);
- printf("%8d total reclaims\n", sum.v_pgrec);
- printf("%8d reclaims from free list\n", sum.v_pgfrec);
- printf("%8d intransit blocking page faults\n", sum.v_intrans);
- printf("%8d zero fill on demand page faults\n", sum.v_zfod / CLSIZE);
- printf("%8d total zero fill pages created\n", sum.v_nzfod);
- printf("%8d executable fill on demand page faults\n", sum.v_exfod / CLSIZE);
- printf("%8d total executable fill pages created\n", sum.v_nexfod);
- printf("%8d file fill on demand page faults\n", sum.v_vrfod / CLSIZE);
- printf("%8d total pages set up for fill on demand with vread\n", sum.v_nvrfod);
- printf("%8d pages examined by the clock daemon\n", sum.v_scan);
- printf("%8d revolutions of the clock hand\n", sum.v_rev);
- printf("%8d pages freed by the clock daemon\n", sum.v_dfree);
- printf("%8d cpu context switches\n", sum.v_swtch);
+ printf("%9d swap ins\n", sum.v_swpin);
+ printf("%9d swap outs\n", sum.v_swpout);
+ printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE);
+ printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE);
+ printf("%9d total address trans. faults taken\n", sum.v_faults);
+ printf("%9d page ins\n", sum.v_pgin);
+ printf("%9d page outs\n", sum.v_pgout);
+ printf("%9d total reclaims\n", sum.v_pgrec);
+ printf("%9d reclaims from free list\n", sum.v_pgfrec);
+ printf("%9d intransit blocking page faults\n", sum.v_intrans);
+ printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE);
+ printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE);
+ printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE);
+ printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE);
+ printf("%9d swap text pages found in free list\n", sum.v_xsfrec);
+ printf("%9d inode text pages found in free list\n", sum.v_xifrec);
+ printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE);
+ printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE);
+ printf("%9d pages examined by the clock daemon\n", sum.v_scan);
+ printf("%9d revolutions of the clock hand\n", sum.v_rev);
+ printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE);
+ printf("%9d cpu context switches\n", sum.v_swtch);
+ printf("%9d device interrupts\n", sum.v_intr);
+ printf("%9d pseduo-dma dz interrupts\n", sum.v_pdma);
+ printf("%9d traps\n", sum.v_trap);
+ printf("%9d system calls\n", sum.v_syscall);
}
doforkst()
{
- lseek(mf, (long)nl[X_FORKSTAT].value, 0);
+ lseek(mf, (long)nl[X_FORKSTAT].n_value, 0);
read(mf, &forkstat, sizeof forkstat);
printf("%d forks, %d pages, average=%.2f\n",
forkstat.cntfork, forkstat.sizfork,
stats(dn)
{
- register i;
- double f1, f2;
- long t;
- t = 0;
- for(i=0; i<32; i++)
- if(i & (1<<dn))
- t += s.etime[i];
- f1 = t;
- f1 = f1/60.;
- f2 = s.numb[dn];
- if(f2 == 0. && dn) {
- printf("%3.0f", 0.0);
+ if (dn >= DK_NDRIVE) {
+ printf(" 0");
return;
}
- printf("%3.0f", f2/etime);
+ printf("%3.0f", s.xfer[dn]/etime);
}
-stat1(o)
+double
+stat1(row)
{
+ double t;
register i;
- long t;
- double f1, f2;
t = 0;
- for(i=0; i<32; i++)
- t += s.etime[i];
- f1 = t;
- if(f1 == 0.)
- f1 = 1.;
- t = 0;
- for(i=0; i<8; i++)
- t += s.etime[o+i];
- f2 = t;
- printf("%3.0f", f2*100./f1);
+ for(i=0; i<CPUSTATES; i++)
+ t += s.time[i];
+ if(t == 0.)
+ t = 1.;
+ return(s.time[row]*100./t);
}
+
pct(top, bot)
{