static char sccsid
[] = "@(#)vmstat.c 1.1 (Berkeley) %G%";
* Cursed vmstat -- from Robert Elz.
#include <vaxuba/ubavar.h>
#include <vaxmba/mbavar.h>
struct forkstat Forkstat
;
float dk_mspw
[DK_NDRIVE
];
struct nchstats nchstats
;
#define nchtotal s.nchstats
#define oldnchtotal s1.nchstats
#define X(fld) {t=s.fld[i]; s.fld[i]-=s1.fld[i]; if(state==TIME) s1.fld[i]=t;}
#define Y(fld) {t = s.fld; s.fld -= s1.fld; if(state == TIME) s1.fld = t;}
#define Z(fld) {t = s.nchstats.fld; s.nchstats.fld -= s1.nchstats.fld; \
if(state == TIME) s1.nchstats.fld = t;}
char dr_name
[DK_NDRIVE
][10];
enum state
{ BOOT
, TIME
, RUN
, STOP
} state
= TIME
;
enum { NONE
, SOME
} dr_state
[DK_NDRIVE
];
char cpuchar
[CPUSTATES
] = { '=' , '>', '-', ' ' };
char cpuorder
[CPUSTATES
] = { CP_SYS
, CP_USER
, CP_NICE
, CP_IDLE
};
time_t now
, lastime
, starttime
;
switch (c
= argv
[1][0] == '-' ? argv
[1][1] : argv
[1][0]) {
case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
if ((kmem
= open("/dev/kmem",0)) < 0) {
fprintf(stderr
, "No /dev/kmem \n");
if ((ut
= open("/etc/utmp", 0)) < 0) {
fprintf(stderr
, "No utmp\n");
if (name
[0].n_type
== 0) {
fprintf(stderr
, "No namelist\n");
lseek(kmem
, (long)name
[X_HZ
].n_value
, 0);
read(kmem
, &hz
, sizeof hz
);
lseek(kmem
, (long)name
[X_PHZ
].n_value
, 0);
read(kmem
, &phz
, sizeof phz
);
lseek(kmem
, (long)name
[X_DK_MSPW
].n_value
, 0);
read(kmem
, s
.dk_mspw
, sizeof s
.dk_mspw
);
for (i
= 0; i
< DK_NDRIVE
; i
++)
/* if included, this starts TIME at zeroes, else == boot
lseek(kmem
, (long)name
[X_BOOTIME
].n_value
, 0);
read(kmem
, &bootime
, sizeof bootime
);
strcpy(buf
, ctime(&now
));
for (i
= 0; i
< DK_NDRIVE
; i
++) {
X(dk_xfer
); X(dk_seek
); X(dk_wds
); X(dk_time
);
for(i
=0; i
<CPUSTATES
; i
++) {
if (etime
< 5.0) /* < 5 ticks - ignore this trash */
Z(ncs_goodhits
); Z(ncs_badhits
); Z(ncs_miss
);
Z(ncs_long
); Z(ncs_pass2
); Z(ncs_2passes
);
s
.nchcount
= nchtotal
.ncs_goodhits
+ nchtotal
.ncs_badhits
+
nchtotal
.ncs_miss
+ nchtotal
.ncs_long
;
s1
.nchcount
= s
.nchcount
;
for (c
=0; c
<CPUSTATES
; c
++) {
l
= (int) ((f2
+ 1.0) / 2.0) - psiz
;
putfloat(f1
, 15, 10 + 11*c
, 4, 1, 0);
putint(ucount(), 1, 1, 3);
putfloat(avenrun
[0], 1, 18, 6, 2, 0);
putfloat(avenrun
[1], 1, 24, 6, 2, 0);
putfloat(avenrun
[2], 1, 30, 6, 2, 0);
putint(total
.t_arm
/2, 5, 5, 5);
putint(total
.t_armtxt
/2, 5, 10, 5);
putint(total
.t_avm
/2, 5, 15, 5);
putint(total
.t_avmtxt
/2, 5, 20, 5);
putint(total
.t_rm
/2, 6, 5, 5);
putint(total
.t_rmtxt
/2, 6, 10, 5);
putint(total
.t_vm
/2, 6, 15, 5);
putint(total
.t_vmtxt
/2, 6, 20, 5);
putint(total
.t_free
/2, 5, 27, 5);
putint(total
.t_rq
, 17, 62, 3);
putint(total
.t_pw
, 17, 65, 3);
putint(total
.t_dw
, 17, 68, 3);
putint(total
.t_sl
, 17, 71, 3);
putint(total
.t_sw
, 17, 74, 3);
putrate(rate
.v_swtch
, oldrate
.v_swtch
, 3, 75, 4);
putrate(rate
.v_trap
, oldrate
.v_trap
, 4, 75, 4);
putrate(rate
.v_syscall
, oldrate
.v_syscall
, 5, 75, 4);
putrate(rate
.v_intr
, oldrate
.v_intr
, 6, 75, 4);
putrate(rate
.v_pdma
, oldrate
.v_pdma
, 7, 75, 4);
putrate(rate
.v_faults
, oldrate
.v_faults
, 8, 75, 4);
putrate(rate
.v_scan
, oldrate
.v_scan
, 9, 75, 4);
putrate(rate
.v_rev
, oldrate
.v_rev
, 10, 75, 4);
putrate(rate
.v_pgin
, oldrate
.v_pgin
, 5, 45, 5);
putrate(rate
.v_pgout
, oldrate
.v_pgout
, 5, 50, 5);
putrate(rate
.v_swpin
, oldrate
.v_swpin
, 5, 55, 5);
putrate(rate
.v_swpout
, oldrate
.v_swpout
, 5, 60, 5);
putrate(rate
.v_pgpgin
, oldrate
.v_pgpgin
, 6, 45, 5);
putrate(rate
.v_pgpgout
, oldrate
.v_pgpgout
, 6, 50, 5);
putrate(rate
.v_pswpin
, oldrate
.v_pswpin
, 6, 55, 5);
putrate(rate
.v_pswpout
, oldrate
.v_pswpout
, 6, 60, 5);
putrate(rate
.v_pgrec
, oldrate
.v_pgrec
, 9, 40, 3);
putrate(rate
.v_intrans
, oldrate
.v_intrans
, 9, 44, 2);
putrate(rate
.v_xsfrec
, oldrate
.v_xsfrec
, 9, 47, 3);
putrate(rate
.v_xifrec
, oldrate
.v_xifrec
, 9, 51, 3);
putrate(rate
.v_pgfrec
, oldrate
.v_pgfrec
, 9, 55, 3);
putrate(rate
.v_dfree
, oldrate
.v_dfree
, 9, 59, 3);
putrate(rate
.v_seqfree
, oldrate
.v_seqfree
, 9, 63, 3);
putrate(rate
.v_zfod
, oldrate
.v_zfod
, 11, 40, 8);
putrate(rate
.v_nzfod
, oldrate
.v_nzfod
, 12, 40, 8);
putrate(rate
.v_exfod
, oldrate
.v_exfod
, 11, 54, 8);
putrate(rate
.v_nexfod
, oldrate
.v_nexfod
, 12, 54, 8);
( 100.0 * rate
.v_zfod
/ rate
.v_nzfod
)
: rate
.v_nzfod
== oldrate
.v_nzfod
?
( 100.0 * (rate
.v_zfod
-oldrate
.v_zfod
)
/ (rate
.v_nzfod
-oldrate
.v_nzfod
) )
( 100.0 * rate
.v_exfod
/ rate
.v_nexfod
)
: rate
.v_nexfod
== oldrate
.v_nexfod
?
( 100.0 * (rate
.v_exfod
-oldrate
.v_exfod
)
/ (rate
.v_nexfod
-oldrate
.v_nexfod
) )
for (i
= 0; i
< DK_NDRIVE
; i
++)
putint(s
.nchcount
, 21, 6, 5);
putint(nchtotal
.ncs_goodhits
, 21, 14, 4);
#define nz(x) ((x) ? (x) : 1)
putfloat(nchtotal
.ncs_goodhits
* 100.0 / nz(s
.nchcount
),
putint(nchtotal
.ncs_pass2
, 21, 28, 4);
putfloat(nchtotal
.ncs_pass2
* 100.0 / nz(s
.nchcount
),
/* calculate number of users on the system */
while (read(ut
, &utmp
, sizeof(utmp
)))
if (utmp
.ut_name
[0] != '\0')
for (i
=0; i
<CPUSTATES
; i
++)
return(s
.time
[indx
] * 100.0 / t
);
mvcur(0, COLS
-1, LINES
-1, 0);
select(32, &inbits
, 0, 0, &tv
);
static enum state oldstate
;
case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
mvprintw(1, 5, "users Load");
mvprintw(3, 1, "Mem REAL VIRTUAL ");
mvprintw(4, 1, " Tot Text Tot Text");
mvprintw(3, 40, " PAGING SWAPING ");
mvprintw(4, 40, " in out in out ");
mvprintw(5, 40, "count");
mvprintw(6, 40, "pages");
mvprintw(8, 40, "Rec It F/S F/F RFL Fre SFr");
mvprintw(13, 49, "%%zf");
mvprintw(13, 63, "%%xf");
mvprintw(15, 5, " Sys . %% User . %% Nice . %% Idle . %%");
mvprintw(15,57, "Procs r p d s w");
mvprintw(16, 5, "| | | | | | | | | | |");
mvprintw(19, 0, "Namei Sys-cache Proc-cache");
mvprintw(20, 0, " Calls hits %% hits %%");
mvprintw( 8, 0, "Discs");
mvprintw( 9, 0, "seeks");
mvprintw(10, 0, "xfers");
mvprintw(11, 0, " blks");
mvprintw(12, 0, " msps");
for (i
= 0; i
< DK_NDRIVE
; i
++)
if (dr_state
[i
] == SOME
) {
mvprintw(8, 5 + 5*j
, " %3.3s", dr_name
[j
]);
putint((int)((float)r
/etime
+ 0.5), l
, c
, w
);
putfloat(f
, l
, c
, w
, d
, nz
)
sprintf(b
, "%*.*f", w
, d
, f
);
* Read the drive names out of kmem.
* ARGH ARGH ARGH ARGH !!!!!!!!!!!!
#define steal(where, var) lseek(kmem, where, 0); read(kmem, &var, sizeof var);
register struct mba_device
*mp
;
char *cp
= (char *) &two_char
;
struct uba_device udev
, *up
;
mp
= (struct mba_device
*) name
[X_MBDINIT
].n_value
;
up
= (struct uba_device
*) name
[X_UBDINIT
].n_value
;
fprintf(stderr
, "vsta: 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%d", cp
[0], cp
[1], 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%d", cp
[0], cp
[1], udev
.ui_unit
);
lseek(kmem
, (long)name
[X_CPTIME
].n_value
,0);
read(kmem
, s
->time
, sizeof s
->time
);
lseek(kmem
, (long)name
[X_SUM
].n_value
, 0);
read(kmem
, &s
->Rate
, sizeof &s
->Rate
);
lseek(kmem
, (long)name
[X_RATE
].n_value
,0);
read(kmem
, &s
->Rate
, sizeof s
->Rate
);
lseek(kmem
, (long)name
[X_DEFICIT
].n_value
,0);
read(kmem
, deficit
, sizeof deficit
);
lseek( kmem
, (long)name
[X_AVENRUN
].n_value
, 0 );
read( kmem
, avenrun
, sizeof(avenrun
) );
lseek(kmem
, (long)name
[X_TOTAL
].n_value
,0);
read(kmem
, &s
->Total
, sizeof s
->Total
);
lseek(kmem
, (long)name
[X_DK_BUSY
].n_value
, 0);
read(kmem
, &s
->dk_busy
, sizeof s
->dk_busy
);
lseek(kmem
, (long)name
[X_DK_TIME
].n_value
, 0);
read(kmem
, s
->dk_time
, sizeof s
->dk_time
);
lseek(kmem
, (long)name
[X_DK_XFER
].n_value
, 0);
read(kmem
, s
->dk_xfer
, sizeof s
->dk_xfer
);
lseek(kmem
, (long)name
[X_DK_WDS
].n_value
, 0);
read(kmem
, s
->dk_wds
, sizeof s
->dk_wds
);
lseek(kmem
, (long)name
[X_TK_NIN
].n_value
, 0);
read(kmem
, &s
->tk_nin
, sizeof s
->tk_nin
);
lseek(kmem
, (long)name
[X_TK_NOUT
].n_value
, 0);
read(kmem
, &s
->tk_nout
, sizeof s
->tk_nout
);
lseek(kmem
, (long)name
[X_DK_SEEK
].n_value
, 0);
read(kmem
, s
->dk_seek
, sizeof s
->dk_seek
);
lseek(kmem
, (long)name
[X_NCHSTATS
].n_value
, 0);
read(kmem
, &s
->nchstats
, sizeof s
->nchstats
);
double words
, atime
, itime
, xtime
;
words
= s
.dk_wds
[dn
]*32.0; /* number of words transferred */
xtime
= s
.dk_mspw
[dn
]*words
; /* transfer time */
itime
= atime
- xtime
; /* time not transferring */
itime
+= xtime
, xtime
= 0;
xtime
+= itime
, itime
= 0;
putint((int)((float)s
.dk_seek
[dn
]/etime
+0.5), 9, c
, 5);
putint((int)((float)s
.dk_xfer
[dn
]/etime
+0.5), 10, c
, 5);
putint((int)(words
/etime
/512.0 + 0.5), 11, c
, 5);
putfloat(itime
*1000.0/s
.dk_seek
[dn
], 12, c
, 5, 1, 1);