Date: Thu, 20 Nov 2003 17:36:55 +0200 From: Peter Pentchev <roam@ringlet.net> To: Dag-Erling Sm?rgrav <des@des.no> Cc: Mike Tancsa <mike@sentex.net> Subject: Re: interrupt statistics Message-ID: <20031120153655.GI300@straylight.m.ringlet.net> In-Reply-To: <xzpznerjg2s.fsf@dwp.des.no> References: <xzpy8ucpwz9.fsf@dwp.des.no> <jfforv4me3snqshljprg8jejht7ias0oih@4ax.com> <20031120044945.GA44933@falcon.midgard.homeip.net> <20031120131903.GG300@straylight.m.ringlet.net> <xzpznerjg2s.fsf@dwp.des.no>
next in thread | previous in thread | raw e-mail | index | archive | help
--h3LYUU6HlUDSAOzy Content-Type: multipart/mixed; boundary="f5QefDQHtn8hx44O" Content-Disposition: inline --f5QefDQHtn8hx44O Content-Type: text/plain; charset=windows-1251 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Nov 20, 2003 at 02:59:55PM +0100, Dag-Erling Sm?rgrav wrote: > Peter Pentchev <roam@ringlet.net> writes: > > This is easily fixed, e.g. by the attached. Note that I've only tested > > the RELENG_4 patch, my 5.x machine is out of commission for the next few > > days :( (and no, I couldn't test it on ref5 for obvious reasons related > > to /dev/mem ;) >=20 > Hmm, vmstat should uses sysctls, not /dev/mem. Perhaps you can make a > patch for that too? :) Awwighty, attached is a patch that converts getuptime() and dointr() to use sysctl, and then adds the -a option to display all interrupts. This one was tested on both RELENG_4 and HEAD (ref5) :) G'luck, Peter --=20 Peter Pentchev roam@ringlet.net roam@sbnd.net roam@FreeBSD.org PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553 This would easier understand fewer had omitted. --f5QefDQHtn8hx44O Content-Type: text/plain; charset=windows-1251 Content-Disposition: attachment; filename="vmstat-sysctl-intr-HEAD.patch" Content-Transfer-Encoding: quoted-printable ? src/usr.bin/vmstat/.depend ? src/usr.bin/vmstat/vmstat ? src/usr.bin/vmstat/vmstat.8.gz Index: src/usr.bin/vmstat/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/usr.bin/vmstat/Makefile,v retrieving revision 1.9 diff -u -r1.9 Makefile --- src/usr.bin/vmstat/Makefile 8 Feb 2002 23:07:36 -0000 1.9 +++ src/usr.bin/vmstat/Makefile 20 Nov 2003 15:33:37 -0000 @@ -3,6 +3,7 @@ =20 PROG=3D vmstat MAN=3D vmstat.8 +CFLAGS+=3D-DVMSTAT_SYSCTL BINGRP=3D kmem BINMODE=3D2555 DPADD=3D ${LIBKVM} ${LIBDEVSTAT} Index: src/usr.bin/vmstat/vmstat.8 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.8,v retrieving revision 1.25 diff -u -r1.25 vmstat.8 --- src/usr.bin/vmstat/vmstat.8 14 Apr 2003 07:22:25 -0000 1.25 +++ src/usr.bin/vmstat/vmstat.8 20 Nov 2003 15:33:37 -0000 @@ -41,7 +41,7 @@ .Sh SYNOPSIS .Nm .\" .Op Fl fimst -.Op Fl fimsz +.Op Fl afimsz .Op Fl c Ar count .Op Fl M Ar core .Op Fl N Ar system @@ -62,6 +62,10 @@ .Pp The options are as follows: .Bl -tag -width indent +.It Fl a +When used with +.Fl i , +include statistics about interrupts that have never been generated. .It Fl c Repeat the display .Ar count Index: src/usr.bin/vmstat/vmstat.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.c,v retrieving revision 1.69 diff -u -r1.69 vmstat.c --- src/usr.bin/vmstat/vmstat.c 9 Nov 2003 20:39:56 -0000 1.69 +++ src/usr.bin/vmstat/vmstat.c 20 Nov 2003 15:33:37 -0000 @@ -129,6 +129,7 @@ struct vmmeter sum, osum; =20 int winlines =3D 20; +int aflag =3D 0; int nflag =3D 0; =20 kvm_t *kd; @@ -174,8 +175,11 @@ memf =3D nlistf =3D NULL; interval =3D reps =3D todo =3D 0; maxshowdevs =3D 2; - while ((c =3D getopt(argc, argv, "c:fiM:mN:n:p:stw:z")) !=3D -1) { + while ((c =3D getopt(argc, argv, "ac:fiM:mN:n:p:stw:z")) !=3D -1) { switch (c) { + case 'a': + aflag++; + break; case 'c': reps =3D atoi(optarg); break; @@ -239,24 +243,26 @@ if (nlistf !=3D NULL || memf !=3D NULL) setgid(getgid()); =20 - kd =3D kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); - if (kd =3D=3D 0)=20 - errx(1, "kvm_openfiles: %s", errbuf); - setgid(getgid()); - - if ((c =3D kvm_nlist(kd, namelist)) !=3D 0) { - if (c > 0) { - warnx("undefined symbols:"); - for (c =3D 0; - c < (int)(sizeof(namelist)/sizeof(namelist[0])); - c++) - if (namelist[c].n_type =3D=3D 0) - (void)fprintf(stderr, " %s", - namelist[c].n_name); - (void)fputc('\n', stderr); - } else - warnx("kvm_nlist: %s", kvm_geterr(kd)); - exit(1); + if (todo & ~INTRSTAT) { + kd =3D kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); + if (kd =3D=3D 0)=20 + errx(1, "kvm_openfiles: %s", errbuf); + setgid(getgid()); + =09 + if ((c =3D kvm_nlist(kd, namelist)) !=3D 0) { + if (c > 0) { + warnx("undefined symbols:"); + for (c =3D 0; + c < (int)(sizeof(namelist)/sizeof(namelist[0])); + c++) + if (namelist[c].n_type =3D=3D 0) + (void)fprintf(stderr, " %s", + namelist[c].n_name); + (void)fputc('\n', stderr); + } else + warnx("kvm_nlist: %s", kvm_geterr(kd)); + exit(1); + } } =20 if (todo & VMSTAT) { @@ -386,8 +392,26 @@ static time_t now; time_t uptime; =20 - if (boottime.tv_sec =3D=3D 0) + if (boottime.tv_sec =3D=3D 0) { +#ifdef VMSTAT_SYSCTL + int mib[2] =3D { CTL_KERN, KERN_BOOTTIME }; + char *value; + size_t size; + + if (sysctl(mib, 2, NULL, &size, NULL, NULL) =3D=3D -1) + err(1, "sysctl(kern.boottime)"); + if (size < sizeof(boottime)) + errx(1, "sizeof(kern.boottime) < sizeof(timeval)"); + value =3D malloc(size); + if (value =3D=3D NULL) + errx(1, "malloc"); + if (sysctl(mib, 2, value, &size, NULL, NULL) =3D=3D -1) + err(1, "sysctl(kern.boottime)"); + memcpy(&boottime, value, sizeof(boottime)); +#else /* VMSTAT_SYSCTL */ kread(X_BOOTTIME, &boottime, sizeof(boottime)); +#endif /* VMSTAT_SYSCTL */ + } (void)time(&now); uptime =3D now - boottime.tv_sec; if (uptime <=3D 0 || uptime > 60*60*24*365*10) @@ -732,9 +756,42 @@ int i, istrnamlen; size_t clen; char *intrname, *tintrname; +#ifdef VMSTAT_SYSCTL + int *mibcnt, *mibname; + size_t mibcntsize, mibnamesize; +#endif /* VMSTAT_SYSCTL */ =20 uptime =3D getuptime(); - nintr =3D namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value; +#ifdef VMSTAT_SYSCTL + /* Fetch the sysctl MIB's */ + if (sysctlnametomib("hw.intrcnt", NULL, &mibcntsize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + mibcnt =3D malloc(mibcntsize * sizeof(int)); + if (mibcnt =3D=3D NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrcnt", mibcnt, &mibcntsize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + if (sysctlnametomib("hw.intrnames", NULL, &mibnamesize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + mibname =3D malloc(mibnamesize * sizeof(int)); + if (mibname =3D=3D NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrnames", mibname, &mibnamesize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + + /* Fetch the arrays themselves */ + if (sysctl(mibcnt, mibcntsize, NULL, &nintr, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrcnt)"); + intrcnt =3D malloc((size_t)nintr); + if (sysctl(mibcnt, mibcntsize, intrcnt, &nintr, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrcnt)"); + if (sysctl(mibname, mibnamesize, NULL, &inamlen, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrnames)"); + intrname =3D malloc((size_t)inamlen); + if (sysctl(mibname, mibnamesize, intrname, &inamlen, NULL, NULL) =3D=3D -= 1) + err(1, "sysctl(hw.intrnames)"); +#else /* VMSTAT_SYSCTL */ + intr =3D namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value; inamlen =3D namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; intrcnt =3D malloc((size_t)nintr); @@ -743,6 +800,7 @@ errx(1, "malloc"); kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); +#endif /* VMSTAT_SYSCTL */ nintr /=3D sizeof(u_long); tintrname =3D intrname; istrnamlen =3D strlen("interrupt"); @@ -756,7 +814,7 @@ "rate"); inttotal =3D 0; while (--nintr >=3D 0) { - if (*intrcnt) + if (*intrcnt || (aflag && intrname[0])) (void)printf("%-*s %20lu %10lu\n", istrnamlen, intrname, *intrcnt, *intrcnt / uptime); intrname +=3D strlen(intrname) + 1; @@ -829,7 +887,7 @@ usage() { (void)fprintf(stderr, "%s%s", - "usage: vmstat [-imsz] [-c count] [-M core] [-N system] [-w wait]\n", + "usage: vmstat [-aimsz] [-c count] [-M core] [-N system] [-w wait]\n", " [-n devs] [disks]\n"); exit(1); } --f5QefDQHtn8hx44O Content-Type: text/plain; charset=windows-1251 Content-Disposition: attachment; filename="vmstat-sysctl-intr-RELENG_4.patch" Content-Transfer-Encoding: quoted-printable Index: src/usr.bin/vmstat/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/usr.bin/vmstat/Makefile,v retrieving revision 1.5.6.1 diff -u -r1.5.6.1 Makefile --- src/usr.bin/vmstat/Makefile 25 Apr 2001 11:29:44 -0000 1.5.6.1 +++ src/usr.bin/vmstat/Makefile 20 Nov 2003 15:07:45 -0000 @@ -3,6 +3,7 @@ =20 PROG=3D vmstat MAN=3D vmstat.8 +CFLAGS+=3D-DVMSTAT_SYSCTL CFLAGS+=3D-I${.CURDIR}/../../sys BINGRP=3D kmem BINMODE=3D2555 Index: src/usr.bin/vmstat/vmstat.8 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.8,v retrieving revision 1.16.2.5 diff -u -r1.16.2.5 vmstat.8 --- src/usr.bin/vmstat/vmstat.8 16 Aug 2001 13:17:13 -0000 1.16.2.5 +++ src/usr.bin/vmstat/vmstat.8 20 Nov 2003 12:21:23 -0000 @@ -41,7 +41,7 @@ .Sh SYNOPSIS .Nm .\" .Op Fl fimst -.Op Fl imsz +.Op Fl aimsz .Op Fl c Ar count .Op Fl M Ar core .Op Fl N Ar system @@ -61,6 +61,10 @@ .Pp The options are as follows: .Bl -tag -width indent +.It Fl a +When used with +.Fl i , +include statistics about interrupts that have never been generated. .It Fl c Repeat the display .Ar count Index: src/usr.bin/vmstat/vmstat.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /home/ncvs/src/usr.bin/vmstat/vmstat.c,v retrieving revision 1.38.2.5 diff -u -r1.38.2.5 vmstat.c --- src/usr.bin/vmstat/vmstat.c 20 Sep 2003 19:10:01 -0000 1.38.2.5 +++ src/usr.bin/vmstat/vmstat.c 20 Nov 2003 15:16:01 -0000 @@ -135,6 +135,7 @@ struct vmmeter sum, osum; =20 int winlines =3D 20; +int aflag =3D 0; int nflag =3D 0; =20 kvm_t *kd; @@ -169,8 +170,11 @@ memf =3D nlistf =3D NULL; interval =3D reps =3D todo =3D 0; maxshowdevs =3D 2; - while ((c =3D getopt(argc, argv, "c:fiM:mN:n:p:stw:z")) !=3D -1) { + while ((c =3D getopt(argc, argv, "ac:fiM:mN:n:p:stw:z")) !=3D -1) { switch (c) { + case 'a': + aflag++; + break; case 'c': reps =3D atoi(optarg); break; @@ -238,22 +242,25 @@ if (nlistf !=3D NULL || memf !=3D NULL) setgid(getgid()); =20 - kd =3D kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); - if (kd =3D=3D 0)=20 - errx(1, "kvm_openfiles: %s", errbuf); - - if ((c =3D kvm_nlist(kd, namelist)) !=3D 0) { - if (c > 0) { - warnx("undefined symbols:"); - for (c =3D 0; - c < sizeof(namelist)/sizeof(namelist[0]); c++) - if (namelist[c].n_type =3D=3D 0) - fprintf(stderr, " %s", - namelist[c].n_name); - (void)fputc('\n', stderr); - } else - warnx("kvm_nlist: %s", kvm_geterr(kd)); - exit(1); + if (todo & ~INTRSTAT) { + kd =3D kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); + if (kd =3D=3D 0)=20 + errx(1, "kvm_openfiles: %s", errbuf); + =09 + if ((c =3D kvm_nlist(kd, namelist)) !=3D 0) { + if (c > 0) { + warnx("undefined symbols:"); + for (c =3D 0; + c < sizeof(namelist)/sizeof(namelist[0]); + c++) + if (namelist[c].n_type =3D=3D 0) + fprintf(stderr, " %s", + namelist[c].n_name); + (void)fputc('\n', stderr); + } else + warnx("kvm_nlist: %s", kvm_geterr(kd)); + exit(1); + } } =20 if (todo & VMSTAT) { @@ -385,8 +392,26 @@ static time_t now, boottime; time_t uptime; =20 - if (boottime =3D=3D 0) + if (boottime =3D=3D 0) { +#ifdef VMSTAT_SYSCTL + int mib[2] =3D { CTL_KERN, KERN_BOOTTIME }; + char *value; + size_t size; + + if (sysctl(mib, 2, NULL, &size, NULL, NULL) =3D=3D -1) + err(1, "sysctl(kern.boottime)"); + if (size < sizeof(boottime)) + errx(1, "sizeof(kern.boottime) < sizeof(time_t)"); + value =3D malloc(size); + if (value =3D=3D NULL) + errx(1, "malloc"); + if (sysctl(mib, 2, value, &size, NULL, NULL) =3D=3D -1) + err(1, "sysctl(kern.boottime)"); + memcpy(&boottime, value, sizeof(boottime)); +#else /* VMSTAT_SYSCTL */ kread(X_BOOTTIME, &boottime, sizeof(boottime)); +#endif /* VMSTAT_SYSCTL */ + } (void)time(&now); uptime =3D now - boottime; if (uptime <=3D 0 || uptime > 60*60*24*365*10) @@ -722,10 +747,43 @@ { register u_long *intrcnt, uptime; register u_int64_t inttotal; - register int nintr, inamlen; + int nintr, inamlen; register char *intrname; +#ifdef VMSTAT_SYSCTL + int *mibcnt, *mibname; + size_t mibcntsize, mibnamesize; +#endif /* VMSTAT_SYSCTL */ =20 uptime =3D getuptime(); +#ifdef VMSTAT_SYSCTL + /* Fetch the sysctl MIB's */ + if (sysctlnametomib("hw.intrcnt", NULL, &mibcntsize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + mibcnt =3D malloc(mibcntsize * sizeof(int)); + if (mibcnt =3D=3D NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrcnt", mibcnt, &mibcntsize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrcnt sysctl"); + if (sysctlnametomib("hw.intrnames", NULL, &mibnamesize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + mibname =3D malloc(mibnamesize * sizeof(int)); + if (mibname =3D=3D NULL) + errx(1, "malloc"); + if (sysctlnametomib("hw.intrnames", mibname, &mibnamesize) =3D=3D -1) + err(1, "fetching the MIB for the hw.intrnames sysctl"); + + /* Fetch the arrays themselves */ + if (sysctl(mibcnt, mibcntsize, NULL, &nintr, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrcnt)"); + intrcnt =3D malloc((size_t)nintr); + if (sysctl(mibcnt, mibcntsize, intrcnt, &nintr, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrcnt)"); + if (sysctl(mibname, mibnamesize, NULL, &inamlen, NULL, NULL) =3D=3D -1) + err(1, "sysctl(hw.intrnames)"); + intrname =3D malloc((size_t)inamlen); + if (sysctl(mibname, mibnamesize, intrname, &inamlen, NULL, NULL) =3D=3D -= 1) + err(1, "sysctl(hw.intrnames)"); +#else /* VMSTAT_SYSCTL */ nintr =3D namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value; inamlen =3D namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; @@ -735,11 +793,12 @@ errx(1, "malloc"); kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); +#endif /* VMSTAT_SYSCTL */ (void)printf("interrupt total rate\n"); inttotal =3D 0; nintr /=3D sizeof(long); while (--nintr >=3D 0) { - if (*intrcnt) + if (*intrcnt || (aflag && intrname[0])) (void)printf("%-12s %20lu %10lu\n", intrname, *intrcnt, *intrcnt / uptime); intrname +=3D strlen(intrname) + 1; @@ -917,7 +976,7 @@ usage() { (void)fprintf(stderr, "%s%s", - "usage: vmstat [-imsz] [-c count] [-M core] [-N system] [-w wait]\n", + "usage: vmstat [-aimsz] [-c count] [-M core] [-N system] [-w wait]\n", " [-n devs] [disks]\n"); exit(1); } --f5QefDQHtn8hx44O-- --h3LYUU6HlUDSAOzy Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (FreeBSD) iD8DBQE/vN+X7Ri2jRYZRVMRAk3gAJ99iCMqz1wC5BT6+MYi2o170klTHgCfTtNI zdHQBoYAClDMTR11tz5o/6c= =ATcu -----END PGP SIGNATURE----- --h3LYUU6HlUDSAOzy--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031120153655.GI300>