load average calculation failing -- fixed by Windows update

Mark Geisert mark@maxrnd.com
Tue May 17 19:48:37 GMT 2022


Jon Turney wrote:
> On 13/05/2022 12:05, Corinna Vinschen wrote:
>> On May 13 13:04, Corinna Vinschen wrote:
>>> On May 13 11:34, Jon Turney wrote:
>>>> On 12/05/2022 10:48, Corinna Vinschen wrote:
>>>>> On May 11 16:40, Mark Geisert wrote:
>>>>>>
>>>>>> The first counter read now gets error 0xC0000BC6 == PDH_INVALID_DATA, but no
>>>>>> errors on subsequent counter reads.  This sounds like it now matches what
>>>>>> Corinna reported for W11.  I wonder if she's running build 1706 already.
>>>>>
>>>>> Erm... looks like I didn't read your mail throughly enough.
>>>>>
>>>>> This behaviour, the first call returning with PDH_INVALID_DATA and only
>>>>> subsequent calls returning valid(?) values, is what breaks the
>>>>> getloadavg function and, consequentially, /proc/loadavg.  So maybe xload
>>>>> now works, but Cygwin is still broken.
>>>>
>>>> The first attempt to read '% Processor Time' is expected to fail with
>>>> PDH_INVALID_DATA, since it doesn't have a value at a particular instant, but
>>>> one averaged over a period of time.
>>>>
>>>> This is what the following comment is meant to record:
>>>>
>>>> "Note that PDH will only return data for '% Processor Time' after the second
>>>> call to PdhCollectQueryData(), as it's computed over an interval, so the
>>>> first attempt to estimate load will fail and 0.0 will be returned."
>>>
>>> But.
>>>
>>> Every invocation of getloadavg() returns 0.  Even under load.  Calling
>>> `cat /proc/loadavg' is an excercise in futility.
>>>
>>> The only way to make getloadavg() work is to call it in a loop from the
>>> same process with a 1 sec pause between invocations.  In that case, even
>>> a parallel `cat /proc/loadavg' shows the same load values.
>>>
>>> However, as soon as I stop the looping process, the /proc/loadavg values
>>> are frozen in the last state they had when stopping that process.
>>
>> Oh, and, stopping and restarting all Cygwin processes in the session will
>> reset the loadavg to 0.
>>
>>> Any suggestions how to fix this?
> 
> Ah, right.  'while true ; do cat /proc/loadavg ; done', just shows a stream of 
> zeroes, because each process only calls getloadavg() once, which doesn't update 
> the loadavg, because the first call to fetch it fails PDH_INVALID_DATA.
> 
> This isn't really simply fixable because PDH "handles" aren't shareable between 
> processes.
> 
> I don't think this is new since it is mentioned in [1].
> 
> Non-solution: use top instead :)
> 
> [1] https://cygwin.com/pipermail/cygwin-patches/2017q1/008699.html

I think my starting the "imperfections" thread only fractured the discussion :-(. 
The patch I mention in the other thread improves this repeated cat /proc/loadavg 
display, if nothing else.  It throws away that first sample that errors.

~ while true; do cat /proc/loadavg; done
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.00 0.00 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.08 0.01 0.00 1/10
0.07 0.01 0.00 1/10
0.07 0.01 0.00 1/10
0.07 0.01 0.00 1/10
...

..mark



More information about the Cygwin-developers mailing list