xref: /original-bsd/usr.sbin/iostat/iostat.c (revision bac5051c)
1 static	char *sccsid = "@(#)iostat.c	4.2 (Berkeley) 10/19/80";
2 /*
3  * iostat
4  */
5 #include <nlist.h>
6 #include <sys/dk.h>
7 
8 struct nlist nl[] = {
9 	{ "_dk_busy" },
10 #define	X_DK_BUSY	0
11 	{ "_dk_time" },
12 #define	X_DK_TIME	1
13 	{ "_dk_xfer" },
14 #define	X_DK_XFER	2
15 	{ "_dk_wds" },
16 #define	X_DK_WDS	3
17 	{ "_tk_nin" },
18 #define	X_TK_NIN	4
19 	{ "_tk_nout" },
20 #define	X_TK_NOUT	5
21 	{ "_dk_seek" },
22 #define	X_DK_SEEK	6
23 	{ "_cp_time" },
24 #define	X_CP_TIME	7
25 	{ "_dk_mspw" },
26 #define	X_DK_MSPW	8
27 	{ 0 },
28 };
29 struct
30 {
31 	int	dk_busy;
32 	long	cp_time[CPUSTATES];
33 	long	dk_time[DK_NDRIVE];
34 	long	dk_wds[DK_NDRIVE];
35 	long	dk_seek[DK_NDRIVE];
36 	long	dk_xfer[DK_NDRIVE];
37 	float	dk_mspw[DK_NDRIVE];
38 	long	tk_nin;
39 	long	tk_nout;
40 } s, s1;
41 
42 int	mf;
43 double	etime;
44 
45 main(argc, argv)
46 char *argv[];
47 {
48 	extern char *ctime();
49 	register  i;
50 	int iter;
51 	double f1, f2;
52 	long t;
53 	int tohdr = 1;
54 
55 	nlist("/vmunix", nl);
56 	if(nl[X_DK_BUSY].n_type == 0) {
57 		printf("dk_busy not found in /vmunix namelist\n");
58 		exit(1);
59 	}
60 	mf = open("/dev/kmem", 0);
61 	if(mf < 0) {
62 		printf("cannot open /dev/kmem\n");
63 		exit(1);
64 	}
65 	iter = 0;
66 	while (argc>1&&argv[1][0]=='-') {
67 		argc--;
68 		argv++;
69 	}
70 	lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
71 	read(mf, s.dk_mspw, sizeof s.dk_mspw);
72 	if(argc > 2)
73 		iter = atoi(argv[2]);
74 loop:
75 	if (--tohdr == 0) {
76 		printf("      TTY");
77 		for (i = 0; i < DK_NDRIVE; i++)
78 			if (s.dk_mspw[i] != 0.0)
79 				printf("           D%d ", i);
80 		printf("         CPU\n");
81 		printf(" tin tout");
82 		for (i = 0; i < DK_NDRIVE; i++)
83 			if (s.dk_mspw[i] != 0.0)
84 				printf(" sps tps msps ");
85 		printf(" us ni sy id\n");
86 		tohdr = 19;
87 	}
88 	lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
89  	read(mf, &s.dk_busy, sizeof s.dk_busy);
90  	lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
91  	read(mf, s.dk_time, sizeof s.dk_time);
92  	lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
93  	read(mf, s.dk_xfer, sizeof s.dk_xfer);
94  	lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
95  	read(mf, s.dk_wds, sizeof s.dk_wds);
96  	lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
97  	read(mf, &s.tk_nin, sizeof s.tk_nin);
98  	lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
99  	read(mf, &s.tk_nout, sizeof s.tk_nout);
100 	lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
101 	read(mf, s.dk_seek, sizeof s.dk_seek);
102 	lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
103 	read(mf, s.cp_time, sizeof s.cp_time);
104 	lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
105 	read(mf, s.dk_mspw, sizeof s.dk_mspw);
106 	for (i = 0; i < DK_NDRIVE; i++) {
107 #define X(fld)	t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
108 		X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
109 	}
110 	t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
111 	t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
112 	etime = 0;
113 	for(i=0; i<CPUSTATES; i++) {
114 		X(cp_time);
115 		etime += s.cp_time[i];
116 	}
117 	if (etime == 0.0)
118 		etime = 1.0;
119 	etime /= 60.0;
120 	printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
121 	for (i=0; i<DK_NDRIVE; i++)
122 		if (s.dk_mspw[i] != 0.0)
123 			stats(i);
124 	for (i=0; i<CPUSTATES; i++)
125 		stat1(i);
126 	printf("\n");
127 contin:
128 	--iter;
129 	if(iter)
130 	if(argc > 1) {
131 		sleep(atoi(argv[1]));
132 		goto loop;
133 	}
134 }
135 
136 stats(dn)
137 {
138 	register i;
139 	double atime, words, xtime, itime;
140 
141 	if (s.dk_mspw[dn] == 0.0) {
142 		printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
143 		return;
144 	}
145 	atime = s.dk_time[dn];
146 	atime /= 60.0;
147 	words = s.dk_wds[dn]*32.0;	/* number of words transferred */
148 	xtime = s.dk_mspw[dn]*words;	/* transfer time */
149 	itime = atime - xtime;		/* time not transferring */
150 /*
151 	printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
152 	    dn, words, atime, xtime, itime);
153 */
154 	if (xtime < 0)
155 		itime += xtime, xtime = 0;
156 	if (itime < 0)
157 		xtime += itime, itime = 0;
158 	printf("%4.0f", s.dk_seek[dn]/etime);
159 	printf("%4.0f", s.dk_xfer[dn]/etime);
160 	printf("%5.1f ",
161 	    s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
162 /*
163 	printf("%4.1f",
164 	    s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
165 */
166 }
167 
168 stat1(o)
169 {
170 	register i;
171 	double time;
172 
173 	time = 0;
174 	for(i=0; i<CPUSTATES; i++)
175 		time += s.cp_time[i];
176 	if (time == 0.0)
177 		time = 1.0;
178 	printf("%3.0f", 100*s.cp_time[o]/time);
179 }
180