Hi Mark,

Jon, would you mind to take a look, please?


This looks good to me, just one question...

On Nov 12 22:03, Mark Geisert wrote:
> Commentary wording adjusted to say ProcessorQueueLength counts threads,
> not processes.  Also mention (upcoming) new tool /bin/loadavg.  The
> release note for Cygwin 3.5.5 is updated.
> 
> In counting runnable threads, divide by NumberOfProcessors to model
> distributing the threads among all processors.  Otherwise one gets e.g.
> PQLs of 20 or more just running a few lively X applications.  These PQLs
> vary greatly between kernel stats updates every 16ms, so are very clearly
> short-term loads.  This change helps reduce jitter in load average
> calculations.
> 
> At end of load_init(), obtain and discard the first measure of the
> counters to deal with the first call always returning error, no data.
> Follow this with a short delay so the next measure actually has data to
> report.
> 
> At least one older version of Windows, i.e. Win10 Pro 21H1, has a different
> name/location for the '% Processor Time' counter and is missing the
> 'Processor Queue Length' counter entirely.  Code is changed to support
> both possible locations of the former and treat the latter as always
> reporting 0.0.
> 
> Reported-by: Mark Liam Brown <brownmarkl...@gmail.com>
> Addresses: https://cygwin.com/pipermail/cygwin/2024-August/256361.html
> Signed-off-by: Mark Geisert <m...@maxrnd.com>
> Fixes: de7f13aa9ace (Cygwin: loadavg: improve debugging of load_init)
> 
> ---
>  winsup/cygwin/loadavg.cc    | 70 ++++++++++++++++++++++++++-----------
>  winsup/cygwin/release/3.5.5 |  3 ++
>  2 files changed, 52 insertions(+), 21 deletions(-)
> 
> diff --git a/winsup/cygwin/loadavg.cc b/winsup/cygwin/loadavg.cc
> index 127591a2e..37da077fb 100644
> --- a/winsup/cygwin/loadavg.cc
> +++ b/winsup/cygwin/loadavg.cc
> [...]
> +    /* Delay a short time so PdhCQD in caller will have data to collect */
> +    Sleep (16/*ms*/); /* let other procs run; one|more yield()s not enough */

Is there a reason you specificially chose 16 msecs here?

I'm asking because the usual clock tick is roughly 15.x msecs.
Any Sleep() > 0 but < 16 results in a sleep of a single clock tick, i.e.,
15 ms.  Occassionally 2 ticks, ~31 msecs, 1 to 5 out of 100 runs.

If you choose a value of 15 msecs, the probability of a Sleep() taking
two ticks is much higher and can be 1 out of 2 Sleep().

If you choose a value of 16 msecs, all Sleep() invocations will run
at least 2 clock ticks.


Thanks,
Corinna

Reply via email to