version 1.1, 1995/10/18 08:46:10 |
version 1.2, 1996/05/22 11:35:39 |
|
|
/* $NetBSD: vmstat.c,v 1.4 1995/04/29 05:54:55 cgd Exp $ */ |
/* $NetBSD: vmstat.c,v 1.5 1996/05/10 23:16:40 thorpej Exp $ */ |
|
|
/*- |
/*- |
* Copyright (c) 1983, 1989, 1992, 1993 |
* Copyright (c) 1983, 1989, 1992, 1993 |
|
|
#if 0 |
#if 0 |
static char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 1/12/94"; |
static char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 1/12/94"; |
#endif |
#endif |
static char rcsid[] = "$NetBSD: vmstat.c,v 1.4 1995/04/29 05:54:55 cgd Exp $"; |
static char rcsid[] = "$NetBSD: vmstat.c,v 1.5 1996/05/10 23:16:40 thorpej Exp $"; |
#endif /* not lint */ |
#endif /* not lint */ |
|
|
/* |
/* |
|
|
long time[CPUSTATES]; |
long time[CPUSTATES]; |
struct vmmeter Cnt; |
struct vmmeter Cnt; |
struct vmtotal Total; |
struct vmtotal Total; |
long *dk_time; |
|
long *dk_wds; |
|
long *dk_seek; |
|
long *dk_xfer; |
|
int dk_busy; |
|
struct nchstats nchstats; |
struct nchstats nchstats; |
long nchcount; |
long nchcount; |
long *intrcnt; |
long *intrcnt; |
} s, s1, s2, z; |
} s, s1, s2, z; |
|
|
|
#include "dkstats.h" |
|
extern struct _disk cur; |
|
|
|
|
#define cnt s.Cnt |
#define cnt s.Cnt |
#define oldcnt s1.Cnt |
#define oldcnt s1.Cnt |
#define total s.Total |
#define total s.Total |
|
|
} |
} |
} |
} |
hertz = stathz ? stathz : hz; |
hertz = stathz ? stathz : hz; |
if (! dkinit()) |
if (! dkinit(1)) |
return(0); |
return(0); |
if (dk_ndrive && !once) { |
if (dk_ndrive && !once) { |
#define allocate(e, t) \ |
#define allocate(e, t) \ |
|
|
s1./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ |
s1./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ |
s2./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ |
s2./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \ |
z./**/e = (t *)calloc(dk_ndrive, sizeof (t)); |
z./**/e = (t *)calloc(dk_ndrive, sizeof (t)); |
allocate(dk_time, long); |
|
allocate(dk_wds, long); |
|
allocate(dk_seek, long); |
|
allocate(dk_xfer, long); |
|
once = 1; |
once = 1; |
#undef allocate |
#undef allocate |
} |
} |
|
|
mvprintw(DISKROW, DISKCOL, "Discs"); |
mvprintw(DISKROW, DISKCOL, "Discs"); |
mvprintw(DISKROW + 1, DISKCOL, "seeks"); |
mvprintw(DISKROW + 1, DISKCOL, "seeks"); |
mvprintw(DISKROW + 2, DISKCOL, "xfers"); |
mvprintw(DISKROW + 2, DISKCOL, "xfers"); |
mvprintw(DISKROW + 3, DISKCOL, " blks"); |
mvprintw(DISKROW + 3, DISKCOL, "Kbyte"); |
mvprintw(DISKROW + 4, DISKCOL, " msps"); |
mvprintw(DISKROW + 4, DISKCOL, " sec"); |
j = 0; |
j = 0; |
for (i = 0; i < dk_ndrive && j < MAXDRIVES; i++) |
for (i = 0; i < dk_ndrive && j < MAXDRIVES; i++) |
if (dk_select[i]) { |
if (dk_select[i]) { |
|
|
int i, l, c; |
int i, l, c; |
static int failcnt = 0; |
static int failcnt = 0; |
|
|
for (i = 0; i < dk_ndrive; i++) { |
|
X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time); |
if (state == TIME) |
} |
dkswap(); |
etime = 0; |
etime = 0; |
for(i = 0; i < CPUSTATES; i++) { |
for(i = 0; i < CPUSTATES; i++) { |
X(time); |
X(time); |
|
|
size_t size; |
size_t size; |
extern int errno; |
extern int errno; |
|
|
|
dkreadstats(); |
NREAD(X_CPTIME, s->time, sizeof s->time); |
NREAD(X_CPTIME, s->time, sizeof s->time); |
NREAD(X_CNT, &s->Cnt, sizeof s->Cnt); |
NREAD(X_CNT, &s->Cnt, sizeof s->Cnt); |
NREAD(X_DK_BUSY, &s->dk_busy, LONG); |
|
NREAD(X_DK_TIME, s->dk_time, dk_ndrive * LONG); |
|
NREAD(X_DK_XFER, s->dk_xfer, dk_ndrive * LONG); |
|
NREAD(X_DK_WDS, s->dk_wds, dk_ndrive * LONG); |
|
NREAD(X_DK_SEEK, s->dk_seek, dk_ndrive * LONG); |
|
NREAD(X_NCHSTATS, &s->nchstats, sizeof s->nchstats); |
NREAD(X_NCHSTATS, &s->nchstats, sizeof s->nchstats); |
NREAD(X_INTRCNT, s->intrcnt, nintr * LONG); |
NREAD(X_INTRCNT, s->intrcnt, nintr * LONG); |
size = sizeof(s->Total); |
size = sizeof(s->Total); |
|
|
copyinfo(from, to) |
copyinfo(from, to) |
register struct Info *from, *to; |
register struct Info *from, *to; |
{ |
{ |
long *time, *wds, *seek, *xfer; |
|
long *intrcnt; |
long *intrcnt; |
|
|
/* |
intrcnt = to->intrcnt; |
* time, wds, seek, and xfer are malloc'd so we have to |
|
* save the pointers before the structure copy and then |
|
* copy by hand. |
|
*/ |
|
time = to->dk_time; wds = to->dk_wds; seek = to->dk_seek; |
|
xfer = to->dk_xfer; intrcnt = to->intrcnt; |
|
*to = *from; |
*to = *from; |
bcopy(from->dk_time, to->dk_time = time, dk_ndrive * sizeof (long)); |
|
bcopy(from->dk_wds, to->dk_wds = wds, dk_ndrive * sizeof (long)); |
|
bcopy(from->dk_seek, to->dk_seek = seek, dk_ndrive * sizeof (long)); |
|
bcopy(from->dk_xfer, to->dk_xfer = xfer, dk_ndrive * sizeof (long)); |
|
bcopy(from->intrcnt, to->intrcnt = intrcnt, nintr * sizeof (int)); |
bcopy(from->intrcnt, to->intrcnt = intrcnt, nintr * sizeof (int)); |
} |
} |
|
|
|
|
dinfo(dn, c) |
dinfo(dn, c) |
int dn, c; |
int dn, c; |
{ |
{ |
double words, atime, itime, xtime; |
double words, atime; |
|
|
c = DISKCOL + c * 5; |
c = DISKCOL + c * 5; |
atime = s.dk_time[dn]; |
|
atime /= hertz; |
/* time busy in disk activity */ |
words = s.dk_wds[dn]*32.0; /* number of words transferred */ |
atime = (double)cur.dk_time[dn].tv_sec + |
xtime = dk_mspw[dn]*words; /* transfer time */ |
((double)cur.dk_time[dn].tv_usec / (double)1000000); |
itime = atime - xtime; /* time not transferring */ |
|
if (xtime < 0) |
words = cur.dk_bytes[dn] / 1024.0; /* # of K transferred */ |
itime += xtime, xtime = 0; |
|
if (itime < 0) |
putint((int)((float)cur.dk_seek[dn]/etime+0.5), DISKROW + 1, c, 5); |
xtime += itime, itime = 0; |
putint((int)((float)cur.dk_xfer[dn]/etime+0.5), DISKROW + 2, c, 5); |
putint((int)((float)s.dk_seek[dn]/etime+0.5), DISKROW + 1, c, 5); |
putint((int)(words/etime + 0.5), DISKROW + 3, c, 5); |
putint((int)((float)s.dk_xfer[dn]/etime+0.5), DISKROW + 2, c, 5); |
putfloat(atime/etime, DISKROW + 4, c, 5, 1, 1); |
putint((int)(words/etime/512.0 + 0.5), DISKROW + 3, c, 5); |
|
if (s.dk_seek[dn]) |
|
putfloat(itime*1000.0/s.dk_seek[dn], DISKROW + 4, c, 5, 1, 1); |
|
else |
|
putint(0, DISKROW + 4, c, 5); |
|
} |
} |