static char *sccsid
= "@(#)vmstat.c 4.7 (Berkeley) %G%";
char dr_name
[DK_NDRIVE
][10];
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
);
lseek(mf
, (long)nl
[X_HZ
].n_value
, 0);
read(mf
, &hz
, sizeof hz
);
for (i
= 0; i
< DK_NDRIVE
; i
++) {
strcpy(dr_name
[i
], "xx");
if (nintv
<= 0 || nintv
> 60*60*24*365*10) {
printf("Time makes no sense... namelist must be wrong.\n");
procs memory page disk faults cpu\n\
r b w avm fre re at pi po fr de sr %c%d %c%d %c%d %c%d in sy cs us sy id\n\
", dr_name
[0][0], dr_unit
[0], dr_name
[1][0], dr_unit
[1], dr_name
[2][0], dr_unit
[2], dr_name
[3][0], dr_unit
[3]);
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
);
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
++) {
printf("%2d%2d%2d", total
.t_rq
, total
.t_dw
+total
.t_pw
, total
.t_sw
);
printf("%6d%5d", total
.t_avm
/2, total
.t_free
/2);
(rate
.v_pgrec
- (rate
.v_xsfrec
+rate
.v_xifrec
))/nintv
,
(rate
.v_xsfrec
+rate
.v_xifrec
)/nintv
, rate
.v_pgpgin
/2/nintv
);
printf("%4d%4d%4d%4d", rate
.v_pgpgout
/2/nintv
,
rate
.v_dfree
/2/nintv
, deficit
/2, rate
.v_scan
/nintv
);
printf("%4d%4d", (rate
.v_intr
/nintv
) - hz
, rate
.v_syscall
/nintv
);
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 pages paged in\n", sum
.v_pgpgin
);
printf("%9d pages paged out\n", sum
.v_pgpgout
);
printf("%9d sequential process pages freed\n", sum
.v_seqfree
);
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
.xfer
[dn
]/etime
);
for(i
=0; i
<CPUSTATES
; i
++)
return(s
.time
[row
]*100./t
);
return ((top
* 100) / bot
);
* Read the drive names out of kmem.
* ARGH ARGH ARGH ARGH !!!!!!!!!!!!
#define steal(where, var) lseek(mf, where, 0); read(mf, &var, sizeof var);
register struct mba_device
*mp
;
char *cp
= (char *) &two_char
;
struct uba_device udev
, *up
;
mp
= (struct mba_device
*) nl
[X_MBDINIT
].n_value
;
up
= (struct uba_device
*) nl
[X_UBDINIT
].n_value
;
fprintf(stderr
, "iostat: Disk init info not in namelist\n");
if (mdev
.mi_dk
< 0 || mdev
.mi_alive
== 0)
steal(mdev
.mi_driver
, mdrv
);
steal(mdrv
.md_dname
, two_char
);
sprintf(dr_name
[mdev
.mi_dk
], "%c%c", cp
[0], cp
[1]);
dr_unit
[mdev
.mi_dk
] = mdev
.mi_unit
;
if (udev
.ui_dk
< 0 || udev
.ui_alive
== 0)
steal(udev
.ui_driver
, udrv
);
steal(udrv
.ud_dname
, two_char
);
sprintf(dr_name
[udev
.ui_dk
], "%c%c", cp
[0], cp
[1]);
dr_unit
[udev
.ui_dk
] = udev
.ui_unit
;