static char *sccsid
= "@(#)vmstat.c 4.1 (Berkeley) %G%";
long etime
[CPUSTATES
][DK_NSTATES
];
struct forkstat Forkstat
;
#define forkstat s.Forkstat
printf("no /vmunix namelist\n");
mf
= open("/dev/kmem", 0);
printf("cannot open /dev/kmem\n");
while (argc
>0 && argv
[0][0]=='-') {
while (*++cp
) switch (*cp
) {
mf
= open("/dev/kmem", 2);
lseek(mf
, (long)nl
[X_SUM
].n_value
, 0);
write(mf
, &z
.Sum
, sizeof z
.Sum
);
fprintf(stderr
, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
lseek(mf
, (long)nl
[X_FIRSTFREE
].n_value
, 0);
read(mf
, &firstfree
, sizeof firstfree
);
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
);
if (nintv
<= 0 || nintv
> 60*60*24*365*10) {
printf("Time makes no sense... namelist must be wrong.\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\
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\
lseek(mf
, (long)nl
[X_DKBUSY
].n_value
, 0);
read(mf
, &s
.busy
, sizeof s
.busy
);
lseek(mf
, (long)nl
[X_DKTIME
].n_value
, 0);
read(mf
, s
.etime
, sizeof s
.etime
);
lseek(mf
, (long)nl
[X_DKNUMB
].n_value
, 0);
read(mf
, s
.numb
, sizeof s
.numb
);
lseek(mf
, (long)nl
[X_SUM
].n_value
, 0);
read(mf
, &rate
, sizeof rate
);
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
[X_DEFICIT
].n_value
, 0);
read(mf
, &deficit
, sizeof deficit
);
for (i
=0; i
< DK_NDRIVE
; i
++) {
for (i
=0; i
< CPUSTATES
; i
++) {
for (j
=0; j
< DK_NSTATES
; j
++) {
s
.etime
[i
][j
] -= s1
.etime
[i
][j
];
for (i
=0; i
< CPUSTATES
; i
++)
for (j
=0; j
< DK_NSTATES
; j
++)
printf("%2d%2d%2d", total
.t_rq
, total
.t_dw
+total
.t_pw
,
printf("%2d%3d%3d%3d%3d", total
.t_rq
, total
.t_dw
, total
.t_pw
,
printf("%6d%5d", total
.t_avm
/2, total
.t_free
/2);
printf("%6d%3d%5d", total
.t_avm
/2,
pct(total
.t_avmtxt
, total
.t_avm
), total
.t_free
/2);
(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
);
printf("%4d%4d", (rate
.v_intr
/nintv
) - HZ
,
printf("%4d", rate
.v_swtch
/nintv
);
for(i
=0; i
<CPUSTATES
; i
++) {
if (i
== 0) { /* US+NI */
lseek(mf
, (long)nl
[X_REC
].n_value
, 0);
read(mf
, &s
.rectime
, sizeof s
.rectime
);
lseek(mf
, (long)nl
[X_PGIN
].n_value
, 0);
read(mf
, &s
.pgintime
, sizeof s
.pgintime
);
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
);
printf("%d page ins, %d total time (msec)\n",sum
.v_pgin
, s
.pgintime
/10);
printf("average: %8.1f msec / page in\n", s
.pgintime
/(sum
.v_pgin
*10.0));
lseek(mf
, (long)nl
[X_SUM
].n_value
, 0);
read(mf
, &sum
, sizeof sum
);
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
);
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
,
(float) forkstat
.sizfork
/ forkstat
.cntfork
);
printf("%d vforks, %d pages, average=%.2f\n",
forkstat
.cntvfork
, forkstat
.sizvfork
,
(float)forkstat
.sizvfork
/ forkstat
.cntvfork
);
printf("%3.0f", s
.numb
[dn
]/etime
);
for(i
=0; i
<CPUSTATES
; i
++)
for(j
=0; j
<DK_NSTATES
; j
++)
for(j
=0; j
<DK_NSTATES
; j
++)
return ((top
* 100) / bot
);