this is ok by me, obviously.
On Sun, Nov 20, 2022 at 06:18:55PM -0600, Scott Cheloha wrote:
> Hi,
>
> systat(1)'s vmstat view should not use statclock() ticks to count
> elapsed time. First, ticks are very low resolution and they aren't
> always of equal length. Second, we're counting the ticks from every
> CPU on the system, so all the rates in the view are divided by the
> number of CPUs.
>
> Instead, compute an elapsed time with clock_gettime(2). Prefer
> CLOCK_UPTIME to CLOCK_MONOTONIC to exclude any time the system is
> suspended. With this change we can remove "stathz", "hertz", and the
> secondary clock failure test.
>
> For comparison, consider my laptop with 8 CPUs while it's building
> clang.
>
> Before:
>
> 7 users Load 11.96 8.89 4.08 jetsam.attlocal.net
> 18:05:37
>
> memory totals (in KB) PAGING SWAPPING Interrupts
> real virtual free in out in out 234 total
> Active 1352876 1352876 10132884 ops acpi0
> All 5974204 5974204 43687312 pages 1
> inteldrm
> 8 xhci0
> Proc:r d s w Csw Trp Sys Int Sof Flt forks 3 iwm0
> 9 157 27 2640 1320 13 35 2634 fkppw nvme0
> fksvm
> azalia0
> 0.1%Int 0.6%Spn 3.4%Sys 95.9%Usr 0.0%Idle pwait pckbc0
> | | | | | | | | | | | relck pckbc0
> ==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> rlkok 200 clock
> noram 22 ipi
> Namei Sys-cache Proc-cache No-cache 210 ndcpy
> Calls hits % hits % miss % fltcp
> 36633 35567 97 1066 3 2466 zfod
> cow
> Disks sd0 sd1 134225 fmin
> seeks 178966 ftarg
> xfers 2 itarg
> speed 32K 11781 wired
> sec 0.0 pdfre
> pdscn
> -2549 pzidl 2 IPKTS
> 37 kmape OPKTS
>
> After:
>
> 7 users Load 10.80 8.87 4.21 jetsam.attlocal.net
> 18:06:04
>
> memory totals (in KB) PAGING SWAPPING Interrupts
> real virtual free in out in out 1867 total
> Active 1920708 1920708 9534016 ops acpi0
> All 6573072 6573072 43088444 pages 12
> inteldrm
> 62 xhci0
> Proc:r d s w Csw Trp Sys Int Sof Flt forks 21 iwm0
> 9 157 213 49039 6150 102 27349046 fkppw 7 nvme0
> fksvm
> azalia0
> 0.0%Int 1.5%Spn 4.5%Sys 94.1%Usr 0.0%Idle pwait pckbc0
> | | | | | | | | | | | 5 relck pckbc0
> @==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 5 rlkok 1600 clock
> noram 165 ipi
> Namei Sys-cache Proc-cache No-cache 1966 ndcpy
> Calls hits % hits % miss % fltcp
> 26320 26198 100 122 0 48171 zfod
> cow
> Disks sd0 sd1 134225 fmin
> seeks 178966 ftarg
> xfers 7 itarg
> speed 112K 12805 wired
> sec 0.0 pdfre
> pdscn
> -45812 pzidl 2 IPKTS
> 36 kmape OPKTS
>
> One standout difference is the "clock" interrupt rate. It is off by a
> factor of 8 in the first view and corrected in the second.
>
> CC jmatthew@ and dlg@, who apparently spent some time trying to debug
> the wrong problem because of this.
>
> ok?
>
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/main.c,v
> retrieving revision 1.76
> diff -u -p -r1.76 main.c
> --- main.c 12 Jul 2021 15:09:20 -0000 1.76
> +++ main.c 21 Nov 2022 00:15:12 -0000
> @@ -65,7 +65,7 @@ double avenrun[3];
> double naptime = 5.0;
> int verbose = 1; /* to report kvm read errs */
> int nflag = 1;
> -int ut, hz, stathz;
> +int ut, hz;
> char hostname[HOST_NAME_MAX+1];
> WINDOW *wnd;
> int CMDLINE;
> @@ -414,7 +414,6 @@ gethz(void)
> mib[1] = KERN_CLOCKRATE;
> if (sysctl(mib, 2, &cinf, &size, NULL, 0) == -1)
> return;
> - stathz = cinf.stathz;
> hz = cinf.hz;
> }
>
> Index: systat.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/systat.h,v
> retrieving revision 1.24
> diff -u -p -r1.24 systat.h
> --- systat.h 18 Jan 2021 00:49:09 -0000 1.24
> +++ systat.h 21 Nov 2022 00:15:12 -0000
> @@ -58,7 +58,7 @@ extern kvm_t *kd;
> extern long ntext;
> extern int *dk_select;
> extern int dk_ndrive;
> -extern int hz, stathz;
> +extern int hz;
> extern double naptime;
> extern size_t nhosts;
> extern size_t nports;
> Index: vmstat.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/vmstat.c,v
> retrieving revision 1.94
> diff -u -p -r1.94 vmstat.c
> --- vmstat.c 22 Feb 2022 17:35:01 -0000 1.94
> +++ vmstat.c 21 Nov 2022 00:15:13 -0000
> @@ -98,7 +98,6 @@ int select_vm(void);
> int vm_keyboard_callback(int);
>
> static time_t t;
> -static float hertz;
> static int nintr;
> static long *intrloc;
> static char **intrname;
> @@ -170,7 +169,6 @@ initvmstat(void)
> int mib[4], i;
> size_t size;
>
> - hertz = stathz;
> if (!dkinit(1))
> return(0);
>
> @@ -323,7 +321,6 @@ labelkre(void)
> Y(fld); \
> putint((int)((float)s.fld/etime + 0.5), l, c, w); \
> } while (0)
> -#define MAXFAIL 5
>
> static char cpuchar[] = { '|', '@', '=', '>', ' ' };
> static char cpuorder[] = { CP_INTR, CP_SPIN, CP_SYS, CP_USER, CP_IDLE
> };
> @@ -331,33 +328,27 @@ static char cpuorder[] = { CP_INTR, CP_S
> void
> showkre(void)
> {
> + static struct timespec prev;
> + struct timespec elapsed, now;
> float f1, f2;
> int psiz;
> u_int64_t inttotal, intcnt;
> int i, l, c;
> - static int failcnt = 0, first_run = 0;
> + static int first_run = 0;
> double etime;
>
> + clock_gettime(CLOCK_UPTIME, &now);
> + timespecsub(&now, &prev, &elapsed);
> + prev = now;
> if (state == TIME) {
> if (!first_run) {
> first_run = 1;
> return;
> }
> }
> - etime = 0;
> - for (i = 0; i < CPUSTATES; i++) {
> + etime = elapsed.tv_sec + elapsed.tv_nsec / 1000000000.0;
> + for (i = 0; i < CPUSTATES; i++)
> X(cpustats.cs_time);
> - etime += s.cpustats.cs_time[i];
> - }
> - if (etime < 5.0) { /* < 5 ticks - ignore this trash */
> - if (failcnt++ >= MAXFAIL) {
> - error("The alternate system clock has died!");
> - failcnt = 0;
> - }
> - return;
> - }
> - failcnt = 0;
> - etime /= hertz;
> inttotal = 0;
> for (i = 0; i < nintr; i++) {
> t = intcnt = s.intrcnt[i];